2010-05-07 49 views
4

我正在使用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]; 

我想获取已排序的对象,而不是获取它们,然后在代码中进行排序。

任何提示赞赏。

回答

5

NSSortDescriptor应该用对象属性的键字符串初始化,而不是查询字符串。这意味着你应该把你的距离公式作为你的对象的一种方法。

这样做之后,它其实并不重要,如果你排序之前或之后获取:

NSArray *result = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error]; 
result = [result sortedArrayUsingSelector:@"compareDistance"]; 

另一点。您的距离公式无法正常工作,如经纬度。和长。没有相同的比例,除非你在赤道上。使用这样的:如果距离超过几百多公里

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; 
+0

你可以张贴反正很长的距离公式?先谢谢你。 – 2010-05-07 12:51:00

+0

谢谢你不可饶恕。我在答案中加入了公式。 – mohsenr 2010-05-08 10:00:21