varios puntos marcar marcadores google example eliminar ejemplos añadir agregar ios google-maps google-maps-sdk-ios ios6.1 ios6-maps

ios - marcar - API de GoogleMap da coordenadas incorrectas para la dirección entre dos puntos



google.maps.marker example (2)

Estoy usando la API de GoogleMap para mostrar la dirección del dibujo entre dos puntos en GoogleMap.

Quiero dar soporte en iOS 6.1, así que uso GoogleMap, sé que iOS7 lo recuperará.

usando el código a continuación para analizar y obtener Pasos para que las coordenadas dibujen una polilínea en el Mapa:

NSString *str=@"http://maps.googleapis.com/maps/api/directions/json?origin=bharuch,gujarat&destination=vadodara,gujarat&sensor=false"; NSURL *url=[[NSURL alloc]initWithString:[str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSError* error; NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; NSArray* latestRoutes = [json objectForKey:@"routes"]; NSMutableDictionary *legs=[[[latestRoutes objectAtIndex:0] objectForKey:@"legs"] objectAtIndex:0]; NSArray *steps=[legs objectForKey:@"steps"]; NSString *startLocation,*endLocation,*totalDistance,*totalDuration; CLLocationCoordinate2D startLoc,endLoc; startLocation = [legs objectForKey:@"start_address"]; endLocation = [legs objectForKey:@"end_address"]; totalDistance = [[legs objectForKey:@"distance"] objectForKey:@"text"]; totalDuration = [[legs objectForKey:@"duration"] objectForKey:@"text"]; startLoc=CLLocationCoordinate2DMake([[[legs objectForKey:@"start_location"] objectForKey:@"lat"] doubleValue], [[[legs objectForKey:@"start_location"] objectForKey:@"lng"] doubleValue]); endLoc=CLLocationCoordinate2DMake([[[legs objectForKey:@"end_location"] objectForKey:@"lat"] doubleValue], [[[legs objectForKey:@"end_location"] objectForKey:@"lng"] doubleValue]); NSMutableDictionary *tempDict; if ([steps count]!=0) { GMSMutablePath *path = [GMSMutablePath path]; for(int idx = 0; idx < [steps count]+2; idx++){ CLLocationCoordinate2D workingCoordinate; if (idx==0) { workingCoordinate=startLoc; [path addCoordinate:workingCoordinate]; } else if (idx==[steps count]+1){ workingCoordinate=endLoc; [path addCoordinate:workingCoordinate]; } else{ workingCoordinate=CLLocationCoordinate2DMake([[[[steps objectAtIndex:idx-1] objectForKey:@"start_location"] objectForKey:@"lat"] floatValue], [[[[steps objectAtIndex:idx-1] objectForKey:@"start_location"] objectForKey:@"lng"] floatValue]); [path addCoordinate:workingCoordinate]; } tempDict = nil; } // create the polyline based on the array of points. GMSPolyline *rectangle = [GMSPolyline polylineWithPath:path]; rectangle.strokeWidth=5.0; rectangle.map = mapView_; }

da solo 24 pasos significa solo 24 coordenadas para crear un punto y dibujar una línea en el mapa que se muestra a continuación:

puedes ver que la línea no está en el camino correcto, entonces, ¿qué puedo hacer para resolver esto? también quiero mostrar dirección en el mapa también.


Añadí GMSMarker a cada punto en la matriz de pasos y estoy seguro de que usa los pasos array ubicación_inicio y ubicación_del finalización no suficientes para mostrar la dirección en el mapa. aquí está el código que edité de tu código

NSString *str=@"http://maps.googleapis.com/maps/api/directions/json?origin=bharuch,gujarat&destination=vadodara,gujarat&sensor=false"; NSURL *url=[[NSURL alloc]initWithString:[str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSError *error; NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; NSArray* latestRoutes = [json objectForKey:@"routes"]; NSMutableDictionary *legs=[[[latestRoutes objectAtIndex:0] objectForKey:@"legs"] objectAtIndex:0]; NSArray *steps=[legs objectForKey:@"steps"]; NSString *startLocation,*endLocation,*totalDistance,*totalDuration; CLLocationCoordinate2D startLoc,endLoc; startLocation = [legs objectForKey:@"start_address"]; endLocation = [legs objectForKey:@"end_address"]; totalDistance = [[legs objectForKey:@"distance"] objectForKey:@"text"]; totalDuration = [[legs objectForKey:@"duration"] objectForKey:@"text"]; startLoc=CLLocationCoordinate2DMake([[[legs objectForKey:@"start_location"] objectForKey:@"lat"] doubleValue], [[[legs objectForKey:@"start_location"] objectForKey:@"lng"] doubleValue]); NSMutableDictionary *stopLegs=[[[latestRoutes objectAtIndex:0] objectForKey:@"legs"] objectAtIndex:0]; endLoc=CLLocationCoordinate2DMake([[[stopLegs objectForKey:@"end_location"] objectForKey:@"lat"] doubleValue], [[[stopLegs objectForKey:@"end_location"] objectForKey:@"lng"] doubleValue]); NSMutableDictionary *tempDict; if ([steps count]!=0) { // add marker NSDictionary *step; for (int i= 0; i < steps.count; i++) { step = [steps objectAtIndex:i]; NSDictionary *location = [step objectForKey:@"start_location"]; double lat = [[location objectForKey:@"lat"] doubleValue]; double lng = [[location objectForKey:@"lng"] doubleValue]; GMSMarker *marker = [[GMSMarker alloc] init]; marker.position = CLLocationCoordinate2DMake(lat, lng); marker.snippet = [NSString stringWithFormat:@"point (%d)", i+1]; marker.map = mapView_; } NSDictionary *location = [step objectForKey:@"end_location"]; double lat = [[location objectForKey:@"lat"] doubleValue]; double lng = [[location objectForKey:@"lng"] doubleValue]; GMSMarker *marker = [[GMSMarker alloc] init]; marker.position = CLLocationCoordinate2DMake(lat, lng); marker.snippet = [NSString stringWithFormat:@"point (%d)", steps.count]; marker.map = mapView_; // continue draw map GMSMutablePath *path = [GMSMutablePath path]; for(int idx = 0; idx < [steps count]+2; idx++){ CLLocationCoordinate2D workingCoordinate; if (idx==0) { workingCoordinate=startLoc; [path addCoordinate:workingCoordinate]; } else if (idx==[steps count]+1){ workingCoordinate=endLoc; [path addCoordinate:workingCoordinate]; } else{ workingCoordinate=CLLocationCoordinate2DMake([[[[steps objectAtIndex:idx-1] objectForKey:@"start_location"] objectForKey:@"lat"] floatValue], [[[[steps objectAtIndex:idx-1] objectForKey:@"start_location"] objectForKey:@"lng"] floatValue]); [path addCoordinate:workingCoordinate]; } tempDict = nil; } // create the polyline based on the array of points. GMSPolyline *rectangle = [GMSPolyline polylineWithPath:path]; rectangle.strokeWidth=5.0; rectangle.map = mapView_; }

se puede ver que el punto 12 y el punto 13 tienen una gran distancia (60,2 km). pero es solo un camino Lo descubrí si quieres mostrar la ruta aproximada (suavizada) de las direcciones resultantes. necesitas usar el campo "overview_polyline". overview_polyline: contiene un objeto que contiene una matriz de puntos codificados que representan una ruta aproximada (suavizada) de las direcciones resultantes. este enlace google map se desarrolla útil para ti. Así que trabajo para usted es encontrar un método para decodificar datos de "overview_polyline" para obtener la ruta correcta entre dos puntos. Definitivamente, es la forma correcta de resolver su problema porque hice una comprobación de la herramienta para decodificar "overview_polyline" en Algoritmo de polilínea codificada Formatear esta imagen lo que obtuve de la decodificación:

Para decodificar cadenas de polines, puede encontrar en este bloque http://objc.id.au/post/9245961184/mapkit-encoded-polylines

  • Continuar, con el código de @jayraj mg A continuación la respuesta es para una ruta fluida entre dos ubicaciones

-(void)viewDidLoad { // Create a GMSCameraPosition that tells the map to display the GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:21.718472 longitude:73.030422 zoom:6]; mapView_ = [GMSMapView mapWithFrame:CGRectZero camera:camera]; mapView_.delegate=self; mapView_.myLocationEnabled = YES; mapView_.settings.myLocationButton=YES; mapView_.settings.indoorPicker=NO; mapView_.settings.compassButton=YES; self.view = mapView_; NSString *str=@"http://maps.googleapis.com/maps/api/directions/json?origin=Bharuch,gujarat&destination=vadodara,gujarat&sensor=false"; NSURL *url=[[NSURL alloc]initWithString:[str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSError* error; NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; NSArray* latestRoutes = [json objectForKey:@"routes"]; NSString *points=[[[latestRoutes objectAtIndex:0] objectForKey:@"overview_polyline"] objectForKey:@"points"]; @try { // TODO: better parsing. Regular expression? NSArray *temp= [self decodePolyLine:[points mutableCopy]]; GMSMutablePath *path = [GMSMutablePath path]; for(int idx = 0; idx < [temp count]; idx++) { CLLocation *location=[temp objectAtIndex:idx]; [path addCoordinate:location.coordinate]; } // create the polyline based on the array of points. GMSPolyline *rectangle = [GMSPolyline polylineWithPath:path]; rectangle.strokeWidth=5.0; rectangle.map = mapView_; } @catch (NSException * e) { // TODO: show error } } -(NSMutableArray *)decodePolyLine: (NSMutableString *)encoded { [encoded replaceOccurrencesOfString:@"////" withString:@"//" options:NSLiteralSearch range:NSMakeRange(0, [encoded length])]; NSInteger len = [encoded length]; NSInteger index = 0; NSMutableArray *array = [[NSMutableArray alloc] init] ; NSInteger lat=0; NSInteger lng=0; while (index < len) { NSInteger b; NSInteger shift = 0; NSInteger result = 0; do { b = [encoded characterAtIndex:index++] - 63; result |= (b & 0x1f) << shift; shift += 5; } while (b >= 0x20); NSInteger dlat = ((result & 1) ? ~(result >> 1) : (result >> 1)); lat += dlat; shift = 0; result = 0; do { b = [encoded characterAtIndex:index++] - 63; result |= (b & 0x1f) << shift; shift += 5; } while (b >= 0x20); NSInteger dlng = ((result & 1) ? ~(result >> 1) : (result >> 1)); lng += dlng; NSNumber *latitude = [[NSNumber alloc] initWithFloat:lat * 1e-5] ; NSNumber *longitude = [[NSNumber alloc] initWithFloat:lng * 1e-5] ; printf("[%f,", [latitude doubleValue]); printf("%f]", [longitude doubleValue]); CLLocation *loc = [[CLLocation alloc] initWithLatitude:[latitude floatValue] longitude:[longitude floatValue]] ; [array addObject:loc]; } return array; }

Captura de pantalla de este código, puede compararlo con la captura de pantalla anterior que utilicé al hacer Pregunta:

Gracias @jayraj mg


A continuación la respuesta es para una ruta fluida entre dos ubicaciones con la ayuda de @A Báo:

-(void)viewDidLoad { // Create a GMSCameraPosition that tells the map to display the GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:21.718472 longitude:73.030422 zoom:6]; mapView_ = [GMSMapView mapWithFrame:CGRectZero camera:camera]; mapView_.delegate=self; mapView_.myLocationEnabled = YES; mapView_.settings.myLocationButton=YES; mapView_.settings.indoorPicker=NO; mapView_.settings.compassButton=YES; self.view = mapView_; NSString *str=@"http://maps.googleapis.com/maps/api/directions/json?origin=Bharuch,gujarat&destination=vadodara,gujarat&sensor=false"; NSURL *url=[[NSURL alloc]initWithString:[str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; NSError* error; NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; NSArray* latestRoutes = [json objectForKey:@"routes"]; NSString *points=[[[latestRoutes objectAtIndex:0] objectForKey:@"overview_polyline"] objectForKey:@"points"]; @try { // TODO: better parsing. Regular expression? NSArray *temp= [self decodePolyLine:[points mutableCopy]]; GMSMutablePath *path = [GMSMutablePath path]; for(int idx = 0; idx < [temp count]; idx++) { CLLocation *location=[temp objectAtIndex:idx]; [path addCoordinate:location.coordinate]; } // create the polyline based on the array of points. GMSPolyline *rectangle = [GMSPolyline polylineWithPath:path]; rectangle.strokeWidth=5.0; rectangle.map = mapView_; } @catch (NSException * e) { // TODO: show error } } -(NSMutableArray *)decodePolyLine: (NSMutableString *)encoded { [encoded replaceOccurrencesOfString:@"////" withString:@"//" options:NSLiteralSearch range:NSMakeRange(0, [encoded length])]; NSInteger len = [encoded length]; NSInteger index = 0; NSMutableArray *array = [[NSMutableArray alloc] init] ; NSInteger lat=0; NSInteger lng=0; while (index < len) { NSInteger b; NSInteger shift = 0; NSInteger result = 0; do { b = [encoded characterAtIndex:index++] - 63; result |= (b & 0x1f) << shift; shift += 5; } while (b >= 0x20); NSInteger dlat = ((result & 1) ? ~(result >> 1) : (result >> 1)); lat += dlat; shift = 0; result = 0; do { b = [encoded characterAtIndex:index++] - 63; result |= (b & 0x1f) << shift; shift += 5; } while (b >= 0x20); NSInteger dlng = ((result & 1) ? ~(result >> 1) : (result >> 1)); lng += dlng; NSNumber *latitude = [[NSNumber alloc] initWithFloat:lat * 1e-5] ; NSNumber *longitude = [[NSNumber alloc] initWithFloat:lng * 1e-5] ; printf("[%f,", [latitude doubleValue]); printf("%f]", [longitude doubleValue]); CLLocation *loc = [[CLLocation alloc] initWithLatitude:[latitude floatValue] longitude:[longitude floatValue]] ; [array addObject:loc]; } return array; }

Captura de pantalla de este código, puede compararlo con la captura de pantalla anterior que utilicé al hacer Pregunta: