一切就绪!

着手开发前,请先阅读我们的开发者文档

激活 Google Maps Geocoding API

为帮助您起步,我们将引导您在 Google Developers Console 中先完成几项任务:

  1. 创建或选择项目
  2. 激活 Google Maps Geocoding API
  3. 创建相应密钥
继续

优化地理编码时的配额使用

地理编码是将地址(如“1600 Amphitheatre Parkway, Mountain View, CA”)转换为地理坐标 (37.423021, -122.083739) 的过程,可以利用它在地图上放置标记,或在地图上定位。Google Maps API 提供了两种地理编码方法:

  • 客户端地理编码:在浏览器中执行,一般是为了响应用户操作。Google Maps JavaScript API 提供了为您发出请求的类。Google Maps JavaScript API 文档中介绍了这种方法。
  • HTTP 服务器端编码:服务器可直接查询 Google 服务器中的地理编码。Google Maps Geocoding API 是提供此功能的网络服务。通常需要将该服务与运行在服务器端的其他代码集成。Google Maps Geocoding API 文档中介绍了服务器端地理编码。

客户端和服务器端地理编码示例

以下是一个客户端地理编码示例,其作用是:获取地址,对其进行地理编码,将地图中心移至该位置,然后在该处添加一个地图标记:

geocoder = new google.maps.Geocoder();
geocoder.geocode({ 'address': address }, function(results, status) {
  if (status == google.maps.GeocoderStatus.OK) {
    map.setCenter(results[0].geometry.location);
    var marker = new google.maps.Marker({
      map: map,
      position: results[0].geometry.location
    });
  }
});

如需查看更多示例,请参阅 Google Maps JavaScript API 文档

以下是一个使用 Python 发出服务器端地理编码请求的示例:

import urllib2

address="1600+Amphitheatre+Parkway,+Mountain+View,+CA"
key="my-key-here"
url="https://maps.googleapis.com/maps/api/geocode/json?address=%s&key=%s" % (address, key)

response = urllib2.urlopen(url)
jsongeocode = response.read()

这段代码生成的 JSON 对象包含以下内容:

{
  "status": "OK",
  "results": [ {
    "types": street_address,
    "formatted_address": "1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA",
    "address_components": [ {
      "long_name": "1600",
      "short_name": "1600",
      "types": street_number
    }, {
      "long_name": "Amphitheatre Pkwy",
      "short_name": "Amphitheatre Pkwy",
      "types": route
    }, {
      "long_name": "Mountain View",
      "short_name": "Mountain View",
      "types": [ "locality", "political" ]
    }, {
      "long_name": "San Jose",
      "short_name": "San Jose",
      "types": [ "administrative_area_level_3", "political" ]
    }, {
      "long_name": "Santa Clara",
      "short_name": "Santa Clara",
      "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": "94043",
      "short_name": "94043",
      "types": postal_code
    } ],
    "geometry": {
      "location": {
        "lat": 37.4220323,
        "lng": -122.0845109
      },
      "location_type": "ROOFTOP",
      "viewport": {
        "southwest": {
          "lat": 37.4188847,
          "lng": -122.0876585
        },
        "northeast": {
          "lat": 37.4251799,
          "lng": -122.0813633
        }
      }
    }
  } ]
}

服务器端地理编码器还提供 XML 格式作为 JSON 的备用格式。如需查看更多示例,请参阅 Google Maps Geocoding API 文档和适用于 Python 以及其他语言的客户端内容库

配额注意事项

地理编码配额和速率限制是本文所阐述策略的决定性因素。

使用标准计划时,无论是客户端通过浏览器还是服务器端通过 Google Maps Geocoding API 网络服务发出的地理编码请求,均有每日 2,500 个请求的配额。一天的所有请求都会抵消项目配额。要获取更高的每日配额,请按使用限额指南所述启用按需付费。

除了每日配额限制外,地理编码服务还受 50 QPS(每秒查询次数)速率限制,该限制按客户端与服务器端查询次数之和计算。

按固定间隔运行客户端地理编码请求(例如在移动应用中)时,所有用户同时(例如,都在每一分钟的同一秒)发出请求时可能会返回错误。为避免这种情况,可以考虑下列其中一项措施:

  • 使用缓存策略。
  • 按随机间隔发出请求(抖动)。确保整个用户群的请求都是随机发出。
  • 如果针对 Android 进行开发,使用不精确重复闹铃
  • 如果针对 Android 进行开发,选择一种合适的定位策略

对于 Google Maps APIs Premium Plan 客户,API 提供了更高的每日配额。如需了解有关 Google Maps APIs Premium Plan 配额的更多信息,请参阅 Premium Plan 使用速率和限额指南。如果使用 Google Maps APIs Premium Plan 仍会遭遇配额限制,请在 Google Cloud Support Portal 上提交支持请求。

缓存注意事项

Google Maps API 服务条款允许缓存地理编码(也就是说,在有限时间内将它们存储在服务器上)。如果需要反复查询同一地址,就适合使用缓存。不过,切记地理编码结果会随着数据准确性的提高而发生变化。因此,即使已经缓存了数据,也应定期刷新,这样才能确保获得与位置符合度最高的地理编码。

使用客户端地理编码的时机

简言之,“几乎随时可以使用”。原因如下:

  • 客户端请求和响应可带来更快速、交互性更强的用户体验。
  • 客户端请求可加入改善地理编码质量的信息:用户语言、区域和视口。

具体地讲,根据用户输入进行地址地理编码时最适合使用客户端地理编码。

客户端地理编码有两个基本架构:

  • 地理编码和显示都在浏览器内完成。例如,用户在页面上输入一个地址。应用对其进行地理编码。然后页面利用该地理编码在地图上创建一个标记。或者应用利用地理编码进行某种简单分析。不会向服务器发送任何数据。这可以减轻服务器的负荷。
  • 在浏览器内进行地理编码,然后将地理编码发送至服务器。例如,用户在页面上输入一个地址。应用在浏览器内对其进行地理编码。然后应用将数据发送至服务器。作为响应,服务器返回一些数据(例如附近景点)。这样一来,您既可根据自己的数据自定义响应,又可根据需要缓存地理编码。缓存可让您进行更多优化。例如,可以使用地址查询服务器,以确认近期是否缓存了它的地理编码。如果缓存中没有匹配项,则不向浏览器返回任何结果,让浏览器对地址进行地理编码,然后将地理编码传回服务器进行缓存。

使用服务器端地理编码的时机

如果应用要求对无需客户输入的地址进行地理编码,最适合采用服务器端地理编码。举一个常见的例子:您获得的数据集本身无需用户输入,例如需要地理编码的是一组固定、有限并且已知的地址。服务器端地理编码还适合作为客户端地理编码失败时的备份。

一些可能存在的问题是:不必要地增加用户响应延迟时间,以及由于请求中提供的信息较少而导致地理编码结果的质量不如客户端地理编码。

服务器端地理编码应用的基本架构如下:

  • 基于服务器的应用向服务器的地理编码脚本发送地址。
  • 脚本检查缓存以确认地址近期是否进行过地理编码。
  • 若是,则脚本向原始应用返回结果。
  • 若否,则脚本向 Google 发送地理编码请求。在其获得结果后,对结果进行缓存,然后将结果返回给原始应用。

结论

一般而言,将客户端地理编码与缓存结合使用便可满足您的大多数需求。如果遭遇配额问题,请考虑启用收费购买一个 Premium Plan 许可证。

发送以下问题的反馈:

此网页
Google Maps Geocoding API
Google Maps Geocoding API
需要帮助?请访问我们的支持页面