本指南从安全性、性能和消耗三个方面介绍了优化 Google 地图各 API 用量的几种策略。
安全性
查看安全性最佳实践
API 密钥是以项目为中心的凭据,为其采取的预防措施应与用户 ID 和密码相同。请参阅 API 安全性最佳实践来保管您的密钥,以防误用。误用可能会导致配额过度使用,使您的账号产生意外费用。
使用 API 密钥访问 Google 地图的各个 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。
管理地点中的消耗
优化地点自动补全的实现
如需优化地点自动补全功能的使用费,请采用以下做法:
在 JavaScript、Android 和 iOS 自动补全 widget 中使用字段掩码,以便仅返回所需的地点数据字段。
根据您的应用场景选择结算选项。根据您的实现方案是否使用自动补全会话,您需要支付“自动补全 - 按请求结算”或“自动补全 - 按会话结算”SKU 费用。
要获取关于根据您的应用场景选择合适结算选项的更多信息和指导,请参阅地点自动补全费用优化最佳实践。
在“地点详情”和“地点搜索”请求中返回特定字段的数据
您可以自定义“地点详情”和“地点搜索”请求,使其返回应用中所用的特定字段的数据。特定字段分为以下几类:基本、联系方式和氛围。未指定任何字段的请求将收到所有字段的数据。
“地点详情”请求的结算基于所请求数据的类型和数量。未指定任何字段的请求将按完整费率结算。如需了解详情,请参阅地点详情和地点搜索。
通过使用 Geocoding API 降低费用
如果您的应用处理的是用户输入的地址,那么地址有时会不明确(不完整、有拼写错误或格式不规范)。您可以使用自动补全来明确地址,然后使用地点 ID 获取地点位置。
不过,如果您得到了确切地址(或相近地址),可以使用地理编码(而非自动补全)来降低费用。如需了解详情,请参阅对地址进行地理编码的最佳实践。
Google Maps Platform 配额的运作方式
客户调用我们所有的 API 都存在次数限制。这些配额按分钟配置。达到给定 API 一分钟内的调用配额后,您在该分钟剩余时间内发出的调用将不再被接受,直到下一分钟为止。
只有成功请求和导致服务器错误的请求才会计入配额。未通过身份验证的请求不计入配额。