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

107

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

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

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

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

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

Specur
источник
метка перестала отображаться в самом последнем обновлении карт .. что делать?
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);
xorgate
источник
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);
Jorgesys
источник
похоже на 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);
HCD
источник
2

Попробуйте добавить (LocationMarkerName) к geo: uri. Например, "geo:,? Z = 17 (LocationMarkerName)"

В Google Maps на Android, выполняющем поиск 23.0980,30.6797 (NamedMarker), кажется, что он центрирует карту и помещает маркер с именем NamedMarker в эту позицию.

Joshuau
источник
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 для рисования маркеров поверх карты. Если в представлении отображается карта, можно просто нарисовать маркер в центре экрана таким же образом, как если бы вы рисовали любое изображение в представлении.

Однако маркер не будет связан с фактическими координатами карты, но если это просто статический вид, это может быть сделано.

Джон Дж. Смит
источник