¿Cómo muestro un marcador en Maps lanzado por intención de URI geográfica?


107

Tengo una aplicación en la que quiero mostrar diferentes ubicaciones (una a la vez, seleccionada por la entrada del usuario) al iniciar Google Maps con sus coordenadas geográficas específicas.

Actualmente estoy usando esto (con valores reales de lat. Y long., Por supuesto):

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:<lat>,<long>?z=17"));
startActivity(intent);

Es exactamente lo que quiero, excepto que no muestra ningún indicador o marcador para el punto especificado. Solo se centra en su ubicación.

¿Hay alguna forma de incluir el marcador o algo más sin usar MapView?


la etiqueta ha dejado de mostrarse en la actualización de mapas más reciente ... ¿qué hacer?
user2297550

Respuestas:


254

Prueba esto:

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:<lat>,<long>?q=<lat>,<long>(Label+Name)"));
startActivity(intent);

Puede omitir (Etiqueta + Nombre) si no desea una etiqueta, y elegirá una al azar en función de la calle más cercana u otra cosa que considere relevante.


Después de implementar este URI, tengo problemas para configurar el zoom. Parece estar obsoleto ahora
LuckyMalaka

8
@mmm ...: Deberá cambiar la? z por una & z. ¿Solo puedes tener uno? en un uri. MALO: geo: N, M? Z = 10? Q = N, M (Lugar) BUENO: geo: N, M? Z = 10 & q = N, M (Lugar)
Josh

Sin zoom todavía no funciona (pero lo de la etiqueta sí). Además, si los mapas no pueden encontrar nada relevante (a pesar de que le proporcionamos la etiqueta), mostrará un error de brindis. Esta solución funciona pero solo semi óptima.
Warpzit

3
El zoom se ignora porque se trata de una consulta simple en lugar de un geointent. Lo que sucede aquí es en realidad una consulta simple que se envía a Google, y luego el servidor responde con un "resultado de búsqueda" correspondiente. Puede intentar buscar <lat>, <long> (Etiqueta + Nombre) en maps.google.com y obtener el mismo resultado
robpvn

4
El uso de este (o cualquiera de los otros métodos aquí que involucran una consulta etiquetada) ignora por completo el punto geográfico en la geo:porción, señaló lke robpvn. En algunos casos, la consulta fallará al usar lat / long, y luego obtendrá un brindis "sin resultados" en lugar de volver al punto geográfico. No es muy útil para ningún tipo de aplicación GIS.
Geobits

45

La respuesta aceptada es correcta, excepto cuando su etiqueta tiene un ampersand (&) en ella.

Observación de un identificador de recursos uniforme para ubicaciones geográficas (URI 'geo') :

La sección 5.1 establece:

si el URI final debe incluir un componente de 'consulta', agregue el delimitador de componente "?" al final del resultado, seguido de la cadena de consulta codificada.

Desafortunadamente para nosotros, hacer esto también escapará del '=' que no es lo que queremos.

Deberíamos hacer esto:

String label = "Cinnamon & Toast";
String uriBegin = "geo:12,34";
String query = "12,34(" + label + ")";
String encodedQuery = Uri.encode(query);
String uriString = uriBegin + "?q=" + encodedQuery;
Uri uri = Uri.parse(uriString);
Intent intent = new Intent(android.content.Intent.ACTION_VIEW, uri);
startActivity(intent);

2
Esta funcionalidad se rompió en el nuevo Google Maps 7.x, consulte también code.google.com/p/android/issues/detail?id=58507
ATom

42

Hay muchas más opciones para lanzar un mapa de Google usando una intención ...

   Double myLatitude = 44.433106;
   Double myLongitude = 26.103687;
   String labelLocation = "Jorgesys @ Bucharest";

1)

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:<" + myLatitude  + ">,<" + myLongitude + ">?q=<" + myLatitude  + ">,<" + myLongitude + ">(" + labelLocation + ")"));
    startActivity(intent);

2)

String urlAddress = "http://maps.google.com/maps?q="+ myLatitude  +"," + myLongitude +"("+ labelLocation + ")&iwloc=A&hl=es";
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(urlAddress));
    startActivity(intent);

3)

   String urlAddress = "http://maps.googleapis.com/maps/api/streetview?size=500x500&location=" + myLatitude  + "," + myLongitude + "&fov=90&heading=235&pitch=10&sensor=false";
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(urlAddress));
        startActivity(intent);

parece para 2) "& iwloc = A & hl = es" no es realmente necesario
Olivier de Jonge

"iwloc" representa la ubicación de la ventana de información y "hl" para el idioma. Si no establece estos valores, se aplican los valores predeterminados. =)
Jorgesys

se pierde )en la segunda vía.
Sen

¡UPS! segunda y tercera opción! gracias he arreglado ambos! ᕦ ´ • ᴥ • `ᕥ @Baras
Jorgesys

5

Esta cadena me funciona bien:

String geoUriString="geo:"+lat+","+lon+"?q=("+head+")@"+lat+","+lon;
Uri geoUri = Uri.parse(geoUriString);
Log.e(TAG, "String: "+geoUriString);
Intent mapCall  = new Intent(Intent.ACTION_VIEW, geoUri);
startActivity(mapCall);

2

Intente agregar (LocationMarkerName) a geo: uri. Por ejemplo, "geo:,? Z = 17 (LocationMarkerName)"

En Google Maps en Android buscando 23.0980,30.6797 (NamedMarker), parece centrar el mapa y colocar un marcador con el nombre NamedMarker en esa posición.


1

Acabo de confirmar que el siguiente fragmento de @Kenton Price todavía funciona en Android 4.4 (KitKat):

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:<lat>,<long>?q=<lat>,<long>(Label+Name)"));
startActivity(intent);

0

Solo he usado superposiciones con MapView para dibujar marcadores en la parte superior de un mapa. Si su vista muestra su mapa, es posible que simplemente dibuje su marcador en el centro de la pantalla, de la misma manera que dibujaría cualquier imagen en una Vista.

Sin embargo, el marcador no estaría vinculado a las coordenadas reales del mapa, pero si es solo una vista estática, entonces esto podría funcionar.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.