优化指南

本指南从安全性、性能和消耗这三个方面介绍了优化 Google Maps API 用量的几种策略。

安全

查看安全性最佳实践

API 密钥是以项目为中心的凭据,为其采取的预防措施应与用户 ID 和密码相同。请参阅 API 安全性最佳实践来保管您的密钥,防止其被意外使用,因为这可能导致过度使用配额,使您的帐号产生意料之外的费用。

使用 API 密钥访问 Maps API

API 密钥是访问 Google Maps API 的首选身份验证方法。虽然目前仍支持使用客户端 ID 进行身份验证,但 API 密钥支持更精细的安全控制措施,并且经过调整后可与特定网址、IP 地址和移动 SDK(Android 和 iOS)配合使用。如需了解如何创建及保管 API 密钥,请前往各个 API 或 SDK 所对应的“使用 API 密钥”页面(例如,如果您使用的是 Maps JavaScript API,请访问该 API 对应的使用 API 密钥页面)。

性能

使用指数退避算法处理错误

如果您的应用因短时间内尝试调用 API 的次数过多而出现错误(如 QPS 错误),请考虑使用指数退避算法来处理请求。

指数退避算法最适合处理 500 系列错误。如需了解详情,请参阅处理 HTTP 返回状态代码

具体而言,您可以调整查询的节奏。在代码中,添加一个时长为 S 秒的等待期来表示两次查询之间等待的时长。如果查询仍导致 QPS 错误,请将等待期延长一倍,然后再发送另一个查询。继续调整等待期,直到查询不再返回错误。

按需发送用户互动请求

仅应在需要时才向 API 发送包含用户互动的请求。这意味着,需要等到最终用户执行某项操作(例如 on-click)后再发起 API 请求,然后使用结果来加载地图、设置目的地或显示适当的信息。在需要时再发送可避免向 API 发出不必要的请求,从而减少 API 消耗。

不要在地图移动时显示叠加层内容

当用户可能在移动地图时,不要使用 Draw() 方法在地图上显示自定义叠加层内容。每次用户移动地图时,系统都会重新绘制地图,因此,在用户移动地图的同时在地图上放置叠加层内容可能会导致延迟或视觉卡顿。请仅在用户停止平移或缩放后,才在地图上添加或从中移除叠加层内容。

不要通过 Draw 方法执行密集型操作

一般来说,最好不要在 Draw() 方法中执行对性能要求较高的非绘制操作。例如,应避免在 Draw() 方法的代码中执行以下操作:

  • 将返回大量内容的查询。
  • 对当前显示的数据进行很多项更改。
  • 处理很多个文档对象模型 (DOM) 元素。

这些操作可能会降低性能,并且可能会在地图渲染时造成延迟或视觉卡顿。

使用光栅图片作为标记

在地图上添加标记来标识位置时,请使用光栅图片(例如 .PNG 或 .JPG 格式的图片)。不要使用可缩放矢量图形 (SVG) 图片,因为在重新绘制地图时,渲染 SVG 图片可能会导致延迟。

优化标记

您可以通过优化将多个标记渲染为单个静态元素,从而提高性能。在需要大量标记的情况下,这是非常实用的做法。默认情况下,Maps JavaScript API 将决定是否优化标记。如果存在大量标记,Maps JavaScript API 将尝试在渲染标记时进行优化。并非所有标记都可以进行优化;在某些情况下,Maps JavaScript API 可能需要在不进行优化的情况下渲染标记。对于动画 GIF 或 PNG 或者在必须将每个标记渲染为单独的 DOM 元素的情况下,应停用优化渲染。

创建聚类来管理标记的显示

为便于管理标记(用于在地图上标识位置)的显示,可以使用标记聚类器库创建一个标记聚类。标记聚类器库包含以下选项:

  • 网格大小:用于指定要组合到一个聚类中的标记数量。
  • 最大缩放级别:用于指定在显示该聚类时可采用的最大缩放级别。
  • 图片路径,用于指定要用作标记图标的图片。

消耗

为了规划预算并控制费用,可以采取以下措施:

  • 设置预算提醒,以跟踪您的费用是如何达到特定金额的。设置预算不会限制 API 的使用,只会在费用接近指定金额时提醒您。
  • 限制每日 API 用量,以管理可结算 API 的费用。通过设置每日请求数上限,您可以限制费用。使用一个简单的等式即可确定每日请求数上限,上限取决于您希望支出的金额:(每月费用/每个请求的价格)/30 = 每日请求数上限(针对一个 API)。您在具体实现时可能会使用多个可计费的 API,因此请根据需要调整该等式。您每月可获得 200 美元的 Google Maps API 赠金,因此计算时务必考虑到这一点。
  • 使用多个项目将不同的使用情形分开、指定它们各自的优先级,并分别跟踪它们的用量。例如,假设您经常在测试中使用 Google Maps Platform API。通过为测试单独创建一个项目(使其有自己专用的配额和 API 密钥),您可以进行全面测试,同时防止意外超支。

管理地图中的消耗

因为用户通常一次只会与一个地图互动,所以在每个页面上使用一个地图可以有效优化地图的显示。您的应用可以根据客户的互动和需求操作地图以显示不同的数据集。

使用静态图片

