Google 地理编码 API - return 基于邮政编码的任何有效地址

Google Geocoding API - return any valid address based of zip code

我需要 return 邮政编码周围存在的任何(至少一个)有效地址。 国家永远不变

我怎样才能做到这一点?

谢谢,

您可以通过 2 个请求完成此操作,使用第一个请求的输出作为第二个请求的输入。最后概述了一些注意事项。

请求 1
根据邮政编码获取数据:

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

根据您的回复,您将需要 results[0].geometry.location 对象。您将在下一个查询中使用 latlng 值。上面的示例提供了以下内容:

   // … 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

这可能会 return 很多结果,您必须决定哪种类型满足您的要求,但我建议循环遍历结果数组并查找具有 types 数组的条目包括 street_addresspremise 并将该条目用作目标结果集。

对于上面的示例,results[1] 将有 "types" : [ "premise" ] 其关联的formatted_address和完整的父对象如下:

  • 请参阅底部关于定位特定类型的注释
"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

注意事项

  • 我假设你说 "Zip Code" 你指的是美国。我只针对美国进行了测试,如果您需要其他国家/地区的支持,请考虑将国家/地区代码添加到请求 1 中的地址查询参数中。
  • 如果您使用此方法以邮政编码开头,您可能会遇到带有 routestreet_address 的结果,但如果邮政编码代表具有人口密度非常低。我在 "Vernon, California (90058) - population 112" 和 "Freeport City, Kansas (67049) - population 5" 上测试了这个。自由港市 return 没有 premise.
  • 类型的结果
  • 如果您想查询特定类型,而不必搜索大量结果集,您可以将查询参数 &result_type=premise 应用于请求 2。但是,如果没有结果存在给定 lat/lng 与您指定的类型,您将收到 results.status = ZERO_RESULTS.
  • 可以应用多个 result_type 值,用竖线分隔 (|)
  • 这里有关于反向地理编码的完整文档:https://developers.google.com/maps/documentation/geocoding/intro#ReverseGeocoding