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?


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ą.


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

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

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

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.


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

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ć.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.