我正在创建一个iPhone应用程序,该应用程序具有特定位置的天气查询功能,我遇到了以下问题,我不确定解决的最佳方法。
我有一个位置的纬度和经度,想从5000多个位置的列表中找到最接近的纬度/经度匹配
5000+个位置来自Met Office Datapoint API的JSON提要,采用NSDictionary的NSArray形式,NSDictionarys包括id、lat、long和name。
我想将我的位置与英国气象局列表中最近的位置匹配,并获取id键值。
非常感谢提前
我假设您在这个。。。
- (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函数
我做过一次类似的事情(找到围绕最大半径点的所有lat/lon对象),并使用了这里给出的公式:http://www.movable-type.co.uk/scripts/latlong.html然而,这相当耗时。所以我有点"拳击"的对象拳头。根据上面的计算(当然是反过来的),我计算出了北、西、南和东坐标的经纬度,这些坐标恰好具有最大距离。使用软管的最大值和最小值(lat和lon),我查询了所有有问题的对象。只有那些我计算出确切距离并将其包含在结果列表中或排除在外的人。
然而,到目前为止,这并不完全符合您的问题。但我试着进一步加紧计算。为此,我对自己说,我不需要从搜索对象到我的对象的确切距离,但很难知道它是否比其中一个框的坐标更近。这部分与你的问题非常吻合:
你的案子会容易得多。假设有问题的位置(最短的一次)靠近你试图分配的一个位置,所有这些复杂的数学可能都不会起作用。你不需要确切的距离。你需要的是cosest。为此,我假设地球是平的,经度(或纬度)之间的距离是线性的。当然,这不是真的,但应该足以弄清楚其中哪一个最接近。从那里你可以使用毕达哥拉斯。
Distance = sqrt(sqr(difference-in-lat) + sqr(difference-in-lon));
仅仅为了比较距离并找到最短的距离,你甚至可以用更快的平方运算取代耗时的平方运算。
Square-Of-Distance = sqr(difference-in-lat) + sqr(difference-in-lon).
然后比较各种"距离平方",而不是"距离"。结果是一样的,但要快得多。
顺便说一句,那是一个PHP项目。这就是为什么我不能提供示例代码,只能解释算法。
我建议这样做:
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处的对象,因为它最接近用户的位置。
祝你好运!