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

地理编码是将地址(“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 网络服务在服务器端发出的每个地理编码请求,都是按每次价格计费。如需管理使用费,请考虑设置每日配额上限

速率限制

地理编码服务的速率限制为 50 QPS(每秒查询次数),计算公式为:客户端和服务器端查询次数之和。

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

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

缓存

有关缓存,请参阅 Geocoding API 政策

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

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

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

具体而言,在根据用户输入对地址进行地理编码时,客户端地理编码是最好的选择。

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

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

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

服务器端地理编码最适合那些要求您在没有客户端输入的情况下对地址进行地理编码的应用。一个常见示例是,您获取独立于用户输入的数据集,例如,您有一组需要进行地理编码的固定有限有限地址。服务器端地理编码还可以用作客户端地理编码失败时的备份。

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