2010-05-07 87 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