如何在两点之间获得一条或多条可能的路线?如果有人做过这方面的工作,你能告诉我吗?
问问题
1380 次
2 回答
1
用这个 :-
NSString *baseUrl=[NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/directions/json? origin=indore&destination=bhopal&key=%@&alternatives=true”,APIKey];
NSURL *url = [NSURL URLWithString:[baseUrl
stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSURLSessionConfiguration *defaultConfigObject =
[NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:
defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];
NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithURL:url
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if(error == nil)
{
NSDictionary *result= [NSJSONSerialization JSONObjectWithData:data
options:0 error:nil];
// this will return all possible roots
NSArray *routes = [result objectForKey:@"routes"];
//add The polyline between locations.
}
}];
[dataTask resume];
于 2017-08-24T06:46:36.260 回答
1
使用 MapKit
你需要让你的[directionRequest setRequestsAlternateRoutes:YES]
then inresponse.routes
你会得到可用的路线
MKDirectionsRequest
如声明中所定义
open var requestsAlternateRoutes: Bool // if YES and there is more
than one reasonable way to route from source to destination, allow the
route server to return multiple routes. Default is NO.
完整代码
Objective-C
- (void)createRouteFrom:(CLLocationCoordinate2D)from to:(CLLocationCoordinate2D)destination{
if(CLLocationCoordinate2DIsValid(from) && CLLocationCoordinate2DIsValid(destination))
{
MKDirectionsRequest * directionRequest = [[MKDirectionsRequest alloc]init];
[directionRequest setSource:[[MKMapItem alloc] initWithPlacemark:[[MKPlacemark alloc] initWithCoordinate:from]]];
[directionRequest setSource:[[MKMapItem alloc] initWithPlacemark:[[MKPlacemark alloc] initWithCoordinate:destination]]];
[directionRequest setTransportType:MKDirectionsTransportTypeAutomobile];
[directionRequest setRequestsAlternateRoutes:YES];
MKDirections * directions = [[MKDirections alloc] initWithRequest:directionRequest];
[directions calculateDirectionsWithCompletionHandler:^(MKDirectionsResponse * _Nullable response, NSError * _Nullable error) {
if(error == nil)
{
for (MKRoute * rute in response.routes) {
//DO WHAT YOU NEED WITH ROUTE
}
//here I add the first route
MKRoute * firstOne = response.routes.firstObject;
[self.map addOverlay:firstOne.polyline level:MKOverlayLevelAboveRoads];
MKMapRect rect = [firstOne.polyline boundingMapRect];
[self.map setRegion:MKCoordinateRegionForMapRect(rect) animated:YES];
}
}];
}
}
迅速
func createRouteTo(from: CLLocationCoordinate2D,to: CLLocationCoordinate2D) {
if(CLLocationCoordinate2DIsValid(from) && CLLocationCoordinate2DIsValid(to))
{
self.showLoading(message: "Creando Ruta...")
let directionRequest = MKDirectionsRequest()
directionRequest.source = MKMapItem(placemark: MKPlacemark(coordinate: from, addressDictionary: nil))
directionRequest.destination = MKMapItem(placemark: MKPlacemark(coordinate: to, addressDictionary: nil))
directionRequest.transportType = .automobile
//THIS MAKE the request for multiple routes if possible
directionRequest.requestsAlternateRoutes = true
// Calculate the direction
let directions = MKDirections(request: directionRequest)
directions.calculate { [unowned self] (directionResponse, error) in
self.hideLoading(withDelay: 0.1)
guard let response = directionResponse else {
if let error = error {
print("Error: \(error)")
let alert = UIAlertController.init(title:"Error Creando Ruta",
message:error.localizedDescription, preferredStyle: .alert)
alert.addAction(UIAlertAction.init(title: "Aceptar", style: .destructive, handler:nil))
self.present(alert, animated:true , completion:nil)
}
return
}
if(self.currentRouteOverlay != nil)
{
self.mapView.remove(self.currentRouteOverlay!)
}
//in response.routes you will get the routes avaiables
for route in response.routes
{
//Do what you need with the routes
}
//here I add the first to the MapView
let route = response.routes[0]
self.currentRouteOverlay = route.polyline
self.mapView.add(route.polyline, level: .aboveRoads)
let rect = route.polyline.boundingMapRect
self.mapView.setRegion(MKCoordinateRegionForMapRect(rect), animated: true)
}
}
}
希望这可以帮助
于 2017-08-24T07:07:04.310 回答