Jak wyświetlić znacznik w Mapach uruchomionych na podstawie zamiaru geo URI?

107

Mam aplikację, w której chcę wyświetlać różne lokalizacje (jedną naraz, wybierane przez użytkownika), uruchamiając Mapy Google z ich określonymi współrzędnymi geograficznymi.

Obecnie używam tego (oczywiście z prawdziwymi wartościami szerokości i długości):

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

To jest dokładnie to, czego chcę, z wyjątkiem tego, że nie pokazuje żadnego wskaźnika ani znacznika dla określonego punktu. Wyśrodkowuje się tylko w swoim miejscu.

Czy istnieje sposób na uzyskanie znacznika lub czegoś innego bez użycia MapView?

Specur
źródło
etykieta przestała się wyświetlać w najnowszej aktualizacji map .. co robić?
user2297550

Odpowiedzi:

254

Spróbuj tego:

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

Możesz pominąć (Etykieta + Nazwa), jeśli nie chcesz mieć etykiety, a wybierze ją losowo na podstawie najbliższej ulicy lub innej rzeczy, którą uzna za stosowną.

Kenton Price
źródło
Po wdrożeniu tego URI mam problemy z ustawieniem zoomu. Wydaje się, że teraz jest przestarzały
LuckyMalaka
8
@mmm ...: Musisz zmienić? z na an & z. Możesz mieć tylko jeden? w uri. ZŁE: geo: N, M? Z = 10? Q = N, M (Miejsce) DOBRE: geo: N, M? Z = 10 & q = N, M (Miejsce)
Josh
Brak powiększenia nadal nie działa (ale działa etykieta). Również jeśli mapy nie mogą znaleźć niczego odpowiedniego (mimo że dostarczamy je z etykietą), wyświetli się błąd wyskakiwania. To rozwiązanie działa, ale tylko częściowo optymalne.
Warpzit
3
Powiększenie jest ignorowane, ponieważ jest to proste zapytanie, a nie geointensja. To, co się tutaj dzieje, to w rzeczywistości zwykłe zapytanie, które jest wysyłane do Google, a następnie serwer odpowiada, przedstawiając odpowiadający mu „wynik wyszukiwania”. Możesz spróbować wyszukać <lat>, <long> (etykieta + nazwa) na maps.google.com i uzyskać ten sam wynik
robpvn
4
Użycie tej (lub dowolnej innej metody, która obejmuje zapytanie oznaczone etykietą) całkowicie ignoruje punkt geograficzny w geo:części, zauważył lke robpvn. W niektórych przypadkach zapytanie nie powiedzie się przy użyciu lat / long, a wtedy zamiast wracać do punktu geograficznego, otrzymasz toast „brak wyników”. Niezbyt przydatne w przypadku jakiejkolwiek aplikacji GIS.
Geobits,
45

Zaakceptowana odpowiedź jest prawidłowa, chyba że na etykiecie znajduje się znak „&”.

Patrząc na jednolity identyfikator zasobów dla lokalizacji geograficznych (identyfikator URI „geo”) :

Sekcja 5.1 mówi:

jeśli końcowy identyfikator URI ma zawierać komponent „zapytania”, należy dodać separator komponentu „?” na końcu wyniku, po którym następuje zakodowany ciąg zapytania.

Niestety dla nas, zrobienie tego spowoduje również uniknięcie znaku „=”, co nie jest tym, czego chcemy.

Powinniśmy to zrobić:

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);
xorgate
źródło
2
Ta funkcja została zepsuta w nowych Mapach Google 7.x, zobacz również code.google.com/p/android/issues/detail?id=58507
ATom
42

Istnieje wiele innych opcji uruchamiania mapy Google za pomocą intencji ...

   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);
Jorgesys
źródło
wygląda na 2) „& iwloc = A & hl = es” nie jest naprawdę potrzebne
Olivier de Jonge
„iwloc” oznacza położenie okna informacyjnego, a „hl” język, jeśli nie ustawisz tych wartości, obowiązują wartości domyślne. =)
Jorgesys
tęsknisz )za drugą drogą.
Sen
UPS! druga i trzecia opcja! dzięki naprawiłem oba! ᕦ ´ • ᴥ • `ᕥ @Baras
Jorgesys
5

Ten ciąg działa dobrze dla mnie:

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);
HCD
źródło
2

Spróbuj dołączyć (LocationMarkerName) do geo: uri. Na przykład „geo:,? Z = 17 (LocationMarkerName)”

W Mapach Google na Androida, wyszukując 23.0980,30.6797 (NamedMarker), wydaje się, że mapa jest wyśrodkowana i umieści znacznik o nazwie NamedMarker w tym miejscu.

joshuau
źródło
1

Właśnie potwierdziłem, że następujący fragment z @Kenton Price nadal działa na Androidzie 4.4 (KitKat):

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("geo:<lat>,<long>?q=<lat>,<long>(Label+Name)"));
startActivity(intent);
Fate Chang
źródło
0

Użyłem nakładek tylko z MapView do rysowania znaczników na górze mapy. Jeśli Twój widok pokazuje mapę, możesz po prostu narysować znacznik na środku ekranu, w taki sam sposób, jak rysowałbyś dowolny obraz w Widoku.

Jednak znacznik nie byłby połączony z rzeczywistymi współrzędnymi mapy, ale jeśli jest to tylko widok statyczny, może to wystarczyć.

John J Smith
źródło