我创建了一个地图,它有一个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
,但是我需要访问MKDirectionsRequest
上的setDestination
的CLPlacemark
。
所以问题是我如何从MKPointAnnotation
中得到CLPacemark
,或者有没有一种不同的方法可以在没有这个要求的情况下获得到单个点的方向?由于
对于指示请求,MKMapItem
需要MKPlacemark
(而不是CLPlacemark
)。
您可以使用initWithCoordinate:addressDictionary:
方法直接从坐标创建MKPlacemark
。
MKPlacemark *mkDest = [[MKPlacemark alloc]
initWithCoordinate:pointAnnotation.coordinate
addressDictionary:nil];
[request setDestination:[[MKMapItem alloc] initWithPlacemark:mkDest]];
MKPointAnnotation
将给出坐标,您可以将其放入CLPlacemark
的location.coordinate
中。我不认为MKPointAnnotation中有任何其他容易获得的信息可以在CLPlacemark
中使用。
MKPointAnnotation *annotation = ...;
CLPlacemark *placemark = ...;
placemark.location.coordinate = annotation.coordinate;
编辑:抱歉,我没有意识到CLPlacemark
基本上是只读的。话虽如此,您可以在MKPointAnnotation
的坐标上使用反向地理代码以获得CLPlacemark
。这个链接有关于如何反向地理编码从CLLocation
获取CLPlacemark
(填充位置)的信息。
您需要使用MKPointAnnotation的坐标属性,然后使用反向地理编码通过CLGeocoder获得CLPlacemark。
编辑:一些示例代码。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
}];
否则,您需要缓存CLPlacemark,如果您喜欢,您可以在注释数据源上这样做(记住MKAnnotation是一个协议,没有什么说您不能向支持模型添加属性)。