对地址进行地理编码

欧洲经济区 (EEA) 开发者

地理编码会将地址转换为地图上的某个位置。对地址进行地理编码时,响应包含以下信息:

  • 相应位置的地点 ID
  • 相应位置的纬度和经度坐标
  • 营业地点的 Plus Code
  • 展开的地址详情

地理编码请求

地理编码请求是一种 HTTP GET 请求。您可以将地址指定为非结构化字符串

https://geocode.googleapis.com/v4beta/geocode/address/ADDRESS_STRING

或者,以由查询参数表示的结构化地址组成部分集的形式:

https://geocode.googleapis.com/v4beta/geocode/address?STRUCTURED_ADDRESS

您通常会在处理 HTML 表单中捕获的地址组成部分时使用结构化格式。

将所有其他参数作为网址参数传递,或者对于 API 密钥和字段掩码等参数,在标头中作为 GET 请求的一部分传递。

传递非结构化地址字符串

非结构化地址是指格式为字符串或 Plus Code 的地址。例如,以下示例传递了网址编码的地址字符串“1600 Amphitheatre Parkway, Mountain View, CA”:

https://geocode.googleapis.com/v4beta/geocode/address/1600+Amphitheatre+Parkway,+Mountain+View,+CA?key=API_KEY

请注意,网址中的“+”字符会转换为空格。

您还可以使用 curl 命令发出请求:

curl -H "X-Goog-Api-Key: API_KEY" \
"https://geocode.googleapis.com/v4beta/geocode/address/1600+Amphitheatre+Parkway,+Mountain+View,+CA"

地址可以包含多种类型的特殊字符。例如,“7/1 King St, Concord West”中的“/”。将“/”网址编码为 %2F

https://geocode.googleapis.com/v4beta/geocode/address/7%2F1+King+St,+Concord+West
?key=API_KEY

另一个常见示例是“#”字符,例如“9500 W Bryn Mawr Ave #650, Rosemont”。将“#”网址编码为 %2FE

https://geocode.googleapis.com/v4beta/geocode/address/9500+W+Bryn+Mawr+Ave+%23650,+Rosemont?key=API_KEY

在下一个示例中,您将指定一个非结构化地址字符串作为 Plus Code 849VCWC8+R4。确保您将“+”字符进行网址编码,编码为 %2B

https://geocode.googleapis.com/v4beta/geocode/address/849VCWC8%2BR4?key=API_KEY

传递结构化地址

使用 address 查询参数(类型为 PostalAddress)指定结构化地址。借助 PostalAddress 对象,您可以在请求中将部分或所有地址组成部分指定为单独的查询参数。

例如,如需仅指定地址的邮政编码,请使用 PostalAddress.postalCode

https://geocode.googleapis.com/v4beta/geocode/address?address.postalCode=01062&key=API_KEY

如需指定多个地址组成部分(例如 HTML 表单中捕获的地址组成部分),请使用多个查询参数:

https://geocode.googleapis.com/v4beta/geocode/address?address.addressLines=1600+Amphithreater+Pkwy&address.locality=Mountain+View&address.administrativeArea=CA&key=API_KEY

使用 OAuth 发出请求

Geocoding API v4 支持使用 OAuth 2.0 进行身份验证。如需将 OAuth 与 Geocoding API 搭配使用,必须为 OAuth 令牌分配正确的范围。Geocoding API 支持以下范围,可用于正向地理编码:

  • https://www.googleapis.com/auth/maps-platform.geocode - 与所有 Geocoding API 端点搭配使用。
  • https://www.googleapis.com/auth/maps-platform.geocode.address - 仅与 GeocodeAddress 搭配使用,用于正向地理编码。

此外,您还可以为所有 Geocoding API 端点使用常规 https://www.googleapis.com/auth/cloud-platform 范围。该范围在开发期间很有用,但在生产期间则不然,因为这是一个通用范围,允许访问所有端点。

如需了解详情和示例,请参阅使用 OAuth

地理编码响应

地理编码会返回一个 GeocodeAddressResponse 对象,其中包含 GeocodeResult 对象的 results 数组。每个 GeocodeResult 对象都表示一个地点。

完整的 JSON 对象采用以下格式:

{
  "results": [
    {
      "place": "//places.googleapis.com/places/ChIJF4Yf2Ry7j4AR__1AkytDyAE",
      "placeId": "ChIJF4Yf2Ry7j4AR__1AkytDyAE",
      "location": {
        "latitude": 37.422010799999995,
        "longitude": -122.08474779999999
      },
      "granularity": "ROOFTOP",
      "viewport": {
        "low": {
          "latitude": 37.420656719708511,
          "longitude": -122.08547523029148
        },
        "high": {
          "latitude": 37.4233546802915,
          "longitude": -122.0827772697085
        }
      },
      "formattedAddress": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
      "postalAddress": {
        "regionCode": "US",
        "languageCode": "en",
        "postalCode": "94043",
        "administrativeArea": "CA",
        "locality": "Mountain View",
        "addressLines": [
          "1600 Amphitheatre Pkwy"
        ]
      },
      "addressComponents": [
        {
          "longText": "1600",
          "shortText": "1600",
          "types": [
            "street_number"
          ]
        },
        {
          "longText": "Amphitheatre Parkway",
          "shortText": "Amphitheatre Pkwy",
          "types": [
            "route"
          ],
          "languageCode": "en"
        },
        ...
      ],
      "types": [
        "street_address"
      ],
      "plusCode": {
        "globalCode": "849VCWC8+R4",
        "compoundCode": "CWC8+R4 Mountain View, CA, USA"
      }
    }
  ]
}

