Как проложить маршрут к MKPointAnnotation

Я создал карту, которая имеет MKPointAnnotation которая является единственной точкой на карте (помимо местоположения пользователей). Я пытаюсь разобраться, как изменить какой-то существующий код, чтобы получить указания по вождению к этому моменту.

Это код, который я использую в начале приложения. На этом более раннем этапе приложения у меня есть следующее, которое дает мне CLPlaceMark.

[geocoder geocodeAddressString:location
             completionHandler:^(NSArray* placemarks, NSError* error){
                 if (placemarks && placemarks.count > 0) {
                     CLPlacemark *topResult = [placemarks objectAtIndex:0];

Собирать направления:

MKDirectionsRequest *request = [[MKDirectionsRequest alloc] init];
                         [request setSource:[MKMapItem mapItemForCurrentLocation]];
                         MKPlacemark *mkDest = [[MKPlacemark alloc] initWithPlacemark:topResult];
                         [request setDestination:[[MKMapItem alloc] initWithPlacemark:mkDest]];
                         [request setTransportType:MKDirectionsTransportTypeWalking]; // This can be limited to automobile and walking directions.
                         [request setRequestsAlternateRoutes:NO]; 
                         MKDirections *directions = [[MKDirections alloc] initWithRequest:request];
                         [directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {
                             if (!error) {
                                 for (MKRoute *route in [response routes]) {
                                     [self.mapView addOverlay:[route polyline] level:MKOverlayLevelAboveRoads]; // Draws the route above roads, but below labels.
                                     // You can also get turn-by-turn steps, distance, advisory notices, ETA, etc by accessing various route properties.
                                 }
                             }
                         }];

вопрос
Проблема в том, что позже я, кажется, смогу получить доступ только к self.mapView.annotations, Так что у меня есть доступ к MKPointAnnotation, но мне нужен доступ к CLPlacemark для setDestination на MKDirectionsRequest,

Так что вопрос в том, как мне получить CLPacemark из MKPointAnnotationИли существует другой подход к получению маршрутов в одну точку без этого требования? Спасибо

3 ответа

Решение

For the directions request, the MKMapItem нужен MKPlacemark (не CLPlacemark).

Вы можете создать MKPlacemark directly from coordinates using its initWithCoordinate:addressDictionary: метод.

Например:

MKPlacemark *mkDest = [[MKPlacemark alloc] 
                          initWithCoordinate:pointAnnotation.coordinate 
                           addressDictionary:nil];

[request setDestination:[[MKMapItem alloc] initWithPlacemark:mkDest]];

MKPointAnnotation даст вам координату, которую вы можете положить в CLPlacemark"s location.coordinate, Я не думаю, что в MKPointAnnotation будет какая-либо другая легкодоступная информация, которую можно было бы использовать в CLPlacemark,

MKPointAnnotation *annotation = ...;
CLPlacemark *placemark = ...;

placemark.location.coordinate = annotation.coordinate;

Редактировать: извинения, я не понял, что CLPlacemarks в основном только для чтения. При этом вы можете использовать обратный геокод по координатам вашего MKPointAnnotation для того, чтобы получить CLPlacemark, Эта ссылка содержит информацию о том, как использовать обратный геокод, чтобы получить CLPlacemark из CLLocation (заполните location.coordinate с помощью annotation.coordinate), чтобы найти направления.

Вам необходимо использовать свойство координаты MKPointAnnotation, а затем получить CLPlacemark через CLGeocoder, используя обратный геокод.

РЕДАКТИРОВАТЬ: некоторые примеры кода.

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

CLGeocoder *geocoder = [CLGeocoder new];

[geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemark, NSError *error){
    // Grab the placemark   
}];

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

Другие вопросы по тегам