如何按最近的距离排列对象数组(纬度,经度)?
我有一个从核心数据的数组,我想我怎么能sorting数组的距离最近的距离:
for (int i=0; i<allTasks.count; i++) { id singleTask = allTasks[i]; double latitude = [singleTask[@"latitude"] doubleValue]; double longitude = [singleTask[@"longitude"] doubleValue]; }
编辑:当前位置和数组中所有位置之间的距离。 我知道如何计算距离,我不知道如何sorting。
-
获取你的currentPosition的CLLocation(这是通过CLLocationManager完成的)
-
计算每个项目的距离并将距离+项目存储为字典中的Pair
-
用比较:select器sorting字典allKeys数组
所以
CLLocation *current = ...; NSMutableDictionary *distsAndTasks [NSMutableDictionary dictionary]; for(id task in allTasks) { CLLocation *taskLoc = [[CLLocation alloc] initWithLatitude:task.lat longitude:task.long];//! CLLocationDistance dist = [taskLoc distanceFrom:current]; if(distsAndTasks[@(dist)]) { NSMutableArray *equidstants = [distsAndTasks[@(dist)] mutableCopy]; [equidstants addObject:task]; distsAndTasks[@(dist)] = equidstants; } else { distsAndTasks[@(dist)] = @[task]; } } NSArray *sortedDists = [distsAndTasks.allKeys sortedArrayUsingSelector:@selector(compare:)]; //the tasks can now be access in a sorted way for(NSNumber *dist in sortedDists) { NSArray *tasksAtDistance = distsAndTasks[dist]; NSLog(@"%@", tasksAtDistance); }
那么你想sorting你的allTasks数组?
最好的办法是将一个距离键/值对添加到每个singleTask对象,持有一个双重的NSNumber。
在第一遍中,循环访问allTasks数组,获取每个经纬度,使用它创build一个CLLocation,并使用CLLocation方法distanceFromLocation:计算每个位置与目标(当前?)位置之间的距离。 将结果保存到数组中的每个singleTask对象中。
一旦您的allTasks数组包含distance属性,只需使用sortUsingComparator之类的sorting方法就可以根据距离值对数组进行sorting。 (在sortUsingComparator系列方法中,您提供了一个比较器块,系统用来比较objets对,然后在您的数组上运行sortingalgorithm,使用比较器来决定sorting顺序。
你可以像这样计算两点之间的距离
你也可以尝试这个https://stackoverflow.com/a/9104926/3151066,并定义一些计算距离的方法来满足你作为比较运算符