注意:Google Maps Platform 游戏服务自 2021 年 10 月 18 日起已弃用。现有用户在 2022 年 12 月 31 日之前仍可继续使用。在此期间,我们会继续针对重大错误和服务中断提供支持和修复方案。请参阅游戏服务转换指南,获取相关资源,以帮助您规划项目的后续步骤。

Playable Locations API 设计概览

Playable Locations API 提供精心挑选和生成的地理点(可播放位置)的集合。Google 之所以选择每个可播放的位置,是因为该位置适合在基于地理位置的游戏中使用,以作为维修点和游戏奖品等商品的生成点。

一些可玩的地点靠近附近的著名地图注点,有些位于道路沿途的人行道上,而另一些则随机位于公园、游乐场、城镇广场和其他可公开访问的区域。

本文档简要介绍了 API 的实现方式,以便第三方开发者可以利用关键概念,使用备用数据源生成一组自己的可播放位置。

背景

本部分简要介绍所使用的支持库,并介绍与可播放位置相关的基本概念。

支持库

本指南中会使用以下支持库。

说明
S2 几何图形 支持空间索引。
协议缓冲区 一种无关语言和平台且可扩展的序列化方式,用于通信协议、数据存储等用途。

S2 几何图形库

S2 Geometry 库是一个地理信息系统,表示三维球面上的数据。该库包含以下功能:

  • 支持空间索引。
    • 这样,您就可以将任意区域作为离散 S2 单元的集合。
    • 将点、多段线和多边形的集合快速内存中编入索引。
  • 强大的建设性运算(例如交集、联合和简化)和布尔谓词(例如包含性测试)。
  • 高效的查询操作,用于查找附近的对象、测量距离和计算形心。
  • 用于测试几何基元之间关系的数学谓词集合。
  • 对齐圆角。

S2 单元格统计信息

S2 单元统计信息对于计算特定数据集(例如下载特定 QPS 所需的时间)非常有用。

S2 几何图形代码库

克隆任何这些代码库以开始使用 S2 单元。

SSTables

SSTable 文件格式用于高效存储、处理和交换数据集。SSTable 提供了一种持久、有序且不可变的键值对映射,其中键和值都可以是任意的字节字符串。

可播放的位置

一般而言,位置是地图上的地理点,但“可播放位置”是适合在现实世界游戏中放置游戏对象的位置(即奖品等的生成点)。

可播放位置的类型

精选

精选的可播放位置是与特定位置存在的对象相关联的地理点。它们代表从地点数据库提取的地图注点 (POI) 的位置。

已生成

如果没有足够的预选可播放位置来满足您的需求,则 Playable Locations API 会生成额外的可播放位置。这些生成的可播放位置是与现有对象无关的地理点。相反,这些地理点是以编程方式创建的,它们会随机沿着人行道、公园、海滩、游乐场、城镇广场和其他可公开访问的区域放置。

我们的目标是提供至少一定范围的可播放位置,但需要考虑以下条件:

条件 示例
玩家安全 游戏奖品不得出现在高速公路中间或军事基地。
游戏玩法的适宜性 玩家不得墓地或宗教场所。

可播放的位置属性

下面讨论了 Google 实现中与 Playable Location 对象相关的一些属性,开发者可能会发现这些属性对于构建基于位置的游戏非常有用。

地点 ID
字母数字字符,用于唯一标识营业地点。这是精选可播放位置(例如 Chlj79ZW1ohQwokRWPhGmWQ2K4)的地点 ID。您可以使用预收录的可播放位置的地点 ID 将游戏专用元数据附加到该位置。
plusCode
一个Plus Code,用于唯一标识生成的可播放位置。Plus Code 包含字母数字字符串。例如,23CPRV2R+WG76。您可以使用生成的位置信息的 Plus Code 将游戏专用元数据附加到该位置。
类型
一个由可播放位置类型(字符串)构成的数组,用于指定可播放的位置类型。数组中的第一个类型被视为主要类型。例如,您可能有一个同时具有娱乐和户外娱乐内容的可播放位置。
centerPoint
与营业地点的中心点相对应的地理坐标。中心点用于确定营业地点是否位于某个感兴趣的区域内。
snappedPoint
与最近道路(当附近道路存在时)的营业地点对应的地理位置坐标。如果企业主不希望游戏玩家在其场所内,则可以使用贴靠点放置游戏对象。如果某个贴靠点不可用,则应使用中心点。
生物类型
当可播放位置位于生物群落中时,此字段会填充一个或多个 BiomeType 值。森林、湿地和市区等生物群落。

设计

游戏选择要点

选择预收录的营业地点

如上所述,精选地点是我们认为适合玩游戏的真实地图注点 (POI)。下文将简要介绍可用于生成这些位置的数据流水线(可选择和过滤条件)。此流水线的目标是输出基于 S2CellId 的精选地点的 SS 表,随后可将该数据馈送到数据库中,以对指定地区的可播放位置进行实时查询。

这一假设是,开发者能够访问地图项或地点代码库,该地图库除了包含已排除的区域(应该不存在可播放位置)的几何图形外,还包含一组候选地图注点。

流水线采用“许可名单/屏蔽”组合方法。在这种方法中,我们会在一个阶段选择与允许的游戏类型列表(例如咖啡馆、图书馆、花店等)匹配的所有地图注点,然后在另一个阶段过滤掉一组已排除区域内的所有地图注点。系统会使用被认为不适合游戏玩法的预定义地图特征集(例如军事基地、墓地)构成几何图形(例如边界框)以生成 S2 覆盖。然后,这些 S2 覆盖率可用于查看所选的任何地图注点是否在排除的区域内,以及是否将其滤除。然后,将最后一组预收录营业地点的中心点转换为级别 30 的 S2CellId,从而编入索引。此方法允许根据指定范围查找可播放位置的指定地区。

