Почему API Google Geocode возвращает разные координаты для населенных пунктов и населенных пунктов + ZIP (то же место)? - PullRequest
0 голосов
/ 07 апреля 2019

В большинстве, если не во всех странах, каждый населенный пункт (address_components - "types": ["locality", "polit"]) имеет хотя бы один почтовый индекс, в больших городах есть несколько почтовых индексов (address_components - "types": [ "Почтовый индекс" ]). Но большинство населенных пунктов имеют только один почтовый индекс. При использовании API Google Geocode для населенных пунктов только с одним почтовым индексом местность (например, "richterswil") и населенный пункт плюс соответствующий почтовый индекс (пример: "8805 + richterswil) возвращают разные координаты. Это неожиданно для меня, и делает определенные задачи намного сложнее чем они должны быть (подумайте о поиске координат для места, в которое пользователи входят - некоторые будут включать почтовый индекс, а некоторые - нет, что приводит к разным координатам по существу для одной и той же вещи). В чем причина этого и как правильно работать вокруг него (получить одинаковые координаты для всех случаев без запроса почтового индекса в поле ввода)?

-Я обнаружил, что, если не включить почтовый индекс в вызов API Geocode, координаты искомого места находятся точно в том же месте, где Google отображает название населенного пункта на карте (метка). -При включении почтового индекса координаты кажутся произвольно смещенными на 500-1000 метров.

Я использовал эти вызовы API для экспериментов (добавьте свой собственный ключ API):

  1. Нет Почтовый индекс:

https://maps.googleapis.com/maps/api/geocode/json?address=richterswil&components=country:CH&key=YOUR_API_KEY&language=de

  1. Почтовый индекс:

https://maps.googleapis.com/maps/api/geocode/json?address=8805+richterswil&components=country:CH&key=YOUR_API_KEY&language=de

  1. Ответ (без почтового индекса):
{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "Richterswil",
               "short_name" : "Richterswil",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Horgen",
               "short_name" : "Horgen",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Zürich",
               "short_name" : "ZH",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Schweiz",
               "short_name" : "CH",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "Richterswil, Schweiz",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 47.2335482,
                  "lng" : 8.7409239
               },
               "southwest" : {
                  "lat" : 47.18228,
                  "lng" : 8.661769999999999
               }
            },
            "location" : {
               "lat" : 47.2053892,
               "lng" : 8.7070691
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 47.2335482,
                  "lng" : 8.7409239
               },
               "southwest" : {
                  "lat" : 47.18228,
                  "lng" : 8.661769999999999
               }
            }
         },
         "place_id" : "ChIJO0JjJ6CxmkcRLdEGdhgDTXg",
         "types" : [ "locality", "political" ]
      }
   ],
   "status" : "OK"
}
  1. Ответ (включая почтовый индекс):
{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "8805",
               "short_name" : "8805",
               "types" : [ "postal_code" ]
            },
            {
               "long_name" : "Richterswil",
               "short_name" : "Richterswil",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Horgen",
               "short_name" : "Horgen",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Zürich",
               "short_name" : "ZH",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Schweiz",
               "short_name" : "CH",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "8805 Richterswil, Schweiz",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 47.2201589,
                  "lng" : 8.713399599999999
               },
               "southwest" : {
                  "lat" : 47.1962357,
                  "lng" : 8.679173199999999
               }
            },
            "location" : {
               "lat" : 47.2097073,
               "lng" : 8.696259999999999
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 47.2201589,
                  "lng" : 8.713399599999999
               },
               "southwest" : {
                  "lat" : 47.1962357,
                  "lng" : 8.679173199999999
               }
            }
         },
         "place_id" : "ChIJ-Ub3o--xmkcRNqm0YtWPm1U",
         "types" : [ "postal_code" ]
      }
   ],
   "status" : "OK"
}

1 Ответ

2 голосов
/ 10 апреля 2019

Это потому, что у locales и postal_codes разные территории, они не совпадают. Вы можете проверить это в Картах Google.

Нет почтового индекса

Почтовый индекс включен

Но большинство населенных пунктов имеют только один почтовый индекс.

Я не думаю, что это хорошее предположение для вашего кода, поскольку во многих странах есть несколько почтовых индексов в одной местности.

Именно поэтому в ответе Geocoding API .

существует поле postcode_localities[].

Что касается ваших запросов:

Нет Почтовый индекс: https://maps.googleapis.com/maps/api/geocode/json?address=richterswil&components=country:CH&key=YOUR_API_KEY&language=de

Этот пункт указывает координаты в приблизительном центре "Рихтерсвиль, Швейц", где он отмечен согласно карте, посмотрите, как он находится на верхней части метки:

https://google-developers.appspot.com/maps/documentation/utils/geocoder/#place_id%3DChIJO0JjJ6CxmkcRLdEGdhgDTXg

Почтовый индекс включен: https://maps.googleapis.com/maps/api/geocode/json?address=8805+richterswil&components=country:CH&key=YOUR_API_KEY&language=de

Для этого он указывает на центр почтового индекса, показанного в ссылке Google Maps выше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...