0

我创建了一个地图,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.setDestinationMKDirectionsRequest

所以问题是我如何CLPacemark从 a 中获得 a MKPointAnnotation,或者是否有不同的方法可以在没有该要求的情况下获得指向单点的方向?谢谢

4

3 回答 3

6

对于方向请求,MKMapItem需要一个MKPlacemark(不是 a CLPlacemark)。

您可以使用其方法MKPlacemark直接从坐标创建一个。initWithCoordinate:addressDictionary:

例如:

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

[request setDestination:[[MKMapItem alloc] initWithPlacemark:mkDest]];
于 2014-05-06T23:14:09.427 回答
0

MKPointAnnotation会给你坐标,你可以把它放进CLPlacemark's location.coordinate。我认为 MKPointAnnotation 中不会有任何其他现成可用的信息可以在CLPlacemark.

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

placemark.location.coordinate = annotation.coordinate;

编辑:抱歉,我没有意识到CLPlacemarks 在很大程度上是只读的。话虽如此,您可以在您的坐标上使用反向地理编码MKPointAnnotation以获得CLPlacemark. 此链接包含有关如何反向地理编码以获取您CLPlacemark的信息CLLocation(使用您的 annotation.coordinate 填充 location.coordinate)来查找方向的信息。

于 2014-05-06T16:49:55.073 回答
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 是一个协议,没有什么说您不能向支持模型添加属性)。

于 2014-05-06T16:57:52.143 回答