精选营业地点流水线示意图。

选择生成的位置

如上所述,在现实世界的地图注点没有游戏玩法所需的密度时,生成的位置用于补充可播放的位置。一般而言,我们发现每个级别 16 S2 小区(约 0.02 公里^2)的大约 9 个可播放位置应该足以满足基于位置的游戏的需求。

这些“随机”地理位置点的生成也是通过组合许可名单/屏蔽名单方法来完成的。该许可名单会列出被认为适合生成点的地图项(例如公园、人行道等),屏蔽名单是应排除点的区域(例如水体、机动车道路等)。在这两种情况下,地图项几何图形都会生成各自的 S2 覆盖区域,当两者合并时,系统会将包含的重叠区域排除在外,从而为生成的位置生成最终的候选区域集。最后,我们“随机”在这些区域内生成地理点,并将数据写入 30 级代表 S2CellId 代表中心点的 SStable。对于生成的地理位置,系统会将Plus Codes 用作地点 ID。

生成的地理位置流水线示意图。

位置信息流水线概览

如上所述,前面两个数据流水线的输出是 2 个 PlayableLocation 对象 SSTables,其中的 S2CellIds 位于 S2 级别 30。这些文件可以加载到任何有序键值对存储区中,以便进行空间索引查询。其中一个选择是 Google 的分布式 SQL 数据库 Spanner

按位置排序的键值对流水线示意图。

生物群落

生物群落是具有共同的环境适应特征的植物和动物的社区。生物群落因共同的气候而发生变化。森林、湿地和市区等生物群落。

当可播放的位置位于生物识别群中时,可以使用一个或多个 BiomeType 值填充 BimeType 字段。

您可以使用生物群落信息在地图上放置不同的游戏对象类型。例如,如果生物识别系统字段包含值 grassland,则它可能生成不同于生物类型字段包含值 urban 的类型的生物。

下文介绍了在上述“地理位置”流水线中添加可播放地理位置的生物信息的过程。Google 的 Earth Engine 拥有多个陆地覆盖数据集,其中包括用于获取生物群落信息的信息类(如森林、草原和水)。我们建议采用以下简要步骤来添加生物特征信息:

  • 精选包含生物群落和地理定位数据的数据。
  • 根据现有地理位置,将生物识别信息分配至现有可播放位置,这通常可以通过空间联接来完成。例如,如果 S2 小区级别 17 有可用的生物组信息,并且可播放位置使用其 S2CellId 在第 30 级编入索引,则可按以下方式执行联接:
    1. 将可播放的位置映射到级别 17 的 S2 单元格:PlayableLocation.s2CellId.parent(17)
    2. 在 17 级加入 Biome S2CellIds
  • 提供可播放位置以及生物群属性(如果有)。

从生物特征库到可玩位置图。

查询可播放的位置

如果遵循上述建议,并使用级别 30 的 S2CellIds 将可播放的位置编入索引(请参阅 S2 库,将 LatLng 转换为单元格 ID),我们就可以执行基于范围的扫描,检索特定地区中的所有可播放位置。

查询示例

如果要检索 S2Cell 中位于第 12 层(大约 5 公里^2)的所有可播放位置,我们可以发出以下查询:

S2CellId:0x89c2599000000000 范围最小值:0x89c2598000000001 (s2CellId.rangeMin().id()) 范围最大值:0x89c2599fffffffff (s2CellId.rangeMax().id())

SELECT * FROM PlayableLocations
WHERE S2CellId BETWEEN 0x89c2598000000001 AND 0x89c2599fffffffff;

间距

S2Library 再次可用于控制游戏中可播放位置的密度。S2 级别是分层的,因此级别 14 中的每个单元格包含 4 个级别为 15 的单元格,依此类推(请参阅 S2 单元格统计信息)。将游戏对象放置在游戏中时,可以使用这些属性。例如,您可以选择为每个 14 级单元格使用一个“怪物”,以便在同一区域中均匀分布 64 颗“珠宝”,即在每个 17 级单元格中放置一个“珠宝”(每个 14 级单元格包含 64 级 17 单元格)。

查询和缓存交互

游戏序列、游戏服务器、游戏状态数据库和可玩位置数据库之间的推荐逻辑流程如以下序列图所示。请注意,您可以将游戏状态和可播放位置组合到单个数据库中,但为清楚起见,在此处将其分开。

可播放位置查询和缓存示意图。

位置报告功能错误

下文介绍了通过允许玩家报告无法使用的可玩位置,从游戏中收集反馈质量信息的过程。这些报告可以在数据流水线中进行处理,并用于从可播放的位置数据库中移除不良位置。

我们建议您按照以下步骤实施不良位置报告:

  • 构建一个客户端入口点(移动或网络表单),让玩家能够向游戏开发者提交结构化的错误点报告。
  • 构建一个数据流水线,以处理收到的所有报告并生成信号,以帮助对每个营业地点的严重程度进行归类。
  • 根据实际用例,纯机器学习模型或混合机器学习模型和人工解决方案可用于扩缩审核流程,以从 PlayableLocationsDB 移除不当位置。

地理位置报告图表有误。

下面列出了一组示例条件,可以帮助确定播放位置是否有误:

条件 示例
不安全
  • 可播放的地点位于悬崖边缘 50 米以内。
  • 可播放的位置位于主干道的中间位置,或者靠近快速移动的路段。
非公共区域
  • 受限制的政府设施。例如军事基地。
不可访问
  • 围栏区域。
  • 水中的地标。
暂时无法访问
  • 装修停业的营业地点。
  • 季节性停业的营业地点。
  • 修正道路超过一周。
文化敏感
  • 墓地。
  • 宗教场所。