我在当前用户位置和地图上的某个点之间创建了一条路径。我可以从MKRoute那里得到方向的指示。问题是:我如何才能检测到在下一个十字路口需要左转或右转?它应该看起来像这样:“在下一个十字路口左转”。我很高兴在Swift或Objective C中看到解决方案。
发布于 2017-10-31 03:52:45
你可以用下面的代码做到这一点
MKDirections *directions = [[MKDirections alloc] initWithRequest:request];
[directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {
if (!error) {
for (MKRoute *route in [response routes]) {
[myMapView 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.
}
}
}];
通过不同的MKRoute
属性来获取您想要的内容。
发布于 2017-10-31 07:13:41
您将看到您的自定义注释,其中显示了mapView上的源和目标坐标。
现在到了两个注解之间的方向。
点击此链接:- https://developer.apple.com/documentation/mapkit/mkroute
MKRoute对象定义管线的几何图形-即,它包含与特定地图坐标关联的线段。路线对象还可以包括其他信息,例如路线名称、路线距离和预期行进时间。例如,一个步骤可能涉及沿着一条道路行驶,直到需要转弯。
在您的viewController.m类中添加以下代码。
-(void)viewDidAppear:(BOOL)animated
{
MKPlacemark *source = [[MKPlacemark alloc]initWithCoordinate:sourceCoordinate.coordinate addressDictionary:[NSDictionary dictionaryWithObjectsAndKeys:@"",@"", nil] ];
MKMapItem *sourceMapItem = [[MKMapItem alloc]initWithPlacemark:source];
MKPlacemark *destination = [[MKPlacemark alloc]initWithCoordinate:destinationCoordinate.coordinate addressDictionary:[NSDictionary dictionaryWithObjectsAndKeys:@"",@"", nil] ];
MKMapItem *distMapItem = [[MKMapItem alloc]initWithPlacemark:destination];
MKDirectionsRequest *request = [[MKDirectionsRequest alloc]init];
[request setSource:sourceMapItem];
[request setDestination:distMapItem];
[request setTransportType:MKDirectionsTransportTypeAutomobile];
MKDirections *direction = [[MKDirections alloc]initWithRequest:request];
[direction calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse *response, NSError *error) {
if (!error) {
for (MKRoute *route in [response routes]) {
[_mMapView addOverlay:[route polyline] level:MKOverlayLevelAboveRoads];
}
}
}];
}
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id)overlay
{
if ([overlay isKindOfClass:[MKPolyline class]]) {
MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithOverlay:overlay];
[renderer setStrokeColor:[UIColor redColor]];
[renderer setLineWidth:3.0];
return renderer;
}
return nil;
}
对于Swift
更新
override func viewDidLoad() {
super.viewDidLoad()
let request = MKDirectionsRequest()
request.source = MKMapItem(placemark: MKPlacemark(coordinate: CLLocationCoordinate2D(latitude:"", longitude: ""), addressDictionary: nil))
request.destination = MKMapItem(placemark: MKPlacemark(coordinate: CLLocationCoordinate2D(latitude: "", longitude: ""), addressDictionary: nil))
request.requestsAlternateRoutes = true
request.transportType = .automobile
let directions = MKDirections(request: request)
directions.calculate { [unowned self] response, error in
guard let unwrappedResponse = response else { return }
for route in unwrappedResponse.routes {
self.mapView.add(route.polyline)
self.mapView.setVisibleMapRect(route.polyline.boundingMapRect, animated: true)
}
}
}
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
let renderer = MKPolylineRenderer(polyline: overlay as! MKPolyline)
renderer.strokeColor = UIColor.blue
return renderer
}
https://stackoverflow.com/questions/47023052
复制相似问题