Drawing Route Between Two Places on GMSMapView in iOS
`first get all points coordinates which are coming in route then add these points latitude and longitude in path in will draw path according to that`GMSCameraPosition *cameraPosition=[GMSCameraPosition cameraWithLatitude:18.5203 longitude:73.8567 zoom:12];_mapView =[GMSMapView mapWithFrame:CGRectZero camera:cameraPosition];_mapView.myLocationEnabled=YES;GMSMarker *marker=[[GMSMarker alloc]init];marker.position=CLLocationCoordinate2DMake(18.5203, 73.8567);marker.icon=[UIImage imageNamed:@"aaa.png"] ;marker.groundAnchor=CGPointMake(0.5,0.5);marker.map=_mapView;GMSMutablePath *path = [GMSMutablePath path]; [path addCoordinate:CLLocationCoordinate2DMake(@(18.520).doubleValue,@(73.856).doubleValue)];[path addCoordinate:CLLocationCoordinate2DMake(@(16.7).doubleValue,@(73.8567).doubleValue)];GMSPolyline *rectangle = [GMSPolyline polylineWithPath:path];rectangle.strokeWidth = 2.f;rectangle.map = _mapView;self.view=_mapView;
I've written the following code which should do the trick for you:
- (void)drawRoute{ [self fetchPolylineWithOrigin:myOrigin destination:myDestination completionHandler:^(GMSPolyline *polyline) { if(polyline) polyline.map = self.myMap; }];}- (void)fetchPolylineWithOrigin:(CLLocation *)origin destination:(CLLocation *)destination completionHandler:(void (^)(GMSPolyline *))completionHandler{ NSString *originString = [NSString stringWithFormat:@"%f,%f", origin.coordinate.latitude, origin.coordinate.longitude]; NSString *destinationString = [NSString stringWithFormat:@"%f,%f", destination.coordinate.latitude, destination.coordinate.longitude]; NSString *directionsAPI = @"https://maps.googleapis.com/maps/api/directions/json?"; NSString *directionsUrlString = [NSString stringWithFormat:@"%@&origin=%@&destination=%@&mode=driving", directionsAPI, originString, destinationString]; NSURL *directionsUrl = [NSURL URLWithString:directionsUrlString]; NSURLSessionDataTask *fetchDirectionsTask = [[NSURLSession sharedSession] dataTaskWithURL:directionsUrl completionHandler: ^(NSData *data, NSURLResponse *response, NSError *error) { NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; if(error) { if(completionHandler) completionHandler(nil); return; } NSArray *routesArray = [json objectForKey:@"routes"]; GMSPolyline *polyline = nil; if ([routesArray count] > 0) { NSDictionary *routeDict = [routesArray objectAtIndex:0]; NSDictionary *routeOverviewPolyline = [routeDict objectForKey:@"overview_polyline"]; NSString *points = [routeOverviewPolyline objectForKey:@"points"]; GMSPath *path = [GMSPath pathFromEncodedPath:points]; polyline = [GMSPolyline polylineWithPath:path]; } // run completionHandler on main thread dispatch_sync(dispatch_get_main_queue(), ^{ if(completionHandler) completionHandler(polyline); }); }]; [fetchDirectionsTask resume];}
For swift 3 to draw polyline
func getPolylineRoute(from source: CLLocationCoordinate2D, to destination: CLLocationCoordinate2D){ let config = URLSessionConfiguration.default let session = URLSession(configuration: config) let url = URL(string: "https://maps.googleapis.com/maps/api/directions/json?origin=\(source.latitude),\(source.longitude)&destination=\(destination.latitude),\(destination.longitude)&sensor=true&mode=driving&key=YOURKEY")! let task = session.dataTask(with: url, completionHandler: { (data, response, error) in if error != nil { print(error!.localizedDescription) self.activityIndicator.stopAnimating() } else { do { if let json : [String:Any] = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String: Any]{ guard let routes = json["routes"] as? NSArray else { DispatchQueue.main.async { self.activityIndicator.stopAnimating() } return } if (routes.count > 0) { let overview_polyline = routes[0] as? NSDictionary let dictPolyline = overview_polyline?["overview_polyline"] as? NSDictionary let points = dictPolyline?.object(forKey: "points") as? String self.showPath(polyStr: points!) DispatchQueue.main.async { self.activityIndicator.stopAnimating() let bounds = GMSCoordinateBounds(coordinate: source, coordinate: destination) let update = GMSCameraUpdate.fit(bounds, with: UIEdgeInsetsMake(170, 30, 30, 30)) self.mapView!.moveCamera(update) } } else { DispatchQueue.main.async { self.activityIndicator.stopAnimating() } } } } catch { print("error in JSONSerialization") DispatchQueue.main.async { self.activityIndicator.stopAnimating() } } } }) task.resume() } func showPath(polyStr :String){ let path = GMSPath(fromEncodedPath: polyStr) let polyline = GMSPolyline(path: path) polyline.strokeWidth = 3.0 polyline.strokeColor = UIColor.red polyline.map = mapView // Your map view }
Note : You need to put googleDirection API key in URL.