Mkmapview中两个位置之间的多个路由

时间:2017-08-24 06:27:41

标签: ios objective-c mkmapview mkdirection

  •   

    如何在两点之间获得一条或多条可能的路线?如果有人   你可以告诉我吗?

Want like this

2 个答案:

答案 0 :(得分: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];       

答案 1 :(得分:1)

使用MapKit

您需要制作[directionRequest setRequestsAlternateRoutes:YES],然后在response.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)
            }
        }

    }

希望这有帮助