2

我正在为特定位置创建一个带有天气查找功能的 iPhone 应用程序,但我有以下问题,我不确定解决的最佳方法。

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

5000 多个位置来自 Met Office Datapoint API 的 JSON 提要,并采用 NSDictionaries 的 NSArray 形式,NSDictionary 包括 id、lat、long 和 name。

我想将我的位置与气象局列表中最近的位置相匹配,并获取 id 键值。

提前谢谢了

4

3 回答 3

3

我假设您在此使用 CLLocation 对象...

- (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 功能

于 2013-02-06T11:28:12.450 回答
0

我做过一次类似的事情(找到一个最大半径的点周围的所有纬度/经度对象)并使用此处给出的公式: http ://www.movable-type.co.uk/scripts/latlong.html 但是,那是相当耗时的。所以我有点“装箱”了对象的拳头。基于上面的计算(当然恢复),我计算了那些坐标的纬度和经度,这些坐标的北、西、南和东正好具有最大距离。使用软管最大值和最小值(对于纬度和经度),我查询了所有有问题的对象。并且仅针对那些我计算了确切距离并将它们包含在结果列表中或排除它们的人。

但是,到目前为止,这并不完全符合您的问题。但我试图进一步加快计算。为此,我对自己说,我不需要从搜索对象到我的确切距离,但知道它是否比其中一个框坐标更近就足够了。那部分与您的问题非常吻合:

你的情况可能会容易得多。假设有问题的位置(最短的一次)靠近您尝试分配的一个位置,那么所有这些复杂的数学运算可能都不起作用。您不需要确切的距离。你需要的是最昂贵的。为此,我假设地球是平的,并且经度(或纬度)之间的距离是线性的。这当然不是真的,但应该足以弄清楚其中哪一个是最接近的。从那里你可以使用毕达哥拉斯。

Distance = sqrt(sqr(difference-in-lat) + sqr(difference-in-lon));

仅出于比较距离和找到最短距离的目的,您甚至可以用更快的平方操作代替耗时的平方路线。

Square-Of-Distance = sqr(difference-in-lat) + sqr(difference-in-lon).

然后比较各种Square-Of-Distance而不是Distance。结果将是相同的,但要快得多。

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

于 2013-02-06T11:34:32.903 回答
-1

我建议这样的事情:

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 处的对象,因为它最接近用户的位置。

祝你好运!

于 2013-02-06T11:28:04.270 回答