Google Geocoding API - вернуть любой действительный адрес на основе почтового индекса - PullRequest
1 голос
/ 28 марта 2020

Мне нужно вернуть любой (хотя бы один) действительный адрес, который существует вокруг почтового индекса. Страна всегда будет одна и та же.

Как мне этого добиться?

Спасибо,

1 Ответ

1 голос
/ 02 апреля 2020

Вы можете выполнить sh через 2 запроса, используя вывод первого в качестве ввода для второго. В конце приведено несколько предупреждений.

Запрос 1
Получение данных на основе почтового индекса:

curl --location --request GET 'https://maps.googleapis.com/maps/api/geocode/json?address=90058&key={{YOUR_API_KEY}}'

Из вашего ответа вы захотите возьмите results[0].geometry.location объект. Для следующего запроса вы будете использовать значения lat и lng. В приведенном выше примере показано следующее:

   // … more above
        "formatted_address" : "Los Angeles, CA 90058, USA",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 34.045639,
                  "lng" : -118.1685449
               },
               "southwest" : {
                  "lat" : 33.979672,
                  "lng" : -118.2435201
               }
            },
            "location" : {
               "lat" : 34.00637469999999,
               "lng" : -118.2234229
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 34.045639,
                  "lng" : -118.1685449
               },
               "southwest" : {
                  "lat" : 33.979672,
                  "lng" : -118.2435201
               }
            }
         },
         "place_id" : "ChIJDeH8s8TIwoARYQFWkBcCzFk",

   // … more below

Запрос 2
Получение данных на основе широты и долготы

curl --location --request GET 'https://maps.googleapis.com/maps/api/geocode/json?latlng=34.00637469999999,-118.2234229&key={{YOUR_API_KEY}}'

ПРИМЕЧАНИЕ! Параметр запроса изменился с address на latlng

Это, вероятно, вернет много результатов, вам придется решить, какой тип соответствует вашим требованиям, но я бы порекомендовал пройтись по массиву результатов и ищем запись с массивом types, которая включает в себя street_address или premise, и используем эту запись в качестве целевого набора результатов.

Для приведенного выше примера results[1] будет иметь "types" : [ "premise" ]. formatted_address, и весь родительский объект будет выглядеть следующим образом:

  • см. Примечание внизу о спецификах таргетинга c types
"formatted_address" : "2727 E Vernon Ave, Vernon, CA 90058, USA",

   // … more above
      {
         "address_components": [
            {
               "long_name": "2727",
               "short_name": "2727",
               "types": [
                  "street_number"
               ]
            },
            {
               "long_name": "East Vernon Avenue",
               "short_name": "E Vernon Ave",
               "types": [
                  "route"
               ]
            },
            {
               "long_name": "Vernon",
               "short_name": "Vernon",
               "types": [
                  "locality",
                  "political"
               ]
            },
            {
               "long_name": "Los Angeles County",
               "short_name": "Los Angeles County",
               "types": [
                  "administrative_area_level_2",
                  "political"
               ]
            },
            {
               "long_name": "California",
               "short_name": "CA",
               "types": [
                  "administrative_area_level_1",
                  "political"
               ]
            },
            {
               "long_name": "United States",
               "short_name": "US",
               "types": [
                  "country",
                  "political"
               ]
            },
            {
               "long_name": "90058",
               "short_name": "90058",
               "types": [
                  "postal_code"
               ]
            },
            {
               "long_name": "1822",
               "short_name": "1822",
               "types": [
                  "postal_code_suffix"
               ]
            }
         ],
         "formatted_address": "2727 E Vernon Ave, Vernon, CA 90058, USA",
         "geometry": {
            "bounds": {
               "northeast": {
                  "lat": 34.0065676,
                  "lng": -118.2228652
               },
               "southwest": {
                  "lat": 34.0057081,
                  "lng": -118.2245065
               }
            },
            "location": {
               "lat": 34.0061691,
               "lng": -118.2236056
            },
            "location_type": "ROOFTOP",
            "viewport": {
               "northeast": {
                  "lat": 34.0074868302915,
                  "lng": -118.2223368697085
               },
               "southwest": {
                  "lat": 34.0047888697085,
                  "lng": -118.2250348302915
               }
            }
         },
         "place_id": "ChIJCQv2_sPIwoARZn8W2bF9a9g",
         "types": [
            "premise"
         ]
      },

   // … more below

Предостережения

  • Полагаю, с тех пор, как вы сказали "почтовый индекс", вы имели в виду Соединенные Штаты. Я тестировал только в США. Если вам нужна поддержка другой страны, рассмотрите возможность добавления кода страны к параметрам вашего адреса в запросе 1.
  • Если вы используете этот подход, начиная с почтового индекса, вы можете столкнуться с результатами с route или street_address, но не premise, если почтовый индекс представляет большую географическую область c с очень низкой плотностью населения. Я проверил это на «Вернон, Калифорния (90058) - население 112» и «Фрипорт-Сити, Канзас (67049) - население 5». Город Фрипорт не дал результата с типом premise.
  • Если вы хотите запросить определенный тип c, чтобы вам не приходилось искать большой набор результатов, вы можете применить параметр запроса &result_type=premise по запросу 2. Однако, если для заданного типа широта / долгота с указанным типом (типами) результата не существует, вы получите results.status = ZERO_RESULTS.
  • Несколько значений result_type могут быть применены, разделить с помощью трубы (|)
  • Полный документ здесь по обратному геокодированию: https://developers.google.com/maps/documentation/geocoding/intro#ReverseGeocoding
...