必需参数

  • address - 要进行地理编码的街道地址或 Plus Code。根据相关国家/地区的邮政服务所使用的地址格式指定地址。应避免使用其他地址元素,例如企业名称以及单元号、房间号或楼层号。街道地址元素应以空格分隔,并进行网址编码,编码为 %20。例如,传递地址“24 Sussex Drive Ottawa ON”时,应采用以下格式:
    24%20Sussex%20Drive%20Ottawa%20ON
    按如下所示设置 Plus Code 的格式。加号经网址编码为 %2B,空格经网址编码为 %20
    • 全局代码是包含 4 个字符的区号和至少包含 6 个字符的区域代码。例如,将“849VCWC8+R9”编码为 849VCWC8%2BR9
    • 混合代码是至少包含 6 个字符的区域代码,具有明确的位置信息。例如,将“CWC8+R9 Mountain View, CA, USA”编码为 CWC8%2BR9%20Mountain%20View%20CA%20USA

可选参数

  • locationBias

    指定要搜索的区域,格式为 Viewport。 此位置用作偏差,这意味着系统可以返回指定位置附近的结果,包括该区域附近但不在该区域内的结果。

    将区域指定为矩形视口。矩形是一个纬度-经度视口,表示为两个对角线相对的低点和高点。低点标记矩形的西南角,高点表示矩形的东北角。

    视口被视为一个闭合区域,这意味着它包含其边界。纬度范围必须介于 -90 度到 90 度之间(含),经度范围必须介于 -180 度到 180 度之间(含):

    • 如果 low = high,则视口由该单个点组成。
    • 如果 low.longitude > high.longitude,则经度范围会反转(视口会跨越 180 度经度线)。
    • 如果 low.longitude = -180 度且 high.longitude = 180 度,则视口包含所有经度。
    • 如果 low.longitude = 180 度且 high.longitude = -180 度,则经度范围为空。
    • 如果 low.latitude > high.latitude,则纬度范围为空。

    必须同时填充下限和上限,并且所表示的框不得为空。空视口会导致错误。

    例如,此查询字符串定义了一个完全包含纽约市的视口:

    ?locationBias.rectangle.low.latitude=40.477398&locationBias.rectangle.low.longitude=-74.259087&locationBias.rectangle.high.latitude=40.91618&locationBias.rectangle.high.longitude=-73.70018
  • languageCode

    返回结果所用的语言。

    • 请参阅支持的语言列表。Google 会经常更新支持的语言,因此该列表可能并非详尽无遗。
    • 如果未提供 languageCode,API 会默认使用 en。如果您指定的语言代码无效,API 会返回 INVALID_ARGUMENT 错误。
    • 该 API 会尽力提供用户和当地人都能看懂的街道地址。为了实现这一目标,它会返回本地语言的街道地址,并在必要时根据首选语言将地址音译为用户可读的文字。所有其他地址均以首选语言返回。地址组成部分全部以同一种语言返回,该语言是从第一个组成部分中选择的。
    • 如果首选语言中没有相应名称,API 会使用最接近的匹配项。
    • 首选语言对 API 选择返回的结果集以及返回顺序有较小的影响。地理编码器会根据语言以不同的方式解读缩写,例如街道类型的缩写,或者在一种语言中有效但在另一种语言中无效的同义词。
  • regionCode

    地区代码,以 双字符 CLDR 代码值表示。没有默认值。大多数 CLDR 代码都与 ISO 3166-1 代码完全一致。

    在对地址进行地理编码(即正向地理编码)时,此参数可以影响但不会完全限制服务返回指定区域的结果。在对位置或地点进行地理编码时(反向地理编码地点地理编码),可以使用此参数设置地址格式。在任何情况下,此参数都可能会根据适用法律影响结果。

位置信息偏差

使用 locationBias 参数指示地理编码服务优先显示给定视口(表示为边界框)中的结果。locationBias 参数定义了此边界框的西南角和东北角的纬度/经度坐标。

例如,针对地址“华盛顿”的地理编码请求可以返回华盛顿特区和美国华盛顿州的结果:

https://geocode.googleapis.com/v4beta/geocode/address/Washington?key=API_KEY

响应的格式如下:

{
  "results": [
    {
      "place": "//places.googleapis.com/places/ChIJW-T2Wt7Gt4kRKl2I1CJFUsI",
      "placeId": "ChIJW-T2Wt7Gt4kRKl2I1CJFUsI",
      "location": {
        "latitude": 38.9071923,
        "longitude": -77.0368707
      },
      "granularity": "APPROXIMATE",
      "viewport": {
        "low": {
          "latitude": 38.7916449,
          "longitude": -77.119759
        },
        "high": {
          "latitude": 38.9958641,
          "longitude": -76.909393
        }
      },
      "bounds": {
        "low": {
          "latitude": 38.7916449,
          "longitude": -77.119759
        },
        "high": {
          "latitude": 38.9958641,
          "longitude": -76.909393
        }
      },
      "formattedAddress": "Washington, DC, USA",
      "addressComponents": [
        {
          "longText": "Washington",
          "shortText": "Washington",
          "types": [
            "locality",
            "political"
          ],
          "languageCode": "en"
        },
        ...
      ],
      "types": [
        "locality",
        "political"
      ]
    },
    {
      "place": "//places.googleapis.com/places/ChIJ-bDD5__lhVQRuvNfbGh4QpQ",
      "placeId": "ChIJ-bDD5__lhVQRuvNfbGh4QpQ",
      "location": {
        "latitude": 47.7510741,
        "longitude": -120.7401386
      },
      "granularity": "APPROXIMATE",
      "viewport": {
        "low": {
          "latitude": 45.543541,
          "longitude": -124.84897389999999
        },
        "high": {
          "latitude": 49.0024945,
          "longitude": -116.91607109999998
        }
      },
      "bounds": {
        "low": {
          "latitude": 45.543541,
          "longitude": -124.84897389999999
        },
        "high": {
          "latitude": 49.0024442,
          "longitude": -116.91607109999998
        }
      },
      "formattedAddress": "Washington, USA",
      "addressComponents": [
        {
          "longText": "Washington",
          "shortText": "WA",
          "types": [
            "administrative_area_level_1",
            "political"
          ],
          "languageCode": "en"
        },
      ...
      ],
      "types": [
        "administrative_area_level_1",
        "political"
      ]
    }
  ]
}

不过,如果我们添加一个 locationBias 参数,将边界框定义在美国东北部周围,那么此地理编码只会返回华盛顿特区:

https://geocode.googleapis.com/v4beta/geocode/address/Washington?locationBias.rectangle.low.latitude=36.47&locationBias.rectangle.low.longitude=-84.72&locationBias.rectangle.high.latitude=43.39&locationBias.rectangle.high.longitude=-65.90&key=API_KEY

区域偏向

在地理编码请求中,您可以使用 regionCode 参数指示地理编码服务返回偏向特定地区的结果。此参数采用 双字符 CLDR 代码值,用于指定地区偏差。大多数 CLDR 代码都与 ISO 3166-1 代码相同。

regionCode 没有默认值。例如,“Toledo”的地理编码会返回美国和西班牙的结果:

https://geocode.googleapis.com/v4beta/geocode/address/Toledo?key=API_KEY

回答:

{
  "results": [
    {
      "place": "//places.googleapis.com/places/ChIJeU4e_C2HO4gRRcM6RZ_IPHw",
      "placeId": "ChIJeU4e_C2HO4gRRcM6RZ_IPHw",
      "location": {
        "latitude": 41.652805199999996,
        "longitude": -83.5378674
      },
      "granularity": "APPROXIMATE",
      "viewport": {
        "low": {
          "latitude": 41.579513,
          "longitude": -83.6944089
        },
        "high": {
          "latitude": 41.733036,
          "longitude": -83.4493851
        }
      },
      "bounds": {
        "low": {
          "latitude": 41.579513,
          "longitude": -83.6944089
        },
        "high": {
          "latitude": 41.733036,
          "longitude": -83.4493851
        }
      },
      "formattedAddress": "Toledo, OH, USA",
      "addressComponents": [
        {
          "longText": "Toledo",
          "shortText": "Toledo",
          "types": [
            "locality",
            "political"
          ],
          "languageCode": "en"
        },
        ...
      ],
      "types": [
        "locality",
        "political"
      ]
    },
    {
      "place": "//places.googleapis.com/places/ChIJkwyrlqwLag0RiQIn2fdIshM",
      "placeId": "ChIJkwyrlqwLag0RiQIn2fdIshM",
      "location": {
        "latitude": 39.8628296,
        "longitude": -4.0273067
      },
      "granularity": "APPROXIMATE",
      "viewport": {
        "low": {
          "latitude": 39.8116682,
          "longitude": -4.179933
        },
        "high": {
          "latitude": 39.9251319,
          "longitude": -3.8148935
        }
      },
      "bounds": {
        "low": {
          "latitude": 39.8116682,
          "longitude": -4.179933
        },
        "high": {
          "latitude": 39.9251319,
          "longitude": -3.8148935
        }
      },
      "formattedAddress": "Toledo, España",
      "addressComponents": [
        {
          "longText": "Toledo",
          "shortText": "Toledo",
          "types": [
            "administrative_area_level_4",
            "political"
          ],
          "languageCode": "es"
        },
        ...
      ],
      "types": [
        "administrative_area_level_4",
        "political"
      ]
    },
    ...
  ]
}

如果地理编码请求中包含 regionCode=es(西班牙),则“托莱多”的地理编码只会返回西班牙的结果:

https://geocode.googleapis.com/v4beta/geocode/address/Toledo?regionCode=es&key=API_KEY