使用动态图片(动态地图和动态街景)的请求的费用会高于使用静态图片和静态街景的请求。如果您无法预见用户与地图或街景的互动(缩放或平移),请考虑使用这些 API 的静态版本。

此外,静态地图和静态街景也非常适合用来提供缩略图(非常小的地图和照片)。使用这些项的请求以较低费率结算,并且可以在用户互动(点击)时生成动态版本,让用户获得完整的 Google 地图体验。

使用 Maps Embed API

您可以使用 Maps Embed API 免费添加带有单个标记的地图或动态地图。对于需要单个标记但不需要地图自定义功能的应用,可以使用 Maps Embed API。使用路线模式、查看模式或搜索模式的 Maps Embed API 请求将会产生费用(如需了解详情,请参阅价格表)。

为移动应用使用移动地图 SDK

对于移动应用,请在显示地图时使用 Maps SDK for Android 或 Maps SDK for iOS。如果要求不允许使用移动 SDK,请使用 Maps Static API 或 Maps JavaScript API。

管理路线中的消耗

限制 Directions API 航点

如有可能,将查询中的用户条目限制为最多 10 个航点。对于所含航点数超过 10 个的请求,会以较高费率结算。

使用 Directions API 优化提供最佳路线

使用航点优化参数的请求以较高费率结算。如需了解详情,请参阅优化航点

优化参数会对航点进行排序,以确保提供最佳路线,以从 A 到 E 的旅行路线为例,优化后的路线(例如 A-B-C-D-E)比采用随机顺序的未优化路线(例如 A-D-B-C-E)更好。

在 Directions API 和 Distance Matrix API 中使用实时路况模型

包含实时路况模型的 Directions API 和 Distance Matrix API 请求以较高费率结算。将出发时间设置为 now 即可启用实时路况模型。

如果请求中省略了路况模型,结果完全取决于物理因素:道路、距离和速度限制。

在 GPS 数据不精确时使用“已行驶路线”和“最近的道路”

Maps Roads API 的“已行驶路线”和“最近的道路”功能包含在高级版层级中,而且以较高费率结算。在 GPS 数据不精确时使用这些功能,Roads API 可以帮您确定正确的道路。Roads API 的另一个功能“速度限制”只适用于资产跟踪客户。

在使用速度限制服务时每隔 5 到 15 分钟对位置进行采样

为了尽量减少对 Maps Roads API 速度限制服务的调用次数,应每隔 5 到 15 分钟对资产位置进行采样。确切的值取决于资产的行驶速度。如果资产固定不动,一个位置样本就足够了。无需多次调用。

为了尽可能缩短总体延迟时间,我们建议您在累积一些数据后再调用速度限制服务,而不是每次收到移动资产的位置时都调用 API。

管理地点中的消耗

优化地点自动补全的实现

如需优化地点自动补全功能的使用费,请采取以下做法:

  • 使用 JavaScriptAndroidiOS 自动补全微件中的字段掩码,以便仅返回所需的地点数据字段

  • 根据您的使用场景选择结算选项。根据您的实现方案是否使用自动补全会话,您需要支付“自动补全 - 按请求结算”或“自动补全 - 按会话结算”SKU 费用。

要获取关于根据您的使用场景选择合适结算选项的更多信息和指导,请参阅地点自动补全费用优化最佳做法

在“地点详情”和“地点搜索”请求中返回特定字段的数据

您可以自定义“地点详情”和“地点搜索”请求,使其返回应用中所用的特定字段的数据。这些字段分为以下类别:基本联系方式氛围。未指定任何字段的请求将收到所有字段的数据。

“地点详情”请求的结算基于所请求数据的类型和数量。未指定任何字段的请求将按完整费率结算。如需了解详情,请参阅地点详情地点搜索

通过使用 Geocoding API 降低费用

如果您的应用处理用户输入的地址,那么地址有时会不明确(不完整、拼写错误或格式不规范)。可以使用自动补全消除地址的歧义,然后使用地点 ID 获取地点位置。

不过,如果您得到了确切地址(或相近地址),可以使用地理编码(而非自动补全)来降低费用。如需了解详情,请参阅对地址进行地理编码的最佳实践

Google Maps Platform 配额的运作方式

我们的所有 API 在每位客户可以发出的调用次数方面都存在限制。这些配额是按分钟配置的。当您在一分钟内达到给定 API 的调用配额后,在该分钟内接下来的时间发出的调用将不会被接受,直到下一分钟为止。

只有成功请求和导致服务器错误的请求才会计入配额。未通过身份验证的请求不计入配额。

除了每分钟配额强制执行之外,一些 Maps API 还有每秒配额强制执行。这种每秒配额强制执行不保证整个一分钟内的用量保持一致,也不保证能够阻止您达到该分钟的用量配额。不过,它确实可以防止您在任意给定的一分钟的前一两秒内用尽所有配额,并且可在用量突然激增时避免服务出现中断。为了处理这些强制执行方面的差异,您可以通过在 QPS 之间平均分配 QPM 用量来规划您的配额用量和要求。

具有这种每秒配额强制执行的 GMP API 包括:Directions API、Distance Matrix API、Elevation API、Geocoding API、Places API 和 Roads API。

根据总请求量估算任意 GMP API 产品的费用