started route google gmscameraupdate getting clustering ios google-maps google-maps-sdk-ios

route - Google Maps iOS SDK, Cómo obtener direcciones entre 2 ubicaciones



polyline google maps ios (9)

Cree una clave en la consola de desarrollador de google, asegúrese de que su proyecto se haya creado con la aplicación ID de paquete, luego agregue 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);

Mientras estoy usando Google Maps SDK, estoy tratando de obtener la dirección de conducción entre dos ubicaciones en iOS. Sé que podemos hacer esto usando dos métodos:

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

2.) Usar Directions API, a través de Request-Response y luego analizar el JSON. Mostrar marcadores para mostrar la dirección.

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

Quiero decir, ¿realmente no es posible simplemente pasar 2 ubicaciones como parámetro y Google Maps SDK, me dará las instrucciones?

Gracias,


Estas líneas muestran la ubicación entre una latitud / longitud dada y la ubicación 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 sharedApplication] openURL:[NSURL URLWithString:googleMapUrlString]];


Lo había hecho ya que también muestra PINS DISTANCE AND DURATION en el mapa con DIRECTION ROUTE . Pero no te olvides de configurar tu API de DIRECCIÓN DE GOOGLE EN HABILITADA en tu 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); }];


Parece que está buscando UI Chrome, como la aplicación Google Maps tiene para mostrar direcciones. Google Maps SDK para iOS te pintará un mapa, pero tú eres responsable de la navegación adicional de Chrome.

Puede usar la API de Google Directions para solicitar instrucciones y luego usar la ruta codificada devuelta por el servicio para dibujar una GMSPolyline usando el método pathFromEncodedPath de GMSPath .


Swift 4.1, Xcode 9.4.1

//Here you need to set your origin and destination points and mode let url = NSURL(string: "https://maps.googleapis.com/maps/api/directions/json?origin=Machilipatnam&destination=Vijayawada&mode=driving") //OR if you want to use latitude and longitude for source and destination //let url = NSURL(string: "/("https://maps.googleapis.com/maps/api/directions/json")?origin=/("17.521100"),/("78.452854")&destination=/("15.1393932"),/("76.9214428")") let task = URLSession.shared.dataTask(with: url! as URL) { (data, response, error) -> Void in do { if data != nil { let dic = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableLeaves) as! [String:AnyObject] // print(dic) let status = dic["status"] as! String var routesArray:String! if status == "OK" { routesArray = (((dic["routes"]!as! [Any])[0] as! [String:Any])["overview_polyline"] as! [String:Any])["points"] as! String // print("routesArray: /(String(describing: routesArray))") } DispatchQueue.main.async { let path = GMSPath.init(fromEncodedPath: routesArray!) let singleLine = GMSPolyline.init(path: path) singleLine.strokeWidth = 6.0 singleLine.strokeColor = .blue singleLine.map = mapView } } } catch { print("Error") } } task.resume()


Usando Swift definitivamente lo resolví de esta manera.
Mi propósito era encontrar la distancia entre dos coordenadas:

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() }


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) })


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 Sdk API de dirección de Google esté habilitada en su Consola de desarrollador de Google.


(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; }