Как рассчитать расстояние от местоположения пользователя до аннотации при перемещении пользователя

У меня есть местоположение пользователя (синяя точка) и аннотации на mapView. Когда аннотация выбрана, я устанавливаю текст на distLabel - «Расстояние до точки% 4.0f м.». Как я могу обновить эту текстовую метку при перемещении пользователя?

сделалSelectAnnotationView:

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{

    CLLocation *pinLocation = 
      [[CLLocation alloc] initWithLatitude:
                        [(MyAnnotation*)[view annotation] coordinate].latitude 
                                 longitude:
                        [(MyAnnotation*)[view annotation] coordinate].longitude];
    CLLocation *userLocation = 
      [[CLLocation alloc] initWithLatitude:
                          self.mapView.userLocation.coordinate.latitude             
                                 longitude:
                                 self.mapView.userLocation.coordinate.longitude];        
    CLLocationDistance distance = [pinLocation distanceFromLocation:userLocation];

    [distLabel setText: [NSString stringWithFormat:@"Distance to point %4.0f m.",    
                                                     distance]];
}

Я знаю, что есть функция didUpdateToLocation, но как мне ее использовать с didSelectAnnotationView?

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
  //Did update to location
}

person Pavel Kaljunen    schedule 04.06.2012    source источник


Ответы (1)


Представление карты имеет свойство selectedAnnotations, которое можно использовать в методе didUpdateToLocation, чтобы указать, от какой аннотации получить расстояние.

(Кстати, если вы используете userLocation представления карты, вы можете захотеть использовать метод didUpdateUserLocation делегата представления карты вместо didUpdateToLocation, который является методом делегата CLLocationManager.)

В методе делегата вы можете проверить, есть ли какая-либо выбранная в данный момент аннотация, и, если да, показать расстояние до этой аннотации (в противном случае скажите «аннотация не выбрана»).

Возможно, вы захотите написать общий метод, который можно вызывать как из didSelectAnnotationView, так и из didUpdateUserLocation, чтобы уменьшить дублирование кода.

Например:

-(void)updateDistanceToAnnotation:(id<MKAnnotation>)annotation
{
    if (annotation == nil) 
    {
        distLabel.text = @"No annotation selected";
        return;
    }

    if (mapView.userLocation.location == nil) 
    {
        distLabel.text = @"User location is unknown";
        return;
    }

    CLLocation *pinLocation = [[CLLocation alloc] 
        initWithLatitude:annotation.coordinate.latitude
               longitude:annotation.coordinate.longitude];

    CLLocation *userLocation = [[CLLocation alloc] 
        initWithLatitude:mapView.userLocation.coordinate.latitude 
               longitude:mapView.userLocation.coordinate.longitude];

    CLLocationDistance distance = [pinLocation distanceFromLocation:userLocation];

    [distLabel setText: [NSString stringWithFormat:@"Distance to point %4.0f m.", distance]];
}

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    if (mapView.selectedAnnotations.count == 0)
        //no annotation is currently selected
        [self updateDistanceToAnnotation:nil];
    else
        //first object in array is currently selected annotation
        [self updateDistanceToAnnotation:[mapView.selectedAnnotations objectAtIndex:0]];
}

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{    
    [self updateDistanceToAnnotation:view.annotation];
}
person Community    schedule 04.06.2012
comment
Отличный ответ, как всегда от вас! Спасибо! - person Pavel Kaljunen; 04.06.2012