Iphone 寻找最接近的纬度匹配&;纬度/经度列表中的经度

Iphone 寻找最接近的纬度匹配&;纬度/经度列表中的经度,iphone,ios,objective-c,location,Iphone,Ios,Objective C,Location,我正在为特定地点创建一个带有天气查询功能的iPhone应用程序,我有一个问题,我不确定最好的解决方法 我有一个位置的纬度和经度,希望从5000多个位置的列表中找到最近的纬度/经度匹配 5000多个位置来自Met Office Datapoint API的JSON提要,以NSDictionary的NSArray形式存在,NSDictionary包括id、lat、long和name 我想将我的位置与Met Office列表中最近的位置相匹配,并获取id键值 事先非常感谢我建议如下: NSMutabl

我正在为特定地点创建一个带有天气查询功能的iPhone应用程序,我有一个问题,我不确定最好的解决方法

我有一个位置的纬度和经度,希望从5000多个位置的列表中找到最近的纬度/经度匹配

5000多个位置来自Met Office Datapoint API的JSON提要,以NSDictionary的NSArray形式存在,NSDictionary包括id、lat、long和name

我想将我的位置与Met Office列表中最近的位置相匹配,并获取id键值


事先非常感谢

我建议如下:

NSMutableArray *tempArray = [NSMutableArray new];
for (NSMutableDictionary *location in yourArrayOfLocations){
    CLLocation coord;
    coord.latitude = [location objectForKey:@"latitude"];
    coord.longitude = [location objectForKey:@"longitude"];

    [location setValue:[usersLocation distanceFromLocation:coord] forKey:@"distance"];
    [tempArray addObject:location];
}
// Now sort the array 
NSArray *sortedArray = [tempArray sortedArrayUsingComparator:^(id o1, id o2) {
            NSDictionary *location1 = (NSDictionary *)o1;
            NSDictionary *location2 = (NSDictionary *)o2;

            return [[location1 objectForKey:@"distance"] compare:[location2 objectForKey:@"distance"]];
        }];
[tempArray release];
现在有了一个按距离排序的数组。您可以使用索引0处的对象,因为它最接近用户的位置


祝你好运

我假设您在这个

- (CLLocation*)closestLocationToLocation:(CLLocation*)currLocation
{
    CLLocationDistance minDistance;

    CLLocation *closestLocation = nil;

    for (CLLocation *location in arrayOfLocations) {
        CLLocationDistance distance = [location distanceFromLocation:currLocation];

        if (distance <= minDistance
            || closestLocation == nil) {
            minDistance = distance;
            closestLocation = location;
        }
    }

    //closestLocation is now the location from your array which is closest to the current location or nil if there are no locations in your array.

    return closestLocation;

}
-(CLLocation*)closestLocationToLocation:(CLLocation*)currLocation
{
CLLOCATION距离、思维距离;
CLLocation*closestLocation=nil;
用于(CLLocation*阵列中的位置){
CLLocationDistance距离=[location distanceFromLocation:currLocation];

如果(距离我做了一次类似的事情(找到一个具有最大半径的点周围的所有lat/lon对象),并使用此处给出的公式: 然而,这相当耗时。因此我先将对象“装箱”。根据上面的计算(当然恢复),我计算出了具有最大距离的北、西、南和东坐标的纬度和经度。使用软管最大值和最小值(用于lat和lon)我查询了所有有问题的对象,只对那些我计算了精确距离并将它们包括在结果列表中或排除在外的对象

然而,到目前为止,这并不完全符合你的问题。但我试图进一步加快计算。为此,我对自己说,我不需要从搜索对象到我的对象的确切距离,但它是否比一个框坐标更近是不可能的。而这一部分正好符合你的问题stion:

您的案例可能会简单得多。假设所讨论的位置(最短的一次)如果离你试图分配的位置很近,所有这些复杂的数学可能都不起作用。你不需要精确的距离。你需要的是最舒适的距离。为此,我假设地球是平的,经度(或纬度)之间的距离这当然不是真的,但应该能够很好地找出哪一个是最接近的。 从那里你可以使用毕达哥拉斯

Distance = sqrt(sqr(difference-in-lat) + sqr(difference-in-lon));
仅仅为了比较距离并找到最短的距离,您甚至可以用更快的sqare操作替换耗时的方形路线

Square-Of-Distance = sqr(difference-in-lat) + sqr(difference-in-lon).
然后比较不同的距离平方,而不是距离。结果是一样的,但要快得多


顺便说一句,这是一个PHP项目。这就是为什么我不能提供示例代码,而只是解释算法。

只是好奇:为什么不使用CLLocation的内置distanceFromLocation:方法,该方法考虑曲率而不是2D距离公式?我没有使用它,因为我不知道它的存在:D将相应地编辑代码,谢谢:DJust got old版正在进行一些快速测试,现在将实现这个新版本。感谢@Annakarena&Fogmeister的更新。有没有更好的方法来执行CLLocationDistance minDistance=9999999;这似乎有点过时了……这看起来好一点。感谢您的时间回复。这不是一个好主意,会给出错误的结果。lat和long没有相同的标度,在48度纬度上,你有一个cos(48)的失真,在纬度上约为0,66,它们在全球范围内没有相同的标度。其想法是,在被比较的对象靠近的区域,标度足够相似,以便提供精确的距离比较(没有绝对值,只是比较)。由于从一个角度到下一个角度的差异非常小(除了靠近极点的区域),一个“两度远”的点总是比一个“一度远”。即使是几分钟也没关系。日期行上还有另一个问题,但用一个“如果”就很容易解决。谢谢你花时间回复。