使用Google Maps API从自治市镇获取城市

时间:2019-10-25 15:51:14

标签: google-maps google-maps-api-3

我需要从给定的美国邮政编码获取城市,而布鲁克林等自治市却遇到了麻烦

我使用地理编码: https://maps.googleapis.com/maps/api/geocode/json?address=11214&key=KEY 它返回此结果

  {
     "address_components": [
        {
           "long_name": "11214",
           "short_name": "11214",
           "types": [
              "postal_code"
           ]
        },
        {
           "long_name": "Brooklyn",
           "short_name": "Brooklyn",
           "types": [
              "political",
              "sublocality",
              "sublocality_level_1"
           ]
        },
        {
           "long_name": "Kings County",
           "short_name": "Kings County",
           "types": [
              "administrative_area_level_2",
              "political"
           ]
        },
        {
           "long_name": "New York",
           "short_name": "NY",
           "types": [
              "administrative_area_level_1",
              "political"
           ]
        },
        {
           "long_name": "United States",
           "short_name": "US",
           "types": [
              "country",
              "political"
           ]
        }
     ],
     "formatted_address": "Brooklyn, NY 11214, USA",
     "geometry": {
        "bounds": {
           "northeast": {
              "lat": 40.6163139,
              "lng": -73.98259999999999
           },
           "southwest": {
              "lat": 40.5788159,
              "lng": -74.014775
           }
        },
        "location": {
           "lat": 40.6046106,
           "lng": -73.9982756
        },
        "location_type": "APPROXIMATE",
        "viewport": {
           "northeast": {
              "lat": 40.6163139,
              "lng": -73.98259999999999
           },
           "southwest": {
              "lat": 40.5788159,
              "lng": -74.014775
           }
        }
     },
     "place_id": "ChIJLzmMV-BawokR4tFzc3LaBFI",
     "types": [
        "postal_code"
     ]
  }

我需要一种将其链接到纽约市的方法,我看到的唯一提示是

   "long_name": "Brooklyn",
           "short_name": "Brooklyn",
           "types": [
              "political",
              "sublocality",
              "sublocality_level_1"
           ]

也许有一种方法可以将布鲁克林作为纽约市的一个子区域,但我找不到它。

1 个答案:

答案 0 :(得分:0)

这是一个棘手的例子。首先,您应该知道Geocoding API仅在地址组件数组中返回用于地址格式化的组件。对于纽约市,地址格式非常具体。使用sublocality_level_1而不是本地地址来格式化地址。

Google Maps API的官方文档中提到了这一事实。

  

请注意,您可能需要使用一组不同的组件才能与某些地区使用的邮政地址格式保持一致。例如,示例代码选择位置组成部分,该部分通常代表地址的城市部分。组件如何不同的示例包括:

     
      
  • 在英国和瑞典,显示城市的组成部分是postal_town。

  •   
  • 在日本,各县的成分有所不同。

  •   
  • 布鲁克林和纽约市的其他地区不包括该城市作为地址的一部分。相反,他们使用sublocality_level_1。

  •   

来源:https://developers-dot-devsite-v2-prod.appspot.com/maps/documentation/javascript/examples/places-autocomplete-addressform

我能想到的唯一解决方法是使用两个请求:

  • 第一个请求邮政编码和国家/地区以获取邮政编码中心的坐标

  • 第二个请求是反向地理编码,用于与第一个具有locality类型的请求的坐标

例如

让我们获取邮政编码11214的坐标

https://maps.googleapis.com/maps/api/geocode/json?components=postal_code%3A11214%7Ccountry%3AUS&key=YOUR_API_KEY

它将作为响应返回坐标

"geometry":{
    "location":{
      "lat":40.6046106,"lng":-73.9982756
    },
    ...
}

现在对结果类型为locality的坐标进行反向地理编码

https://maps.googleapis.com/maps/api/geocode/json?latlng=40.6046106%2C-73.9982756&result_type=locality&key=YOUR_API_KEY

它将返回纽约,因此您可以将邮政编码与纽约市联系起来

{
  "plus_code":{
    "compound_code":"J232+RM New York, NY, USA","global_code":"87G8J232+RM"
  },
  "results":[
    {
      "address_components":[
    {
      "long_name":"New York",
      "short_name":"New York",
      "types":[
        "locality","political"
      ]
    },
    {
      "long_name":"New York",
      "short_name":"NY",
      "types":[
        "administrative_area_level_1","political"
      ]
    },
    {
      "long_name":"United States",
      "short_name":"US",
      "types":[
        "country","political"
      ]
    }
      ],
      "formatted_address":"New York, NY, USA",
      "geometry":{
    "bounds":{
      "northeast":{
        "lat":40.9175771,"lng":-73.70027209999999
      },
      "southwest":{
        "lat":40.4773991,"lng":-74.25908989999999
      }
    },
    "location":{
      "lat":40.7127753,"lng":-74.0059728
    },
    "location_type":"APPROXIMATE",
    "viewport":{
      "northeast":{
        "lat":40.9175771,"lng":-73.70027209999999
      },
      "southwest":{
        "lat":40.4773991,"lng":-74.25908989999999
      }
    }
      },
      "place_id":"ChIJOwg_06VPwokRYv534QaPC8g",
      "types":[
    "locality","political"
      ]
    }
  ],
  "status":"OK"
}

我希望这会有所帮助!