我正在使用使用CoreData的应用。存在包含纬度和经度值的位置实体。我想获取按距离排序到用户位置的实体。 我试图将排序描述符设置为距离公式sqrt((x1 - x2)^ 2 +(y1 - y2)^ 2)但是它失败,但是“... keypath ...在实体中找不到”。
NSString *distanceFormula = [NSString stringWithFormat:@"sqrt(((latitude - %f) * (latitude - %f)) + ((longitude - %f) * (longitude - %f)))",
location.coordinate.latitude,
location.coordinate.latitude,
location.coordinate.longitude,
location.coordinate.longitude];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:distanceFormula ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
NSError *error;
NSArray *result = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
我想获取已排序的对象,而不是全部获取它们,然后在代码中进行排序。
任何提示赞赏。
答案 0 :(得分:5)
NSSortDescriptor
,而不是查询字符串。这意味着你应该将距离公式作为对象的一种方法。
执行此操作后,如果您在提取之前或之后进行排序并不重要:
NSArray *result = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
result = [result sortedArrayUsingSelector:@"compareDistance"];
另一点。您的距离公式无法正常工作,如lat。而且很长。没有相同的比例,除非你在赤道上。使用此:
double latDiff = lat1-lat2;
double longDiff = (long1-long2)*cos(lat1); //cos() assumes lat1 is in radians
double distance = sqrt(latDiff*latDiff+longDiff*longDiff);
如果距离超过几百公里,则需要Spherical cosines law:
// assuming angles in radian,
double separation = acos( sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2)*cos(long1-long2) );
double distance = separation*earthRadius;