优化指南

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

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

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

性能

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

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

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

具体而言,您可以调整查询频率。在代码中,在查询之间添加 S 秒的等待期。如果查询仍导致配额错误,请将等待期延长一倍,然后再发送另一个查询。您可以不断调整等待期,直到查询不再返回错误为止。

按需发送用户互动请求

您应仅按需向 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 地图 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 自动补全 widget 中使用字段掩码,以便仅返回所需的地点数据字段

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

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

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

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

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

通过使用 Geocoding API 降低费用

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

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

Google Maps Platform 配额的运作方式

客户调用我们所有的 API 都存在次数限制。这些配额按分钟配置。达到给定 API 一分钟内的调用配额后,您在该分钟剩余时间内发出的调用将不再被接受,直到下一分钟为止。

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

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