Як відобразити маркер на Картах, запущених гео URI Intent?


107

У мене є додаток, де я хочу показувати різні місця (по одному, вибране за допомогою введення користувача), запускаючи Карти Google із їх конкретними геокоординатами.

Я зараз це використовую (з реальними лат. І довгими значеннями звичайно):

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

Це абсолютно саме те, що я хочу, за винятком того, що він не показує жодного індикатора чи маркера для вказаної точки. Він знаходиться в центрі лише у своєму місці.

Чи є якийсь спосіб включити маркер або щось інше, не використовуючи MapView?


мітка перестала відображатися в останніх оновленнях карт .. що робити?
користувач2297550

Відповіді:


254

Спробуйте це:

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

Ви можете опустити (Label + Name), якщо ви не хочете етикетки, і він буде обраний випадковим чином на основі найближчої вулиці чи іншої речі, яку вважаєте доречною.


Після впровадження цього URI у мене виникли проблеми з налаштуванням масштабу. Здається, це вже застаріло
LuckyMalaka

8
@mmm ...: Вам потрібно буде змінити? z на & z. Ви можете мати лише один? в урі. BAD: geo: N, M? Z = 10? Q = N, M (Місце) ДОБРО: geo: N, M? Z = 10 & q = N, M (Місце)
Josh

Збільшення масштабу все ще не працює (але справа на етикетці є). Крім того, якщо карти не можуть знайти нічого релевантного (навіть якщо ми постачаємо його етикеткою), це покаже помилку тостів. Це рішення працює, але лише напів оптимальне.
Warpzit

3
Зум ігнорується, оскільки це простий запит, а не геоінтент. Що відбувається тут - це насправді звичайний запит, який надсилається в Google, і тоді сервер відповідає "результатом пошуку", відповідним йому. Ви можете спробувати пошукати <lat>, <long> (Label + Name) на maps.google.com і отримати той самий результат
robpvn

4
Використовуючи цей (або будь-який інший тут метод, який передбачає мічений запит) повністю ігнорує геоточку на geo:ділянці, вказував lke robpvn. У деяких випадках запит не вдасться використати lat / long, і тоді ви просто отримаєте тост "без результатів" замість того, щоб повернутися до геоточки. Не дуже корисний для будь-якого GIS-програми.
Геобіт

45

Прийнята відповідь є правильною, за винятком випадків, коли у вашій мітці є амперсанд (&).

Дивлячись на Уніфікований ідентифікатор ресурсу для географічних місць ('гео' URI) :

У розділі 5.1 зазначено:

якщо кінцевий URI повинен включати компонент 'query', додайте роздільник компонента "?" до кінця результату, після чого кодується рядок запиту.

На жаль, для нас це може також уникнути "=", що не є тим, чого ми хочемо.

Ми повинні зробити це:

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
Ця функція була порушена в нових Google Maps 7.x, див. Також code.google.com/p/android/isissue/detail?id=58507
1313

42

Є ще багато варіантів запустити карту Google за допомогою наміру ...

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

схоже на 2) "& iwloc = A & hl = es" не дуже потрібен
Олів'є де Йонге

"iwloc" означає розташування інформаційного вікна та "hl" для мови, якщо ви не встановили ці значення, застосовуються значення за замовчуванням. =)
Хорхесіс

ви пропускаєте )другий шлях.
Сен

Підйоми! другий і третій варіант! дякую, я виправив обоє! ᕦ ´ • ᴥ • `ᕥ @Baras
Jorgesys

5

Цей рядок для мене добре працює:

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

Спробуйте додати (LocationMarkerName) до гео: uri. Наприклад, "geo:,? Z = 17 (LocationMarkerName)"

У Картах Google на Android, які шукають 23.0980,30.6797 (NamedMarker), здається, центріруйте карту і розташуйте маркер з ім'ям NamedMarker на цій позиції.


1

Щойно я підтвердив наступний фрагмент від @Kenton Price, як і раніше працює на Android 4.4 (KitKat):

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

0

Я використовував лише накладки з MapView для нанесення маркерів на вершині карти. Якщо у вашому вікні відображається ваша карта, можливо, ви можете просто намалювати маркер в центрі екрана так само, як ви намалювали будь-яке зображення на поданні.

Однак маркер не буде пов'язаний з фактичними координатами карти, але якщо це просто статичний вигляд, то це може зробити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.