Как получить идентификатор места по координатам (широта, долгота) в Android

Я использую Google Maps API, и мне нужно получить подробную информацию о месте, используя широту и долготу.

I've tried to get via Geocoder, but Class "Address" has no parameters PLACE_ID

Geocoder gcd = new Geocoder(getApplicationContext(), Locale.getDefault());
            List<Address> addresses = null;
            try {
                addresses = gcd.getFromLocation(52.2641, 76.9597, 1);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (addresses.size() > 0) {
                Toast.makeText(this, addresses.get(0).getPlaceID(), Toast.LENGTH_SHORT).show();
            }
            else {
                // do your stuff
            }

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

deathangel908 31.05.2018 08:43

вы также можете использовать API мест Google, он возвращает объект места, в котором есть вся информация о нем. И кроме того, если вы хотите получить идентификатор, вы можете получить его из информации о маркере.

Umair 31.05.2018 08:44

Прочитать developers.google.com/places/place-id

IntelliJ Amiya 01.06.2018 07:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
3
3 857
4

Ответы 4

К вашему сведению

Geocoder не предоставил getPlaceID().

Supply a placeId to find the address for a given place ID. The place ID is a unique identifier that can be used with other Google APIs

Литерал объекта GeocoderRequest содержит следующие поля:

{
 address: string,
 location: LatLng,
 placeId: string,
 bounds: LatLngBounds,
 componentRestrictions: GeocoderComponentRestrictions,
 region: string
}

Вам следует прочитать Retrieving an Address for a Place ID.

 /**
   * Requests the details of a Place.
   *
   * <p>We are only enabling looking up Places by placeId as the older Place identifier, reference,
   * is deprecated. Please see the <a
   * href = "https://web.archive.org/web/20170521070241/https://developers.google.com/places/web-service/details#deprecation">
   * deprecation warning</a>.
   *
   * @param context The context on which to make Geo API requests.
   * @param placeId The PlaceID to request details on.
   * @return Returns a PlaceDetailsRequest that you can configure and execute.
   */
  public static PlaceDetailsRequest placeDetails(GeoApiContext context, String placeId) {
    PlaceDetailsRequest request = new PlaceDetailsRequest(context);
    request.placeId(placeId);
    return request;
  }

Попробуй это

Geocoder geocoder;
List<Address> addresses;
geocoder = new Geocoder(this, Locale.getDefault());

addresses = geocoder.getFromLocation(latitude, longitude, 1); 
// Here 1 represent max location result to returned, by documents it recommended 1 to 5

String address = addresses.get(0).getAddressLine(0); 
// If any additional address line present than only, check with max 
available address lines by getMaxAddressLineIndex()
String city = addresses.get(0).getLocality();
String state = addresses.get(0).getAdminArea();
String country = addresses.get(0).getCountryName();
String postalCode = addresses.get(0).getPostalCode();
String knownName = addresses.get(0).getFeatureName(); 
// Only if available else return NULL

Он не возвращает идентификатор места.

Bhavin Jadav 29.08.2018 12:38

вы можете получить идентификатор места на основании маркера. что-то вроде этого:

   mGoogleMap.setOnPoiClickListener(new GoogleMap.OnPoiClickListener() {
        @Override
        public void onPoiClick(PointOfInterest pointOfInterest)
        {
                addOrSaveMarkerToMap(pointOfInterest.latLng.latitude, pointOfInterest.latLng.longitude, pointOfInterest.name, "", pointOfInterest.placeId, true, true);


            //Toast.makeText(GoogleMapsActivity.this,""+pointOfInterest.name+" (lat: "+pointOfInterest.latLng.latitude+", long: "+pointOfInterest.latLng.longitude+") " +" is added in your favorite list",Toast.LENGTH_LONG).show();
        }
    });

Если вы хотите узнать больше о том, что представляет собой интересный объект, перейдите по этой ссылке на документацию.

https://developers.google.com/maps/documentation/android-sdk/poi

Лучше всего использовать google places API. Это даст вам полную информацию о конкретном месте.

Если вы хотите использовать google places API, перейдите по этой ссылке:

Как получить место или placeid по latLng в Android с помощью API Google Places?

В вашем случае, как вы получили PLACE ID?

Shyngys Rakhad 31.05.2018 08:52

@ Mr.Chingis возьмем, к примеру, карты Google, у которых есть метод setOnPoiClickListener (), что он делает, так это дает вам информацию о месте, которая содержит идентификатор места, и рисует маркер на этом месте. Я обновил свой ответ, пожалуйста, посмотрите.

Umair 31.05.2018 08:57

@ Mr.Chingis, пожалуйста, проверьте мой обновленный ответ. Я также добавил ссылку на документацию.

Umair 31.05.2018 09:00

Чтобы получить идентификатор места из координаты, вы должны выполнить поиск обратное геокодирование с помощью REST API.

Собственный геокодер Android API не поддерживает получение идентификатора места в результатах getFromLocation(). К сожалению, SDK Google Maps для Android также не имеет встроенного геокодера. Запрос функции существует давно, но, похоже, у него нет высокого приоритета:

https://issuetracker.google.com/issues/35823852

Итак, чтобы получить идентификатор места, вы придерживаетесь REST API. Существует клиентская библиотека Java для веб-служб Google Maps API, которую вы можете найти на github:

https://github.com/googlemaps/google-maps-services-java

Вы можете использовать эту библиотеку для вызова API геокодирования из вашего кода Java.

GeoApiContext context = new GeoApiContext.Builder()
    .apiKey("AIza...")
    .build();
GeocodingResult[] results =  GeocodingApi.newRequest(context)
    .latlng(new LatLng(52.2641, 76.9597)).await();
System.out.println(results[0].placeId);

Обратите внимание, что ключ API для веб-служб должен отличаться от ключа API, который вы используете в SDK Google Maps для Android, поскольку веб-службы не поддерживают ограничение приложений Android.

Также примите во внимание это важное замечание из документации библиотеки.

The Java Client for Google Maps Services is designed for use in server applications. This library is not intended for use inside of an Android app, due to the potential for loss of API keys.

If you are building a mobile application, you will need to introduce a proxy server to act as intermediary between your mobile application and the Google Maps API Web Services. The Java Client for Google Maps Services would make an excellent choice as the basis for such a proxy server.

Надеюсь, это поможет!

Другие вопросы по теме