Откройте навигационные маршруты Google Maps как с координатами, так и с адресом

#android #google-maps

#Android #google-карты

Вопрос:

Мы открываем навигацию Google Maps, мы используем широтные / длинные координаты. Проблема в том, что адрес отображается некорректно, поскольку он вычисляется с помощью Google Maps на основе координат. Я не могу найти способ указать адрес, который у нас уже есть, вместе с координатами.

Координаты фактически основаны на самом поиске Google Maps, но когда координаты преобразуются обратно в адрес в Google Maps, отображается другой адрес.

Этот фрагмент кода взят из приложения Flutter, но он все равно должен быть достаточно понятным.

 final intent = AndroidIntent(
  action: 'action_view',
  data:
      'google.navigation:q=${destination.latitude},${destination.longitude}amp;mode=d',
  package: 'com.google.android.apps.maps',
);
 

Пункт назначения:

 {
    "lat": 35.6533691,
    "lng": 139.7694851,
    "address": "5-1 Toyomicho, Chuo City, Tokyo 104-0055, Japan",
    "name": "FamilyMart"
}
 

Документация Google Maps Intents для Android не предлагает никакой дополнительной помощи. В нем говорится, что вы можете указать только адрес или координаты, и ни один из них не работает правильно для нас.

Ответ №1:

Если я правильно помню, несколько лет назад можно было установить случайное имя для местоположения. Сейчас это не работает, но имеет смысл: в противном случае пользователя можно ввести в заблуждение, показав ему какой-то адрес в полях ввода, и перемещаться по совершенно другим координатам. Вы правы: для случайного преобразования местоположения lat / lng в адрес и наоборот может привести к неправильному результату, но, похоже, для именованных, широко известных мест, таких как «FamilyMart» (он отображается как POI по умолчанию на Картах Google), преобразование довольно точное. Попробуйте использовать «полный» адрес: не только значение адреса из строки, "address": "5-1 Toyomicho, Chuo City, Tokyo 104-0055, Japan", но и название места "name": "FamilyMart" из связанной с ним строки. Что-то вроде этого:

 "FamilyMart, 5-1 Toyomicho, Chuo City, Tokyo 104-0055, Japan"
 

и попробуйте запустить режим навигации с помощью «классического» намерения таким образом:

 Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
                Uri.parse("google.navigation:mode=damp;q=" Uri.encode("FamilyMart, 5-1 Toyomicho, Chuo City, Tokyo 104-0055, Japan")));
startActivity(intent);
 

или

 final intent = AndroidIntent(
  action: 'action_view',
  data:
      'google.navigation:q=${FULL_ADDRESS}amp;mode=d',
  package: 'com.google.android.apps.maps',
);
 

Если это не работает, ваш способ — либо перемещаться по координатам (без красивой подписи названия местоположения), либо написать свой собственный фрагмент, аналогичный стандартным Картам Google.

Кроме того, вы можете разрешить пользователю запускать навигационные маршруты вручную из приложения Google Maps, вызываемого намерением:

 Intent intent = new Intent(android.content.Intent.ACTION_VIEW,
                Uri.parse("geo:35.6533691 139.7694851?z=19amp;q=" Uri.encode("FamilyMart, 5-1 Toyomicho, Chuo City, Tokyo 104-0055, Japan")));
startActivity(intent);
 

Он центрирует карту "FamilyMart, 5-1 Toyomicho, Chuo City, Tokyo 104-0055, Japan" так, чтобы она отображалась на карте, видимой на экране при уровне масштабирования 19 рядом с центром в (35.6533691,139.7694851) координатах lat / lng.

Комментарии:

1. Спасибо. Это не идеально, но я думаю, что это работает хорошо. Моя текущая логика будет заключаться в использовании name amp; address, если у меня есть оба значения, в противном случае я использую координаты.

2. @GuyKogus Добро пожаловать! В любом случае, похоже, что сейчас нет других способов с намерениями.

Ответ №2:

 String strUri = "http://maps.google.com/maps?q=loc:"   latitude   ","   longitude   " ("   yourLocationName   ")";
Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(strUri));
intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
startActivity(intent);
 

Комментарии:

1. Это не открывает навигационные маршруты.