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 代码将游戏专属元数据附加到该营业地点。
类型
一个可播放位置类型的数组(字符串),用于指定可播放位置的类型。数组中的第一个类型被视为主要类型。例如,您可以创建一个既是娱乐内容又是 Outdoor_recreation 的可播放位置。
centerPoint
与营业地点的中心点对应的地理坐标。中心点用于确定某个位置是否位于某个感兴趣的区域内。
snappedPoint
与最近道路的人行道对应的位置对应的地理坐标(如果存在附近的道路)。如果企业主不希望游戏玩家进入他们的办公场所,您可以使用贴靠点来放置游戏对象。如果贴靠点不可用,应使用中心点。
biomeType
当可播放位置位于生物群落内时,此字段会填充一个或多个 BiomeType 值。生物群落的示例包括森林、湿地和城市地区。

设计

游戏地点选择

选择预收录的营业地点

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

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

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

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

选择生成的位置

如上所述,在现实世界的地图注点没有游戏内容所需的密度的情况下,生成的位置用于补充可播放位置。一般而言,我们发现每个 16 级 S2 小区 (~0.02 km^2) 中约有 9 个可玩位置,对于基于位置的游戏而言,该区域已足够密度。

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

生成的营业地点流水线示意图。

位置流水线概览

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

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

生物群落

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

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

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

下面介绍了在上述位置信息流水线中将生物群落信息添加到可播放位置信息的过程。Google 的 Earth Engine 具有多个土地覆盖数据集,其中包含可用于获取生物群落信息(如森林、草地和水)的信息类别。我们建议您按照以下简要步骤来添加生物群落信息:

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

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

查询可播放位置

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

问题示例

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

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

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

间距

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

查询和缓存交互

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

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

位置报告错误

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

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

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

位置报告图表有误。

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

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