Как показать маркер в Картах, запущенных с помощью намерения гео URI?


107

У меня есть приложение, в котором я хочу показать разные местоположения (по одному, выбранные пользователем), запустив Google Maps с их конкретными географическими координатами.

В настоящее время я использую это (конечно, с настоящими значениями широты и долготы):

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

Это именно то, что я хочу, за исключением того, что он не показывает никаких индикаторов или маркеров для указанной точки. Он центрируется только в этом месте.

Есть ли способ включить маркер или что-то еще без использования MapView?


метка перестала отображаться в самом последнем обновлении карт .. что делать?
user2297550

Ответы:


254

Попробуй это:

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

Вы можете опустить (Метка + Имя), если вам не нужна метка, и она будет выбирать ее случайным образом в зависимости от ближайшей улицы или другого объекта, который сочтет подходящим.


После реализации этого URI у меня возникли проблемы с настройкой масштабирования. Сейчас это кажется устаревшим
LuckyMalaka

8
@mmm ...: Вам нужно будет изменить? z на & z. У вас может быть только один? в uri. ПЛОХО: geo: N, M? Z = 10? Q = N, M (Место) ХОРОШО: geo: N, M? Z = 10 & q = N, M (Место)
Джош,

Без увеличения по-прежнему не работает (а вот ярлык работает). Также, если карты не могут найти ничего подходящего (даже если мы снабжаем его меткой), будет отображаться всплывающая ошибка. Это решение работает, но лишь частично.
Warpzit

3
Масштаб игнорируется, потому что это простой запрос, а не геоинтент. То, что здесь происходит, на самом деле представляет собой простой запрос, который отправляется в Google, а затем сервер отвечает "результатом поиска", соответствующим ему. Вы можете попробовать поискать <lat>, <long> (Label + Name) на maps.google.com и получить тот же результат
robpvn

4
Использование этого (или любого другого метода здесь, который включает помеченный запрос) полностью игнорирует географическую точку в этой geo:части, указал lke robpvn. В некоторых случаях запрос с использованием широты и долготы завершится ошибкой, и тогда вы просто получите тост «нет результатов» вместо того, чтобы вернуться к геоточкам. Не очень полезно для любого приложения ГИС.
Geobits

45

Принятый ответ правильный, кроме случаев, когда на вашей этикетке есть амперсанд (&).

Глядя на универсальный идентификатор ресурса для географических местоположений ( «гео» URI) :

В разделе 5.1 говорится:

если окончательный URI должен включать компонент "запрос", добавьте разделитель компонентов "?" до конца результата, за которым следует закодированная строка запроса.

К сожалению для нас, это также позволит избежать символа '=', чего мы не хотим.

Мы должны сделать это:

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/issues/detail?id=58507
ATom

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» - язык, если вы не устанавливаете эти значения, применяются значения по умолчанию. =)
Jorgesys

вы пропустите )второй путь.
Сен

UPS! второй и третий вариант! спасибо, я исправил оба! ᕦ ´ • ᴥ • `ᕥ @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) к geo: uri. Например, "geo:,? Z = 17 (LocationMarkerName)"

В Google Maps на 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.