3

注釈の配列があります。ユーザーの位置から各注釈間の距離を計算しています。知りたいのは、これらの距離から最も近い 3 つの注釈をどのように見つけることができるかということです。

ユーザーの場所から注釈までの距離を計算する方法は次のとおりです。

  CLLocation *userLocation = self.mapView.userLocation.location;

  for (Annotation *obj in annotations) {

       CLLocation *loc = [[CLLocation alloc] initWithLatitude:obj.coordinate.latitude longitude:obj.coordinate.longitude];
      //  CLLocation *userLocation = [[CLLocation alloc] initWithLatitude:self.mapView.userLocation.coordinate.latitude longitude:self.mapView.userLocation.coordinate.longitude];
        CLLocationDistance dist = [loc distanceFromLocation:userLocation];
        int distance = dist;
        NSLog(@"Distance from Annotations - %i", distance);


    }
4

2 に答える 2

2

userLocation静的であるため、ループのたびに再作成しないでください。次の方法で場所を直接取得することもできます。

CLLocation *userLocation = self.mapView.userLocation.location;

次に、距離の数値と注釈をディクショナリに保存し、距離をキーとして、注釈を値として、次のようなことを行うことができます。ディクショナリが作成されたら、allKeys配列をソートすると、最初の 3 つのキーに関連付けられた注釈を取得できます。


これを実行するときに常に少なくとも 1 つの注釈があると仮定します。

CLLocation *userLocation = self.mapView.userLocation.location;
NSMutableDictionary *distances = [NSMutableDictionary dictionary];

for (Annotation *obj in annotations) {
    CLLocation *loc = [[CLLocation alloc] initWithLatitude:obj.coordinate.latitude longitude:obj.coordinate.longitude];
    CLLocationDistance distance = [loc distanceFromLocation:userLocation];

    NSLog(@"Distance from Annotations - %f", distance);

    [distances setObject:obj forKey:@( distance )];
}

NSArray *sortedKeys = [[distances allKeys] sortedArrayUsingSelector:@selector(compare:)];
NSArray *closestKeys = [sortedKeys subarrayWithRange:NSMakeRange(0, MIN(3, sortedKeys.count))];

NSArray *closestAnnotations = [distances objectsForKeys:closestKeys notFoundMarker:[NSNull null]];
于 2014-03-17T11:01:08.423 に答える