Comment afficher un marqueur dans les cartes lancées par l'intention d'URI géographique?


107

J'ai une application dans laquelle je souhaite afficher différents emplacements (un à la fois, choisi par l'utilisateur) en lançant Google Maps avec leurs coordonnées géographiques spécifiques.

J'utilise actuellement ceci (avec des valeurs de lat.et longues bien sûr):

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

C'est exactement ce que je veux, sauf qu'il ne montre aucun indicateur ou marqueur pour le point spécifié. Il ne se concentre qu'à son emplacement.

Existe-t-il un moyen d'inclure le marqueur ou autre chose sans utiliser MapView?


l'étiquette a cessé de s'afficher dans la dernière mise à jour des cartes .. que faire?
user2297550

Réponses:


254

Essaye ça:

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

Vous pouvez omettre (Étiquette + Nom) si vous ne voulez pas d'étiquette, et il en choisira une au hasard en fonction de la rue la plus proche ou de toute autre chose qu'il jugera pertinente.


Après avoir implémenté cet URI, j'ai des problèmes pour régler le zoom. Il semble être obsolète maintenant
LuckyMalaka

8
@mmm ...: Vous devrez changer le? z en un & z. Vous ne pouvez en avoir qu'un? dans un uri. BAD: geo: N, M? Z = 10? Q = N, M (Place) GOOD: geo: N, M? Z = 10 & q = N, M (Place)
Josh

Aucun zoom ne fonctionne toujours (mais la chose d'étiquette le fait). De plus, si les cartes ne trouvent rien de pertinent (même si nous leur fournissons l'étiquette), cela affichera une erreur de toast. Cette solution fonctionne mais seulement semi-optimale.
Warpzit

3
Le zoom est ignoré car il s'agit d'une simple requête plutôt que d'un géointent. Ce qui se passe ici est en fait une requête simple qui est envoyée à Google, puis le serveur répond avec un "résultat de recherche" correspondant. Vous pouvez essayer de rechercher <lat>, <long> (étiquette + nom) sur maps.google.com et obtenir le même résultat
robpvn

4
En utilisant ceci (ou n'importe laquelle des autres méthodes ici qui impliquent une requête étiquetée) ignore complètement le géopoint dans la geo:partie, a souligné lke robpvn. Dans certains cas, la requête échouera en utilisant lat / long, et vous obtiendrez simplement un toast "aucun résultat" au lieu de revenir au géopoint. Pas très utile pour toute sorte d'application SIG.
Geobits

45

La réponse acceptée est correcte, sauf si votre étiquette contient une esperluette (&).

En regardant un identifiant de ressource uniforme pour les emplacements géographiques (URI `` géo '') :

La section 5.1 stipule:

si l'URI final doit inclure un composant 'query', ajoutez le délimiteur de composant "?" à la fin du résultat, suivi de la chaîne de requête codée.

Malheureusement pour nous, faire cela échappera également au «=» qui n'est pas ce que nous voulons.

Nous devrions faire ceci:

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
Cette fonctionnalité a été interrompue dans la nouvelle version de Google Maps 7.x, voir aussi code.google.com/p/android/issues/detail?id=58507
ATom

42

Il existe de nombreuses autres options pour lancer une carte Google en utilisant une intention ...

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

ressemble à 2) "& iwloc = A & hl = es" n'est pas vraiment nécessaire
Olivier de Jonge

"iwloc" représente l'emplacement de la fenêtre d'information et "hl" la langue, si vous ne définissez pas ces valeurs, les valeurs par défaut s'appliquent. =)
Jorgesys

vous manquez )sur la deuxième voie.
Sen

UPS! deuxième et troisième option! merci j'ai réparé les deux! ᕦ ´ • ᴥ • `ᕥ @Baras
Jorgesys

5

Cette chaîne fonctionne bien pour moi:

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

Essayez d'ajouter (LocationMarkerName) à geo: uri. Par exemple, "geo:,? Z = 17 (LocationMarkerName)"

Dans Google Maps sur Android recherchant 23.0980,30.6797 (NamedMarker), il semble centrer la carte et positionner un marqueur avec le nom NamedMarker à cette position.


1

Je viens de confirmer que l'extrait suivant de @Kenton Price fonctionne toujours sur Android 4.4 (KitKat):

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

0

Je n'ai utilisé que des superpositions avec MapView pour dessiner des marqueurs au-dessus d'une carte. Si votre vue montre votre carte, il peut être possible de simplement dessiner votre marqueur au centre de l'écran, de la même manière que vous dessineriez n'importe quelle image sur une vue.

Cependant, le marqueur ne serait pas lié aux coordonnées réelles de la carte, mais s'il ne s'agit que d'une vue statique, cela pourrait le faire.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.