如何获取MKPointAnnotation的路线

时间:2014-05-06 16:41:49

标签: ios objective-c mkmapview mkmapitem 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的{​​{1}}。

所以问题是我如何从MKDirectionsRequest获得CLPacemark,或者是否有不同的方法来获得没有该要求的单点指示?感谢

3 个答案:

答案 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的坐标上使用反向地理编码,以获得MKPointAnnotationThis 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是一个协议,没有什么可以说你不能在后台模型中添加一个属性)。