Google Maps iOS SDK, Cómo llegar entre 2 ubicaciones

Mientras uso el SDK de Google Maps, trato de get la dirección de conducción entre dos ubicaciones en iOS. Sé que podemos hacer esto usando dos methods:

1.) Usando el esquema URL, para lo cual es necesario que la aplicación Google Maps esté instalada en su dispositivo.

2.) Usando la API de direcciones, a través de Request-Response y luego parsing JSON. Mostrando marcadores para mostrar la dirección.

Ahora, mi pregunta es ¿Hay alguna otra forma en que puedo hacer esto en iOS? Necesito mostrar la dirección desde mi location actual a una location particular de la cual tengo el Lat / Long.

Me refiero a que realmente no es posible simplemente pasar 2 location como parámetro y Google Maps SDK, ¿me darán las instrucciones?

Gracias,

Parece que estás buscando UI Chrome como la aplicación Google Maps para mostrar indicaciones. Google Maps SDK para iOS le mostrará un map, pero usted es responsable del cromo de navigation adicional.

Puede usar la API de Google Directions para solicitar instrucciones y luego usar la ruta codificada que se devuelve desde el service para dibujar una línea de GMSP utilizando el método pathFromEncodedPath: método de GMSPath .

NSString *urlString = [NSString stringWithFormat: @"%@?origin=%f,%f&destination=%f,%f&sensor=true&key=%@", @"https://maps.googleapis.com/maps/api/directions/json", mapView.myLocation.coordinate.latitude, mapView.myLocation.coordinate.longitude, destLatitude, destLongitude, @"Your Google Api Key String"]; NSURL *directionsURL = [NSURL URLWithString:urlString]; ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:directionsURL]; [request startSynchronous]; NSError *error = [request error]; if (!error) { NSString *response = [request responseString]; NSLog(@"%@",response); NSDictionary *json =[NSJSONSerialization JSONObjectWithData:[request responseData] options:NSJSONReadingMutableContainers error:&error]; GMSPath *path =[GMSPath pathFromEncodedPath:json[@"routes"][0][@"overview_polyline"][@"points"]]; GMSPolyline *singleLine = [GMSPolyline polylineWithPath:path]; singleLine.strokeWidth = 7; singleLine.strokeColor = [UIColor greenColor]; singleLine.map = self.mapView; } else NSLog(@"%@",[request error]); 

Nota: asegúrese de que su Google Direction API Sdk esté habilitado en su console de Google Developer.

Estas líneas muestran la location entre una latitud / longitud determinada y la location del usuario;

 NSString *googleMapUrlString = [NSString stringWithFormat:@"http://maps.google.com/?saddr=%f,%f&daddr=%@,%@", mapView.userLocation.coordinate.latitude, mapView.userLocation.coordinate.longitude, destinationLatitude, destinationLongtitude]; [[UIApplication shanetworkingApplication] openURL:[NSURL URLWithString:googleMapUrlString]]; 

