Wie zeige ich einen Marker in Karten, die von geo URI Intent gestartet wurden?


107

Ich habe eine Anwendung, in der ich verschiedene Standorte anzeigen möchte (einen nach dem anderen, ausgewählt durch Benutzereingaben), indem ich Google Maps mit ihren spezifischen Geokoordinaten starte.

Ich benutze dies derzeit (natürlich mit echten Lat- und Long-Werten):

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

Es ist genau das, was ich will, außer dass es keinen Indikator oder Marker für den angegebenen Punkt zeigt. Es zentriert sich nur an seinem Standort.

Gibt es eine Möglichkeit, den Marker oder etwas anderes aufzunehmen, ohne MapView zu verwenden?


Das Etikett wird in der letzten Kartenaktualisierung nicht mehr angezeigt. Was ist zu tun?
user2297550

Antworten:


253

Versuche dies:

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

Sie können (Label + Name) weglassen, wenn Sie kein Label möchten, und es wird zufällig eines basierend auf der nächsten Straße oder einer anderen Sache ausgewählt, die es für relevant hält.


Nach der Implementierung dieser URI habe ich Probleme beim Einstellen des Zooms. Es scheint jetzt veraltet zu sein
LuckyMalaka

8
@mmm ...: Du musst das? z in ein & z ändern. Sie können nur eine haben? in einem uri. SCHLECHT: Geo: N, M? Z = 10? Q = N, M (Ort) GUT: Geo: N, M? Z = 10 & q = N, M (Ort)
Josh

Kein Zoom funktioniert immer noch nicht (aber das Label-Ding funktioniert). Auch wenn Karten nichts Relevantes finden (obwohl wir es mit dem Etikett versehen), wird ein Toastfehler angezeigt. Diese Lösung funktioniert aber nur halb optimal.
Warpzit

3
Zoom wird ignoriert, da dies eher eine einfache Abfrage als ein Geointent ist. Was hier passiert, ist eine einfache Abfrage, die an Google gesendet wird, und der Server antwortet dann mit einem entsprechenden "Suchergebnis". Sie können versuchen, auf maps.google.com nach <lat>, <long> (Label + Name) zu suchen und das gleiche Ergebnis zu erhalten
robpvn

4
Bei Verwendung dieser Methode (oder einer der anderen Methoden, bei denen eine beschriftete Abfrage geo:erforderlich ist ) wird der Geopunkt in dem Teil vollständig ignoriert , betonte lke robpvn. In einigen Fällen schlägt die Abfrage mit lat / long fehl, und dann erhalten Sie nur einen Toast ohne Ergebnisse, anstatt auf Geopoint zurückzugreifen. Nicht sehr nützlich für jede Art von GIS-App.
Geobits

45

Die akzeptierte Antwort ist korrekt, außer wenn Ihr Etikett ein kaufmännisches Und (&) enthält.

Betrachten einer einheitlichen Ressourcen-ID für geografische Standorte ('geo'-URI) :

In Abschnitt 5.1 heißt es:

Wenn der endgültige URI eine 'Abfrage'-Komponente enthalten soll, fügen Sie den Komponentenbegrenzer "?" bis zum Ende des Ergebnisses, gefolgt von der codierten Abfragezeichenfolge.

Leider entgeht uns dabei auch das '=', was wir nicht wollen.

Wir sollten das tun:

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
Diese Funktionalität wurde in neuem Google Maps 7.x unterbrochen, siehe auch code.google.com/p/android/issues/detail?id=58507
ATom

42

Es gibt viele weitere Optionen, um eine Google-Karte mit einer Absicht zu starten ...

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

sieht aus wie für 2) "& iwloc = A & hl = es" wird nicht wirklich benötigt
Olivier de Jonge

"iwloc" steht für die Position des Infofensters und "hl" für die Sprache. Wenn Sie diese Werte nicht festlegen, gelten die Standardwerte. =)
Jorgesys

Sie vermissen )auf dem zweiten Weg.
Sen

UPS! zweite und dritte Option! danke ich habe beides behoben! B ´ • ᴥ • `ᕥ @Baras
Jorgesys

5

Diese Saite funktioniert gut für mich:

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

Versuchen Sie, (LocationMarkerName) an das geo: uri anzuhängen. Beispiel: "geo :,? Z = 17 (LocationMarkerName)"

In Google Maps auf Android, das nach 23.0980,30.6797 (NamedMarker) sucht, scheint es die Karte zu zentrieren und eine Markierung mit dem Namen NamedMarker an dieser Position zu positionieren.


1

Ich habe gerade bestätigt, dass das folgende Snippet von @Kenton Price unter Android 4.4 (KitKat) noch funktioniert:

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

0

Ich habe Overlays mit MapView nur zum Zeichnen von Markierungen auf einer Karte verwendet. Wenn in Ihrer Ansicht Ihre Karte angezeigt wird, können Sie Ihren Marker möglicherweise einfach in der Mitte des Bildschirms zeichnen, so wie Sie ein Bild in einer Ansicht zeichnen würden.

Die Markierung würde jedoch nicht mit den tatsächlichen Kartenkoordinaten verknüpft sein. Wenn es sich jedoch nur um eine statische Ansicht handelt, ist dies möglicherweise der Fall.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.