ios - sacar - obtener coordenadas google maps iphone
Cómo invocar iPhone Maps para obtener direcciones con la ubicación actual como dirección de inicio (16)
Sé que es posible iniciar la aplicación de mapas de iPhone llamando a openURL
en una URL de google maps con los parámetros saddr
y daddr
con cadenas de ubicación o Lat / Long (ver ejemplo a continuación).
Pero me pregunto si es posible hacer que la dirección de inicio sea el marcador de mapas "Ubicación actual" para que pueda usar el código de manejo de ubicación de la aplicación Mapas . Mi búsqueda en Google ha sido bastante infructuosa.
Por ejemplo:
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat: @"http://maps.google.com/maps?saddr=%@&daddr=%@", myLatLong, latlong]]];
Excepto con algo para invocar el marcador de ubicación actual en lugar de myLatLong
.
Pre iOS 6
Necesita utilizar Core Location para obtener la ubicación actual, pero con ese par lat / long, puede hacer que Maps lo dirija desde allí, a una dirección o ubicación. Al igual que:
CLLocationCoordinate2D currentLocation = [self getCurrentLocation];
// this uses an address for the destination. can use lat/long, too with %f,%f format
NSString* address = @"123 Main St., New York, NY, 10001";
NSString* url = [NSString stringWithFormat: @"http://maps.google.com/maps?saddr=%f,%f&daddr=%@",
currentLocation.latitude, currentLocation.longitude,
[address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];
Por último, si desea evitar el uso de CoreLocation para encontrar explícitamente la ubicación actual y desea usar la url @"http://maps.google.com/maps?saddr=Current+Location&daddr=%@"
lugar, vea este enlace que proporcioné en los comentarios a continuación sobre cómo localizar la cadena Current + Location . Sin embargo, está aprovechando otra característica no documentada, y como señala Jason McCreary a continuación, es posible que no funcione de manera confiable en versiones futuras.
Actualización para iOS 6
Originalmente, Maps usaba mapas de Google, pero ahora, Apple y Google tienen aplicaciones de mapas por separado.
1) Si desea enrutar usando la aplicación Google Maps, use el esquema de URL de comgooglemaps :
NSString* url = [NSString stringWithFormat: @"comgooglemaps://?daddr=%@&directionsmode=driving",
[address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
BOOL opened = [[UIApplication sharedApplication] openURL: [NSURL URLWithString: url]];
2) Para utilizar Apple Maps, puedes usar la nueva clase MKMapItem
para iOS 6. Ver los documentos de la API de Apple aquí
Básicamente, latlong
algo como esto, si latlong
a coordenadas de destino (en latlong
):
MKPlacemark* place = [[MKPlacemark alloc] initWithCoordinate: latlong addressDictionary: nil];
MKMapItem* destination = [[MKMapItem alloc] initWithPlacemark: place];
destination.name = @"Name Here!";
NSArray* items = [[NSArray alloc] initWithObjects: destination, nil];
NSDictionary* options = [[NSDictionary alloc] initWithObjectsAndKeys:
MKLaunchOptionsDirectionsModeDriving,
MKLaunchOptionsDirectionsModeKey, nil];
[MKMapItem openMapsWithItems: items launchOptions: options];
Con el fin de admitir iOS 6+ y pre iOS 6 en el mismo código, recomendaría utilizar algo como este código que Apple tiene en la página de documentación de la API de MKMapItem
:
Class itemClass = [MKMapItem class];
if (itemClass && [itemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) {
// iOS 6 MKMapItem available
} else {
// use pre iOS 6 technique
}
Esto supondría que su Xcode Base SDK es iOS 6 (o Último iOS ).
¡Oye desde que salió iOS6!
Apple hizo algo notable de una mala manera (desde mi punto de vista).
Se lanzan los mapas de Apple y para los dispositivos con iOS 6 no debe usar maps.google.com/?q=
si desea que iDevice abra la aplicación de Plan nativa. Ahora sería maps.apple.com/?q=
.
Para que los desarrolladores no tengan que trabajar mucho, el servidor friendly maps.apple.com redirige todos los dispositivos que no son de Apple a maps.google.com para que el cambio sea transparente.
De esta forma, los desarrolladores solo tenemos que cambiar todas las cadenas de consulta de Google a las de Apple. Esto es lo que no me gusta mucho.
Tenía que implementar esa funcionalidad hoy, así que lo hice. Pero sentí que no debería reescribir todas las URL que se encuentran en el sitio web móvil para apuntar al servidor de mapas de Apple, así que pensé que simplemente detectaría iDevices en el lado del servidor y serviría las URL de Apple solo para esas. Pensé que lo compartiría.
Estoy usando PHP, así que utilicé la biblioteca de Detección móvil de código abierto: http://code.google.com/p/php-mobile-detect/
Simplemente use el pseudo método isiPad
como getter booleano y listo, no convertirá google en apple ;-)
$server=$detect->isiPad()?"apple":"google";
$href="http://maps.{$server}.com/?q=..."
¡Aclamaciones!
Con la versión actual de Google Maps, simplemente omita el parámetro sadr
:
saddr
: ... Si el valor se deja en blanco, entonces se usará la ubicación actual del usuario.
https://developers.google.com/maps/documentation/ios/urlscheme
Debido al sandboxing, no tiene acceso a los marcadores de la aplicación Map.
En su lugar, use Core Location para determinar la ubicación actual usted mismo. Luego use esa ubicación (lat y long) en la URL que construye para abrir Maps.
Esto funciona en iPhone:
http://maps.google.com/maps?saddr=Current Location & daddr = 123 Main St, Ottawa, ON
La solución real se puede encontrar aquí. Z5 Concepts iOS Fragmento de código de desarrollo
Solo requiere un poco de codificación.
- (IBAction)directions1_click:(id)sender
{
NSString* address = @"118 Your Address., City, State, ZIPCODE";
NSString* currentLocation = @"Current Location";
NSString* url = [NSStringstringWithFormat: @"http://maps.google.com/maps?saddr=%@&daddr=%@",[currentLocation stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],[address stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
UIApplication *app = [UIApplicationsharedApplication];
[app openURL: [NSURL URLWithString: url]];
}
Mi sugerencia sería usar OpenInGoogleMaps-iOS ya que esta es una opción actualizada (para noviembre de 2015), admite la instalación de pods de cacao y está listo para comenzar con unos pocos clics.
Instalar usando: pod "OpenInGoogleMaps"
Requerir en el archivo de encabezado usando: #import "OpenInGoogleMapsController.h"
Código de muestra a continuación:
/*In case the user does NOT have google maps, then apple maps shall open*/
[OpenInGoogleMapsController sharedInstance].fallbackStrategy = kGoogleMapsFallbackAppleMaps;
/*Set the coordinates*/
GoogleMapDefinition *definition = [[GoogleMapDefinition alloc] init];
CLLocationCoordinate2D metsovoMuseumCoords; //coordinates struct
metsovoMuseumCoords.latitude = 39.770598;
metsovoMuseumCoords.longitude = 21.183215;
definition.zoomLevel = 20;
definition.center = metsovoMuseumCoords; //this will be the center of the map
/*and here we open the map*/
[[OpenInGoogleMapsController sharedInstance] openMap:definition];
Para iOS6 Maps App, puede usar la misma URL publicada arriba http://maps.google.com/maps?saddr=%f,%f&daddr=%@
pero en lugar de la URL de Google maps, usa la url con los maps://
dando como resultado la siguiente URL: maps://saddr=%f,%f&daddr=%@.
Usar "Ubicación actual" no parece funcionar, así que me quedé con las coordenadas.
Otra cosa buena: es compatible con versiones anteriores: en iOS5, lanza la aplicación Google Maps.
Para iOS6, los documentos Apple recomiendan usar el esquema de URL maps.apple.com equivalente
entonces usa
http://maps.apple.com/maps?saddr=%f,%f&daddr=%f,%f
en lugar de
http://maps.google.com/maps?saddr=%f,%f&daddr=%f,%f
para ser compatible con versiones anteriores, el código sería
NSString* versionNum = [[UIDevice currentDevice] systemVersion];
NSString *nativeMapScheme = @"maps.apple.com";
if ([versionNum compare:@"6.0" options:NSNumericSearch] == NSOrderedAscending)
nativeMapScheme = @"maps.google.com";
}
NSString* url = [NSString stringWithFormat: @"http://%@/maps?saddr=%f,%f&daddr=%f,%f", nativeMapScheme
startCoordinate.latitude, startCoordinate.longitude,
endCoordinate.latitude, endCoordinate.longitude];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
hay una gran cantidad de otros parámetros compatibles para el esquema de URL de Apple Maps: Apple URL Scheme Reference
puede usar estas macros de detección de versiones de iOS si tiene código condicional en otras partes de su código. Macros de la versión de iOS
Puede hacerlo ahora en html solo desde una url en su dispositivo móvil solamente. Aquí hay un example . Lo bueno es que si conviertes esto en un código qr, puedes obtener indicaciones para llegar desde donde sea que estén escaneando en su teléfono.
Puede usar un preprocesador #define como:
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
para entender tu versión de iOS Entonces, puedo usar este código para soportar iOS 6 también:
NSString* addr = nil;
if (SYSTEM_VERSION_LESS_THAN(@"6.0")) {
addr = [NSString stringWithFormat:@"http://maps.google.com/maps?daddr=%1.6f,%1.6f&saddr=Posizione attuale", view.annotation.coordinate.latitude,view.annotation.coordinate.longitude];
} else {
addr = [NSString stringWithFormat:@"http://maps.apple.com/maps?daddr=%1.6f,%1.6f&saddr=Posizione attuale", view.annotation.coordinate.latitude,view.annotation.coordinate.longitude];
}
NSURL* url = [[NSURL alloc] initWithString:[addr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:url];
Recomiendo ver CMMapLauncher , una mini biblioteca que he creado para iniciar Apple, Google y otras aplicaciones de mapas de iOS con una solicitud de asignación específica. Con CMMapLauncher, el código para obtener las instrucciones en su pregunta sería:
[CMMapLauncher launchMapApp:CMMapAppAppleMaps
forDirectionsFrom:[CMMapPoint mapPointWithName:@"Origin"
coordinate:myLatLong]
to:[CMMapPoint mapPointWithName:@"Destination"
coordinate:latlong]];
Como puede ver, también encapsula la verificación de versión requerida entre iOS 6 y otros.
Respondí esto en un hilo diferente. ( La ubicación actual no funciona con Apple Maps IOS 6 ). Primero debe obtener las coordenadas de la ubicación actual y luego usarlas para crear la url del mapa.
Si no desea solicitar permisos de ubicación y no tiene el lat y lng, use lo siguiente.
NSString *destinationAddress = @"Amsterdam";
Class itemClass = [MKMapItem class];
if (itemClass && [itemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)]) {
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:destinationAddress completionHandler:^(NSArray *placemarks, NSError *error) {
if([placemarks count] > 0) {
MKPlacemark *placeMark = [[MKPlacemark alloc] initWithPlacemark:[placemarks objectAtIndex:0]];
MKMapItem *mapItem = [[MKMapItem alloc]initWithPlacemark:placeMark];
MKMapItem *mapItem2 = [MKMapItem mapItemForCurrentLocation];
NSArray *mapItems = @[mapItem, mapItem2];
NSDictionary *options = @{
MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving,
MKLaunchOptionsMapTypeKey:
[NSNumber numberWithInteger:MKMapTypeStandard],
MKLaunchOptionsShowsTrafficKey:@YES
};
[MKMapItem openMapsWithItems:mapItems launchOptions:options];
} else {
//error nothing found
}
}];
return;
} else {
NSString *sourceAddress = [LocalizedCurrentLocation currentLocationStringForCurrentLanguage];
NSString *urlToOpen = [NSString stringWithFormat:@"http://maps.google.com/maps?saddr=%@&daddr=%@",
[sourceAddress stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding],
[destinationAddress stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlToOpen]];
}
Para ios5, la ubicación actual debe estar en el idioma correcto. Uso LocalizedCurrentLocation desde esta publicación http://www.martip.net/blog/localized-current-location-string-for-iphone-apps
Para ios6, uso CLGeocoder para obtener la marca de posición y luego abro el mapa con ella y la ubicación actual.
Recuerde agregar CoreLocation.framework y MapKit.framework
Si no proporciona la ubicación de la fuente, tomará la ubicación actual como fuente. Pruebe a continuación el código
let urlString = " http://maps.apple.com/maps?daddr=(destinationLocation.latitude),(destinationLocation.longitude)&dirflg=d "}
UIApplication.shared.openURL (URL (string: urlString)!)
NSString* addr = [NSString stringWithFormat:@"http://maps.google.com/maps?daddr=Current Location&saddr=%@",startAddr];
NSURL* url = [[NSURL alloc] initWithString:[addr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:url];
[url release];
Esto funciona pero solo cuando el idioma de iPhone / iPod está configurado en inglés. Si desea admitir otros idiomas, deberá usar una cadena localizada para que coincida con el nombre del marcador de Maps.