我创建的地图有一个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
的{{1}}。
所以问题是我如何从MKDirectionsRequest
获得CLPacemark
,或者是否有不同的方法来获得没有该要求的单点指示?感谢
答案 0 :(得分:5)
对于路线请求,MKMapItem
需要MKPlacemark
(不是CLPlacemark
)。
您可以使用MKPlacemark
方法直接从坐标创建initWithCoordinate:addressDictionary:
。
例如:
MKPlacemark *mkDest = [[MKPlacemark alloc]
initWithCoordinate:pointAnnotation.coordinate
addressDictionary:nil];
[request setDestination:[[MKMapItem alloc] initWithPlacemark:mkDest]];
答案 1 :(得分:0)
MKPointAnnotation
会为您提供坐标,您可以将其放入CLPlacemark
的{{1}}。我不认为MKPointAnnotation中有任何其他可用的信息可用于location.coordinate
。
CLPlacemark
编辑:道歉,我没有意识到MKPointAnnotation *annotation = ...;
CLPlacemark *placemark = ...;
placemark.location.coordinate = annotation.coordinate;
在很大程度上是只读的。话虽这么说,您可以在CLPlacemark
的坐标上使用反向地理编码,以获得MKPointAnnotation
。 This link包含有关如何进行反向地理编码的信息,以便从CLPlacemark
(填充与您的annotation.coordinate匹配的位置)获取CLPlacemark
以查找路线。
答案 2 :(得分:0)
您需要使用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是一个协议,没有什么可以说你不能在后台模型中添加一个属性)。