2

2つの属性で定義されたコアデータモデルがあります

  • (ダブル)緯度
  • (ダブル)経度

ここで、これらのオブジェクトをフェッチし、ユーザーの現在の場所と比較した距離に応じて並べ替えたいと思います。現在地を取得する方法はすでに知っていますが、それでも理解できないのは、2つの属性に応じて結果を並べ替える方法です。

似たようなものを探しましたが、まだ少し混乱しています。

誰かが私を正しい方向に向けることができれば、それは素晴らしいことです。

ありがとう

4

3 に答える 3

3

コンパレータブロックによるソートは非常に簡単です

NSArray *positions = //all fetched positions
CLLocation *currentLocation   = // You said that you know how to get this.


positions = [positions sortedArrayUsingComparator: ^(id a, id b) {
    CLLocation *locationA    = [CLLocation initWithLatitude:a.latitude longitude:a.longitude];
    CLLocation *locationB    = [CLLocation initWithLatitude:b.latitude longitude:b.longitude];
    CLLocationDistance dist_a= [locationA distanceFromLocation: currentLocation];
    CLLocationDistance dist_b= [locationB distanceFromLocation: currentLocation];
    if ( dist_a < dist_b ) {
        return (NSComparisonResult)NSOrderedAscending;
    } else if ( dist_a > dist_b) {
        return (NSComparisonResult)NSOrderedDescending;
    } else {
        return (NSComparisonResult)NSOrderedSame;
    }
}

lnafzigerから学んだばかりですが、彼が示している便利なハック/回避策¹をこれに追加する必要があります。


¹この言葉からあなたにとって最もポジティブな意味を持つものを選んでください

于 2012-05-27T20:29:36.777 に答える
2

おそらく、長い/緯度のペアをポイント間の地理的距離に変換してから、その単一の属性で並べ替えることができます。

受け入れたい近似に応じて、いくつかの変換方法に関する記事があります:http: //en.wikipedia.org/wiki/Geographical_distance

于 2012-05-27T19:47:54.800 に答える
2

まあ、できません。

とにかく、lat/longを単独でソートするだけではありません。:)

現在地からの距離を含むプロパティが必要になります。これを行うには、必要に応じて計算される一時的なプロパティを追加するか、距離を使用して別の配列を作成します(おそらく簡単です)。

現在地からの距離を計算するには、次の方法を使用します。

CLLocation *currentLocation   = // You said that you know how to get this.
CLLocation *storedLocation    = [CLLocation initWithLatitude:object.latitude 
                                                   longitude:object.longitude];
/*
 * Calculate distance in meters
 * Note that there is a bug in distanceFromLocation and it gives different
 * values depending on whether you are going TO or FROM a location. 
 * The correct distance is the average of the two:
 */
CLLocationDistance *distance1 = [currentLocation distanceFromLocation:storedLocation];
CLLocationDistance *distance2 = [storedLocation distanceFromLocation:currentLocation];
CLLocationDistance *distance  = distance1 / 2 + distance2 / 2;
于 2012-05-27T19:54:00.760 に答える