Playable Locations API 设计概览

Playable Locations API 提供精选和生成的地理点(可播放位置)集合。Google 会根据每个地点在基于位置的游戏中是否适用(用作修理站和游戏奖品等的生成点)来选择各个可玩位置。

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

本文档旨在简要介绍此 API 的实现方式,以便第三方开发者能够利用关键概念,通过其他数据源生成自己的一组可播放位置。

背景

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

支持库

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

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

S2 几何图形库

S2 几何图形库是表示三维球体数据的地理信息系统。该库包含以下功能:

  • 支持空间索引。
    • 这样,您就可以将任意区域近似为离散 S2 移动网络的集合。
    • 对点、多段线和多边形的集合进行快速内存空间索引。
  • 稳健的构建性操作(例如交集、并集和简化)和布尔谓词(例如测试包含)。
  • 用于查找附近的对象、测量距离和计算形心的高效查询操作。
  • 一组数学谓词,用于测试几何基元之间的关系。
  • 贴靠舍入。

S2 移动网络统计信息

S2 移动网络统计信息对于计算以特定 QPS 下载数据集所用的时间等事项非常有用。

S2 几何图形代码库

克隆这些代码库中的任何一个,开始使用 S2 单元。

SSTables

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

可播放的国家/地区

一般来说,位置是地图上的地理点,可玩位置则是被认为适合在现实世界游戏中放置游戏对象(即奖品等物品的生成点)的位置。

可播放位置的类型

精选

精选的可播放位置是与位于特定位置的对象相关联的地理位置点。它们表示从地点数据库绘制的地图注点 (POI) 的位置。

已生成

如果没有足够的精选可播放位置来满足您的条件,则 Playable Locations API 会生成额外的可播放位置。这些生成的可播放位置是与现有对象无关的地理位置点。而是以程序化方式创建这些地理点,并将它们随机放置在人行道、公园、海滩、游乐场、城镇广场和其他可公开访问的区域内。

目标是提供至少最低密度的可播放位置,但需考虑以下条件:

条件 示例
玩家安全 游戏奖品不应出现在高速公路中间或军事基地内部。
游戏玩法 玩家不得干扰墓地或宗教场所。

可播放位置属性

下文讨论了 Google 实现中与可播放位置信息对象相关的一些属性,开发者可能认为这些属性有助于构建基于位置的游戏。

placeId
一个字母数字字符串,用于唯一标识营业地点。这是精选的可播放营业地点的地点 ID(例如 Chlj79ZW1ohQwokRWPhGmWQ2K4)。您可以使用预收录的可玩位置的地点 ID 将游戏专用元数据附加到该位置。
plusCode
一个 Plus Code,用于唯一标识生成的可播放位置。Plus 代码是字母数字字符串,例如,23CPRV2R+WG76。您可以使用生成的营业地点的 Plus 代码将游戏专属元数据附加到该营业地点。
类型
一个可播放位置类型(字符串)数组,用于指定可播放位置的类型。数组中的第一个类型被视为主要类型。例如,您可以有一个既有娱乐内容又有户外休闲的可播放位置。
centerPoint
对应于营业地点中心点的地理坐标。中心点用于确定某个地点是否位于感兴趣的区域内。
snappedPoint
与最近道路的人行道(如果存在附近的道路)对应的位置对应的地理坐标。如果企业主不希望游戏玩家进入他们的办公场所,您可以使用贴靠点来放置游戏对象。如果没有贴靠点,则应使用中心点。
biomeType
如果可播放的位置位于生物群落内,则此字段会填充一个或多个 BiomeType 值。生物群落的示例包括森林、湿地和市区。

设计

精选游戏点

选择预收录的营业地点

如上所述,精选位置是被视为适合玩游戏的真实地图注点 (POI)。下文将简要介绍可用于生成这些位置的数据流水线(包含选择和过滤条件)。此流水线的目标是输出一个键控 S2CellId 的精选营业地点 SStable,随后可将其馈送到数据库,以实时查询指定区域中可玩的地点。

