Как надежно найти почтовый индекс по обратному геокодированию Google

Мне нужно получить репрезентативный канадский почтовый индекс, основанный на названии города и провинции. Мой первоначальный подход заключался в использовании API геокодирования Google для преобразования города, провинции в [lat,lng] обратный геокод, чтобы получить соответствующий адрес и извлечь из него почтовый индекс. Город и провинция берутся из формы, в которой используется автозаполнение Google Maps, поэтому я знаю, что они (по крайней мере, почти) всегда будут действительными. В некоторых тестах это работает нормально, но я быстро обнаружил, что наши фактические данные не работают: Снежное озеро, Манитоба.

https://maps.googleapis.com/maps/api/geocode/json?address=Snow+Lake%2C+Manitoba&key=MYKEY

В разделе геометрии я получаю:

location    
    lat 54.87856679999999
    lng -100.0220321
location_type   "APPROXIMATE"

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

https://maps.googleapis.com/maps/api/geocode/json?latlng=54.8785668,-100.0220321&key=MYKEY.

Я также пробовал это с place_id, который возвращается от разных вещей, но безуспешно. Странно то, что если я ищу Snow Lake, Manitoba на обычном сайте Google Maps, он определяет его и сообщает мне почтовый индекс R0B 1M0. Так почему их сайт дает хорошую информацию, а не API? Даже если я заменю местоположение в моем втором URL-адресе местоположением, которое Google Maps имеет в URL-адресе после моего поиска (54.8808471, -100.0274579), я все равно не получу почтовый индекс, как и я, если я использую адрес, который это дает для этого места (531 Lakeshore Drive).

Методом проб и ошибок (глядя на карту Google на предмет названий улиц) я обнаружил, что поиск 117 Balsam St. дает и почтовый индекс, и местоположение, которое я могу изменить геокодирование, чтобы получить почтовый индекс. Но в моих входящих данных нет названий или номеров улиц, только город и провинция, так что это не решение. Этот адрес действительно дает мне ROOFTOP для location_type, а не APPROXIMATE или RANGE_INTERPOLATED, которые я получаю для некоторых других.

Кто-нибудь знает, в чем дело? Есть ли надежный метод, который я могу использовать, чтобы получить то, что мне нужно, из этого API, или это будет просто промах?


person Greg Schmidt    schedule 13.12.2017    source источник


Ответы (1)


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

  1. Почтовый индекс QC H1H. Если вы посмотрите на этот почтовый индекс в Google Maps, вы увидите, что он имеет многоугольную геометрию, как показано на моем снимке экрана.

https://www.google.com/maps/place/Montr%C3%A9al-Nord,+QC+H1H,+Canada/@45.5755194,-73.6272394,14z/data=!4m5!3m4!1s0x4cc91f6dd2d3b269:0xc3ff559c136d8af2!8m2!3d45.5893471!4d-73.6419587

введите описание изображения здесь

Поэтому, если вы укажете точку внутри этого многоугольника, например 45.594402, -73.642216, и выполните обратное геокодирование, указав также, что тип результата должен быть почтовым индексом, вы получите результат

https://maps.googleapis.com/maps/api/geocode/json?latlng=45.594402%2C-73.642216&result_type=postal_code&key=YOUR_API_KEY

  1. Почтовый индекс R0B 1M0 из вашего примера. Если вы посмотрите на этот почтовый индекс в Картах Google, вы увидите, что этот почтовый индекс не имеет многоугольной геометрии. Это определено как единая точка.

https://www.google.com/maps/place/Snow+Lake,+MB+R0B+1M0,+Canada/@54.8792581,-100.0226575,17.04z/data=!4m5!3m4!1s0x52f631c0d3937ca9:0x143db2e5b7611e34!8m2!3d54.880844!4d-100.0252639

введите описание изображения здесь

По этой причине обратное геокодирование не работает и возвращает ZERO_RESULTS.

https://maps.googleapis.com/maps/api/geocode/json?latlng=54.87856679999999%2C-100.0220321&result_type=postal_code&key=YOUR_API_KEY

Я считаю, что это проблема с данными на стороне Google, и вы можете сообщить об этом в Google, следуя справке Google Maps:

https://support.google.com/maps/answer/3094088

Я могу предложить следующий обходной путь в случае, если почтовый индекс не имеет связанной геометрии многоугольника:

  • Выполнить поиск по API Адресов с координатами для местности и радиуса, например, 2–5 км с типом, установленным для почтового отделения.

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=54.87856679999999%2C-100.0220321&radius=2000&type=post_office&key=YOUR_API_KEY

Запрос возвращает почтовое отделение с идентификатором места ChIJp3yT08Ax9lIRk0eG4BkTvXg.

  • Выполнить запрос геокодирования для вышеупомянутого идентификатора места

https://maps.googleapis.com/maps/api/geocode/json?place_id=ChIJp3yT08Ax9lIRk0eG4BkTvXg&key=YOUR_API_KEY

Извлечь почтовый индекс из компонентов адреса почтового отделения

{
    "address_components":[
    {
      "long_name":"81",
      "short_name":"81",
      "types":[
        "street_number"
      ]
    },
    {
      "long_name":"Balsam Street",
      "short_name":"Balsam St",
      "types":[
        "route"
      ]
    },
    {
      "long_name":"Snow Lake",
      "short_name":"Snow Lake",
      "types":[
        "locality","political"
      ]
    },
    {
      "long_name":"Division No. 21",
      "short_name":"Division No. 21",
      "types":[
        "administrative_area_level_2","political"
      ]
    },
    {
      "long_name":"Manitoba",
      "short_name":"MB",
      "types":[
        "administrative_area_level_1","political"
      ]
    },
    {
      "long_name":"Canada",
      "short_name":"CA",
      "types":[
        "country","political"
      ]
    },
    {
      "long_name":"R0B 1M0",
      "short_name":"R0B 1M0",
      "types":[
        "postal_code"
      ]
 }

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

person xomena    schedule 15.12.2017
comment
Замечательно, большое спасибо! Это прекрасно работает. Я начал задавать другой вопрос о том, что это не дало мне результатов для Лондона, Онтарио, а не для Лондона, Англия, но затем он загадочным образом начал работать. Возможно, со всеми моими отладочными запросами теперь было обучено, что меня интересуют только канадские адреса ... - person Greg Schmidt; 18.12.2017
comment
Привет, @xomen, есть ли известный список областей, в которых карты Google не предоставляют почтовый индекс в случае обратного геокодирования. Мне нужно будет реализовать альтернативное решение, в зависимости от того, насколько велик список. Итак, это что-то известно или нет. Кроме того, я попробовал альтернативное решение, как вы рекомендовали при использовании радиуса, но в некоторых случаях оно не работает даже через 10 км. Так что не уверен, можно ли это использовать. - person whyAto8; 01.12.2018