Вы можете выполнить 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