Playable Locations API 提供一系列精选和生成的地理点(可播放的位置)。Google 之所以选择每个可玩的位置,是因为它适合在基于位置的游戏中使用,作为维修站和游戏奖品等的生成点。
一些可玩的位置设在著名地图注点附近,一些位于道路沿线的人行道上,而另一些则位于公园、游乐场、城镇广场和其他可公开游玩的区域。
本文档旨在简要介绍此 API 的实现方式,以便第三方开发者可以利用主要概念利用备用数据源生成一组自己的可播放位置。
背景
本部分简要介绍了使用的支持库,并介绍了与可播放位置相关的基本概念。
支持库
本指南中使用了以下支持库。
库 | 说明 |
S2 几何图形 | 支持空间索引。 |
协议缓冲区 | 一种与编程语言无关、平台中立、可扩展的序列化结构化数据的方法,用于通信协议、数据存储等。 |
S2 几何图形库
S2 Geometry 库是一种地理信息系统,表示三维球面上的数据。该库包含以下功能:
- 支持空间索引编制。
- 这样,您就可以将任意区域作为离散 S2 单元的集合进行近似处理。
- 为点、多段线和多边形的集合提供快速的内存空间索引。
- 强大的构造操作(例如相交、联合和简化)和布尔谓词(例如测试封闭情况)。
- 用于查找附近对象、测量距离和计算形心的高效查询操作。
- 一系列用于测试几何基元之间关系的数学谓词。
- 贴靠圆角。
S2 单元格统计信息
S2 小区统计信息对于计算数据集下载时间(以特定 QPS 为单位所需的时间)很有用。
S2 几何图形代码库
克隆任何这些代码库,以开始使用 S2 单元。
SS 表
SSTable 文件格式用于高效存储、处理和交换数据集。SSTable 提供了一种持久、有序且不可变的键值对映射,其中键和值都可以是任意的字节字符串。
可播放的位置
一般而言,“位置”是地图上的地理点,但“可玩的位置”是指被视为适合在现实世界游戏中放置游戏对象的位置(即奖品等的衍生点)。
可播放位置的类型
精选内容
精选的可播放位置是与特定位置存在的对象相关联的地理点。它们代表从地点数据库提取的地图注点 (POI) 的位置。
已生成
如果精选的可播放位置不足以满足您的条件,Playable Locations API 就会生成额外的可播放位置。这些生成的可播放位置是与现有对象不关联的地理点。相反,这些地理点是通过编程方式创建的,它们是随机放置在人行道上、公园内、海滩上、游乐场、城镇广场和其他可公开访问的区域内。
您的目标是提供至少可玩的位置数,同时要考虑以下条件:
条件 | 示例 |
玩家安全 | 游戏奖品不得出现在高速公路中间或军事基地内。 |
游戏玩法的适用性 | 玩家不得干扰公墓或宗教场所。 |
可播放的位置属性
下面讨论了 Google 实现中与可玩的位置对象相关联的一些属性,开发者可能会发现这些属性对于构建基于位置的游戏很有用。
- 地点 ID
- 字母数字字符串,用于唯一标识营业地点。这是精选可播放位置(例如 Chlj79ZW1ohQwokRWPhGmWQ2K4)的地点 ID。您可以使用精选的可播放位置的地点 ID 将游戏专用元数据附加到该位置。
- plusCode
- 用于对生成的播放位置进行唯一标识的 Plus 代码。Plus Code 是字母数字字符串。例如,23CPRV2R+WG76。您可以使用生成的营业地点的 Plus 代码将与该游戏相关的元数据附加到该营业地点。
- 类型
- 一组可播放的位置类型(字符串),用于指定可播放的位置类型。数组中的第一个类型被视为主要类型。例如,您可能有一个可玩的位置,无论是娱乐性还是户外休闲性。
- 中心点
- 与营业地点的中心点对应的地理坐标。中心点用于确定某个营业地点是否位于感兴趣的区域内。
- snappedPoint
- 与最近道路(当附近存在道路时)人行道上的位置对应的地理坐标。当企业主不希望游戏玩家在其场所内时,您可以使用贴靠点放置游戏对象。当对齐点不可用时,应使用中心点。
- biomeType
- 如果可播放的位置位于生物群落中,则此字段会填充一个或多个 BiomeType 值。森林、湿地和市区的生物群落示例。
设计
选择游戏点
选择预收录的营业地点
如上所述,精选地点是认为适合玩游戏的真实地图注点 (POI)。下文将简要介绍可用于生成这些位置的数据流水线(具有选择和过滤标准)。此流水线的目标是输出由 S2CellId 键控的精选地点的 SS 表,随后该 S2CellId 可以被馈送到数据库中,以对给定区域中可播放的位置进行实时查询。
我们假定开发者能够访问某个地图功能或地点代码库,该代码库或地图集除了包含已排除的区域(不应出现可播放位置)之外,还包含一组候选地图注点。
流水线采用组合的许可名单/屏蔽名单方法。在这种方法中,我们会在一个阶段中选择符合允许的游戏类型类型列表(例如咖啡馆、图书馆、花店等)的所有地图注点,然后在另一个阶段过滤出属于一组已排除区域的所有地图注点。排除的区域使用一组被认为不适合玩游戏的预定义地图项(例如军事基地、墓地)的几何图形组(例如,边界框)来生成 S2 覆盖。然后,这些 S2 投保方案可用于查看是否将任何选定的地图注点纳入已排除的地区,如果是,则将其滤除。然后,通过将第 30 关的中心点转换为 S2CellId,将最后一组预选位置编入索引。这样,就可以对指定区域内的可播放位置进行基于范围的查找。
选择生成的地理位置
如上所述,在现实世界地图注点上没有提供游戏所需的密度的区域中,生成的位置用于补充可玩的位置。一般而言,我们发现 16 级 S2 单元(约 0.02 平方^2)中每个关卡的 9 个可玩位置应足以支持基于位置的游戏。
这些“随机”地理位置点的生成也是通过结合使用许可名单/屏蔽名单方法来完成的。许可名单会列出其认为可生成点的地图项(例如公园、人行道等),而屏蔽名单是应排除点的区域(例如水体、机动车道路等)。在这两种情况下,地图几何图形均用于生成 S2 来覆盖各自的区域,当两者连接在一起时,会从包含的区域中减去重叠的排除区域,从而生成所生成位置的最终候选区域集。最后一步是“随机”生成这些区域内的地理点,并将数据写入使用代表中心点的 30 级 S2CellId 编入索引的 SStable。对于生成的地理位置,Plus Code 会用作地点 ID。
地理位置流水线概览
如上所述,上述两个数据流水线的输出是两个 SSTable,这些 PlayableLocation 对象在 S2 级别 30 使用 S2CellId 编入索引。这些文件可以加载到任何有序的键值对查询中,以便有序地查找。一种选择是 Google 的分布式 SQL 数据库 Spanner。
生物群落
生物群是具有共同的环境适应特征的植物和动物的社区。生物群落因共同的气候而形成。森林、湿地和市区的生物群落示例。
当某个可玩的位置位于生物群落内时,可以使用一个或多个 BiomeType 值填充 iomeType 字段。
您可以使用生物群落信息在地图上放置不同的游戏对象类型。 例如,如果 Bime 字段包含值 grassland,则它可能会生成不同于生物字段包含值 urban 的类型的生物。
下文介绍了在上述“位置”流水线中,将生物识别信息添加到可播放位置的过程。Google 的 Earth Engine 有多个陆地覆盖数据集,其中包括森林、草原和水等信息类,可用于获取生物群落信息。我们建议采用以下简要步骤来添加生物信息:
- 精心挑选包含生物群落和地理信息的数据。
- 根据现有的地理定位信息,将生物识别信息作为属性分配给现有的位置,这通常可以通过空间联接来实现。例如,如果 S2 小区级别 17 提供生物组信息,并且使用其 S2CellId 在第 30 级将可播放位置编入索引,则可按以下方式执行联接:
- 将可播放的位置映射到其 S2 级关卡 17:PlayableLocation.s2CellId.parent(17)
- 加入 Biome S2CellId,共 17 级
- 将可播放位置与生物识别属性(若有)一起投放。
查询可播放位置
如果遵循上述建议,并且我们在 30 级使用 S2CellId 将可播放位置编入索引(请参阅 S2 库,了解如何将 LatLng 转换为单元格 ID),我们就可以执行基于范围的扫描,以检索特定区域中的所有可播放位置。
查询示例:
如果我们希望检索位于级别 12(约 5 公里^2)的 S2Cell 中的所有可播放位置,我们可以发出以下查询:
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 个单元格)。
查询和缓存交互
游戏序列、游戏服务器、游戏状态数据库和可玩位置数据库之间的推荐逻辑流程如以下序列图所示。请注意,您可以将游戏状态和可玩的位置合并到单个数据库中,但为了清楚起见,这里只将它们分开。
位置报告功能有问题
下文介绍了通过允许玩家报告不可用的可玩位置,从游戏中收集关于可玩营业地点质量的反馈的流程。这些报告可以在数据流水线中进行处理,用于从 Playable Locations 数据库中移除不良位置信息。
我们建议您按照以下步骤实施错误的位置报告:
- 构建客户端入口点(移动设备或网络表单),让玩家能够向游戏开发者提交结构化的不合格报告。
- 构建数据流水线来处理所有收到的报告并生成信号,以帮助分类每个营业地点的严重程度。
- 根据实际用例,可以使用纯机器学习模型或混合机器学习模型 + 人工解决方案来扩缩审核过程,以便从 PlayableLocationsDB 移除不当位置。
以下是一组示例条件,可帮助确定某个可播放的位置是否有误:
条件 | 示例 |
不安全 |
|
非公共区域 |
|
不可访问 |
|
暂时无法访问 |
|
文化敏感 |
|