假设开发者有权访问一个地图项或地点代码库,该地图项或地点代码库不仅包含排除区域的几何图形(其中不应存在可播放位置),还包含一组候选地图注点。

流水线采用许可名单/屏蔽名单组合方法:在一个阶段,我们会选择与我们认为适合玩游戏的一系列许可类型(例如咖啡馆、图书馆、花店等)匹配的所有地图注点;在另一个阶段,我们会过滤掉一组排除区域内的所有地图注点。排除的区域使用被视为不适合游戏玩法的一组预定义地图项(例如军事基地、公墓)的几何图形(例如边界框)生成 S2 覆盖层。然后,您可以使用这些 S2 覆盖信息查看是否有任何选定的地图注点在排除的区域内,如果是,则将其滤除。然后,最后一组精选位置将通过在级别 30 处将其中心点转换为 S2CellId 进行索引。这样就可以基于范围的查找指定区域内的播放位置。

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

选择生成的位置

如上所述,在实际地图注点没有游戏必要密度的区域,生成的位置将用于补充可播放位置。一般来说,我们发现,在每个第 16 关的 S2 小区 (~0.02 km^2) 中,大约有 9 个可玩的地理位置对于基于位置的游戏来说应该足够密度。

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

“生成位置”流水线示意图。

位置流水线概览

如上所述,前两个数据流水线的输出是两个使用 S2CellId 以 S2 级别 30 编入索引的 PlayableLocation 对象的 SSTable。这些文件可加载到任何有序键值对存储区中,以进行空间索引查询。您可以选择 Google 的分布式 SQL 数据库 Spanner

有序键值对流水线示意图。

生物群落

生物群落是指具有共同环境适应特征的动植物的群落。生物群落会应对共同的物理气候形成。生物群落的示例包括森林、湿地和市区。

当可播放的位置位于生物群落内时,biomeType 字段可以使用一个或多个 BiomeType 值填充。

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

下面介绍了将生物群落信息添加到上述“营业地点”流水线一部分的流程。Google 的 Earth Engine 有多个土地覆盖数据集,其中包含森林、草地和水等信息类别,可用于获取生物群落信息。我们建议您按照以下高级步骤来添加生物群落信息:

  • 挑选包含生物群系和地理定位信息的数据。
  • 根据现有游戏的地理位置的地理位置,将生物群落信息作为属性分配给它们,这通常可以通过空间联接来完成。例如,如果 S2 Cell 级别 17 提供生物群落信息,并且可播放位置使用级别 30 的 S2CellId 编入索引,则可按如下方式执行联接:
    1. 将可播放位置映射到级别 17 的 S2 小区:PlayableLocation.s2CellId.parent(17)
    2. 在级别 17 时与生物群落的 S2CellId 连接
  • 将游戏位置与生物群落属性(如果有)一起提供。

从生物群落库到可播放位置的示意图。

查询可播放的位置

如果遵循上述建议,并且我们在级别 30 使用 S2CellId 为可播放位置编制索引(有关从 LatLng 转换为小区 ID 的信息,请参阅 S2 库),我们可以执行基于范围的扫描,以检索特定地区中的所有可播放位置。

查询示例

如果要检索位于级别 12 (~5km^2) 的 S2Cell 内的所有可播放位置,则可以发出以下查询:

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

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

间距

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

查询和缓存交互

游戏客户端、游戏服务器、游戏状态数据库和可玩位置数据库之间推荐的逻辑流程如下图所示。请注意,可以将游戏状态和可玩位置合并到单个数据库中,但为清楚起见,此处将二者分离。

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

位置报告错误

下文介绍了一个流程,该流程允许玩家报告无法使用的游戏位置,从而从游戏内收集有关可玩地点质量的反馈。这些报告可以在数据流水线中进行处理,并用于从可玩位置信息数据库中移除错误位置信息。

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

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

位置报告图表错误。

以下是一组示例条件,可用于帮助确定某个可播放位置是否有误:

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