Как проложить маршрут к 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;
Редактировать: извинения, я не понял, что CLPlacemark
s в основном только для чтения. При этом вы можете использовать обратный геокод по координатам вашего 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 - это протокол, нет ничего, говорящего о том, что вы не можете добавить свойство в базовую модель).