Lo había hecho, ya que también muestra PINS DISTANCE AND DURATION en el map con la RUTA DE DIRECCIÓN . Pero no olvide configurar su GOOGLE DIRECTION API PARA HABILITAR en su CONSOLA DE DESARROLLADOR DE GOOGLE

 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; NSString *urlString =@"https://maps.googleapis.com/maps/api/directions/json"; NSDictionary *dictParameters = @{@"origin" : [NSString stringWithFormat:@"%@",_sourceAdd], @"destination" : [NSString stringWithFormat:@"%@",_destinationAdd], @"mode" : @"driving", @"key":@"AIzaSyD9cWTQkAxemELVXTNUCALOmzlDv5b9Dhg"}; [manager GET:urlString parameters:dictParameters success:^(AFHTTPRequestOperation *operation, id responseObject) { GMSPath *path =[GMSPath pathFromEncodedPath:responseObject[@"routes"][0][@"overview_polyline"][@"points"]]; NSDictionary *arr=responseObject[@"routes"][0][@"legs"]; NSMutableArray *loc=[[NSMutableArray alloc]init]; loc=[[arr valueForKey:@"start_location"]valueForKey:@"lat"]; _sourceloc.latitude=[loc[0] doubleValue]; loc=[[arr valueForKey:@"start_location"]valueForKey:@"lng"]; _sourceloc.longitude=[loc[0] doubleValue]; loc=[[arr valueForKey:@"end_location"]valueForKey:@"lat"]; _destinationloc.latitude=[loc[0] doubleValue]; loc=[[arr valueForKey:@"end_location"]valueForKey:@"lng"]; _destinationloc.longitude=[loc[0] doubleValue]; NSString *dis,*dur; loc=[[arr valueForKey:@"distance"]valueForKey:@"text"]; dis=loc[0]; loc=[[arr valueForKey:@"duration"]valueForKey:@"text"]; dur=loc[0]; NSString *sa,*da; loc=[arr valueForKey:@"start_address"]; sa=loc[0]; loc=[arr valueForKey:@"end_address"]; da=loc[0]; UIAlertView *av=[[UIAlertView alloc]initWithTitle:@"Route Info" message:[NSString stringWithFormat:@"Distance:%@ \nDuration:%@",dis,dur] delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil, nil]; [av show]; GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:_sourceloc.latitude longitude:_sourceloc.longitude zoom:10]; mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; GMSMarker *marker = [GMSMarker markerWithPosition:_sourceloc]; marker.title=@"Source"; marker.snippet =sa; marker.appearAnimation = kGMSMarkerAnimationPop; marker.map = mapView; GMSMarker *marker2 = [GMSMarker markerWithPosition:_destinationloc]; marker2.title=@"Destination"; marker2.snippet =da; marker2.appearAnimation = kGMSMarkerAnimationPop; marker2.map = mapView; GMSPolyline *singleLine = [GMSPolyline polylineWithPath:path]; singleLine.strokeWidth = 4; singleLine.strokeColor = [UIColor blueColor]; singleLine.map = mapView; self.view = mapView; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@", error); }]; 

Swift 3.0 y XCode 8.0 utilizando AFNetworking y SwiftJson

  let destLatitude="26.9124" let destLongitude="75.7873" mapView.isMyLocationEnabled = true var urlString = "\("https://maps.googleapis.com/maps/api/directions/json")?origin=\("28.7041"),\("77.1025")&destination=\(destLatitude),\(destLongitude)&sensor=true&key=\("Your-Api-key")" urlString = urlString.addingPercentEncoding( withAllowedCharacters: .urlQueryAllowed)! let manager=AFHTTPRequestOperationManager() manager.responseSerializer = AFJSONResponseSerializer(readingOptions: JSONSerialization.ReadingOptions.allowFragments) as AFJSONResponseSerializer manager.requestSerializer = AFJSONRequestSerializer() as AFJSONRequestSerializer manager.responseSerializer.acceptableContentTypes = NSSet(objects:"application/json", "text/html", "text/plain", "text/json", "text/javascript", "audio/wav") as Set<NSObject> manager.post(urlString, parameters: nil, constructingBodyWith: { (formdata:AFMultipartFormData!) -> Void in }, success: { operation, response -> Void in //{"responseString" : "Success","result" : {"userId" : "4"},"errorCode" : 1} //if(response != nil){ let parsedData = JSON(response) print_debug("parsedData : \(parsedData)") var path = GMSPath.init(fromEncodedPath: parsedData["routes"][0]["overview_polyline"]["points"].string!) //GMSPath.fromEncodedPath(parsedData["routes"][0]["overview_polyline"]["points"].string!) var singleLine = GMSPolyline.init(path: path) singleLine.strokeWidth = 7 singleLine.strokeColor = UIColor.green singleLine.map = self.mapView //let loginResponeObj=LoginRespone.init(fromJson: parsedData) // } }, failure: { operation, error -> Void in print_debug(error) let errorDict = NSMutableDictionary() errorDict.setObject(ErrorCodes.errorCodeFailed.rawValue, forKey: ServiceKeys.keyErrorCode.rawValue as NSCopying) errorDict.setObject(ErrorMessages.errorTryAgain.rawValue, forKey: ServiceKeys.keyErrorMessage.rawValue as NSCopying) }) 

Cree una key en la console de desarrolladores de Google, asegúrese de que su proyecto se haya creado con App bundleID después de agregar el siguiente código

 NSString *KEY=@""; NSString *Origin=@""; NSString *Destination=@""; NSString *str_maps=[NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/directions/json?origin=%@&destination=%@&key=%@",Origin,Destination,KEY]; NSURL *url=[NSURL URLWithString:str_maps]; NSData *dta=[NSData dataWithContentsOfURL:url]; NSDictionary *dict=(NSDictionary *)[NSJSONSerialization JSONObjectWithData:dta options:kNilOptions error:nil]; NSLog(@"%@",dict); 
 (void)viewDidLoad { [super viewDidLoad]; GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:30.692408 longitude:76.767556 zoom:14]; GMSMapView *mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; mapView.myLocationEnabled = YES; // Creates markers in the center of the map. GMSMarker *marker = [[GMSMarker alloc] init]; marker.position = CLLocationCoordinate2DMake(30.6936659, 76.77201819999999); marker.title = @"Chandigarh 47c"; marker.snippet = @"Hello World"; marker.map = mapView; GMSMarker *marker1 = [[GMSMarker alloc] init]; marker1.position = CLLocationCoordinate2DMake(30.742138, 76.818756); marker1.title = @"Sukhna Lake"; marker1.map = mapView; //creating a path GMSMutablePath *path = [GMSMutablePath path]; [path addCoordinate:CLLocationCoordinate2DMake(@(30.6936659).doubleValue,@(76.77201819999999).doubleValue)]; [path addCoordinate:CLLocationCoordinate2DMake(@(30.742138).doubleValue,@(76.818756).doubleValue)]; GMSPolyline *rectangle = [GMSPolyline polylineWithPath:path]; rectangle.strokeWidth = 2.f; rectangle.map = mapView; self.view=mapView; } 

Usando Swift definitivamente lo resolví de esta manera.
Mi objective era encontrar la distancia entre dos coorderadas:

 import AFNetworking /** Calculate distance between two valid coordinates - parameter origin: origin coordinates - parameter destination: destination coordinates - parameter completion: completion callback */ func calculateDistance(origin origin: CLLocation, destination: CLLocation, completion: (distance: Double?) -> Void) { let service = "https://maps.googleapis.com/maps/api/directions/json" let originLat = origin.coordinate.latitude let originLong = origin.coordinate.longitude let destLat = destination.coordinate.latitude let destLong = destination.coordinate.longitude let urlString = "\(service)?origin=\(originLat),\(originLong)&destination=\(destLat),\(destLong)&mode=driving&units=metric&sensor=true&key=<YOUR_KEY>" let directionsURL = NSURL(string: urlString) let request = NSMutableURLRequest(URL: directionsURL!) request.HTTPMethod = "GET" request.addValue("application/json", forHTTPHeaderField: "Content-Type") request.addValue("application/json", forHTTPHeaderField: "Accept") let operation = AFHTTPRequestOperation(request: request) operation.responseSerializer = AFJSONResponseSerializer() operation.setCompletionBlockWithSuccess({ (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) -> Void in if let result = responseObject as? NSDictionary { if let routes = result["routes"] as? [NSDictionary] { if let lines = routes[0]["overview_polyline"] as? NSDictionary { if let points = lines["points"] as? String { let path = GMSPath(fromEncodedPath: points) let distance = GMSGeometryLength(path) print("wow \(distance / 1000) KM") } } } } }) { (operation: AFHTTPRequestOperation!, error: NSError!) -> Void in print("\(error)") } operation.start() }