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

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

  • 客户端地理编码:通常为了响应用户操作而在浏览器中执行。Maps JavaScript API 提供了可为您发出请求的类。Maps JavaScript API 文档中介绍了此方法。
  • HTTP 服务器端地理编码,让您的服务器可以直接查询 Google 服务器进行地理编码。Geocoding API 是提供此功能的网络服务。通常,您可以将此服务与在服务器端运行的其他代码集成。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
    });
  }
});

如需查看更多示例,请参阅 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 的替代方案。如需查看更多示例,请参阅 Geocoding API 文档以及 Python 和其他语言的客户端库

配额和费用注意事项

地理编码费用、配额和速率限制决定了本文档中概述的策略。

费用

地理编码请求 不再使用每日配额 (QPD) 限制。相反,每个地理编码请求(无论是通过浏览器在客户端发送,还是通过 Geocoding API 网络服务在服务器端发送)都将按每个价格计费。如需管理使用费,请考虑设置每日配额上限

速率限制

地理编码服务的速率限制为 3,000 QPM(每分钟查询次数),计算方法为客户端和服务器端查询次数之和。

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

  • 在请求中引入随机间隔(抖动)。确保整个用户群中的请求都是随机的。
  • 如果是针对 Android 进行开发,请使用不精确重复闹钟
  • 如果是针对 Android 进行开发,请选择适当的位置策略

缓存

如需了解缓存,请参阅 Geocoding API 政策

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

简而言之,“几乎总是”原因如下:

  • 客户端请求和响应可为用户提供更快、更具互动性的体验。
  • 客户端请求可以包含用于提高地理编码质量的信息:用户语言、区域和视口。

具体而言,根据用户输入的内容对地址进行地理编码时,最好使用客户端地理编码。

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

  • 地理编码和显示完全在浏览器中进行。例如,用户在网页上输入地址。您的应用对其进行地理编码。然后,您的网页使用该地理编码在地图上创建一个标记。或者,您的应用使用地理编码执行一些简单的分析。系统不会向您的服务器发送任何数据。 这可以减轻服务器的负荷。
  • 请在浏览器中进行地理编码,然后将其发送至服务器。 例如,用户在网页上输入地址。您的应用在浏览器中对其进行地理编码。然后,应用会将数据发送到您的服务器。服务器会返回一些数据(例如附近的地图注点)作为响应。这样,您就可以根据自己的数据自定义响应。

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

服务器端地理编码最适合需要对无需客户端输入的地址进行地理编码的应用。一个常见的示例是,您获取的数据集独立于用户输入,例如您有一组固定的、有限且已知的地址需要地理编码。服务器端地理编码还可作为客户端地理编码失败时的备用方案。

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