2

現在、iPhone/iPad用のロケーションベースのアプリケーションに取り組んでいます。MapKitにいくつかの注釈があります。私がやりたいのは、ユーザーの位置を追跡し、3km以内にある注釈を表示することです。誰かが私にスタートを与えることができますか?

4

1 に答える 1

1

応答が遅れてすみません...質問は私のレーダーから外れました。

NSValueでラップされた構造体のセットを返すメソッドがあると仮定しますCLLocationCoordinate2D(基本的なアプローチは、内部データ表現が何であるかに関係なく同じです)。次に、次のような方法を使用してリストをフィルタリングできます(警告:ブラウザに入力)。

NSSet *locations = ...;
CLLocation centerLocation = ...; // Reference location for comparison, maybe from CLLocationManager
CLLocationDistance radius = 3000.; // Radius in meters
NSSet *nearbyLocations = [locations objectsPassingTest:^(id obj, BOOL *stop) {
        CLLocationCoordinate2D testCoordinate;
        [obj getValue:&testCoordinate];
        CLLocation *testLocation = [[CLLocation alloc] initWithLatitude:testCoordinate.latitude
                                                              longitude:testCoordinate.longitude];
        BOOL returnValue = ([centerLocation distanceFromLocation:testLocation] <= radius);
        [testLocation release];
        return returnValue;
    }
];

フィルタリングされた座標のセットが手元にあれば、 AppleのドキュメントMKAnnotationで説明されているように、通常の方法でインスタンスを作成してマップに追加できます。

何千ものテスト場所がある場合、このアプローチではパフォーマンスの問題が発生し始める可能性があると思います。次に、ポイントストレージのアプローチを切り替えて、たとえばクワッドツリーを使用して、精密にフィルタリングする必要のあるポイントの数を減らすことができます。ただし、時期尚早に最適化しないでください。

お役に立てば幸いです。

于 2012-07-06T00:26:55.423 に答える