首页 > 解决方案 > 使用 S2 几何库在数据库上执行位置邻近搜索

问题描述

我正在开展一个项目,该项目需要在具有位置数据的数据库上快速执行邻近查询。

在我的数据库中,我想存储带有附加信息的位置。想法是用户在某个位置打开地图,我的程序只获取用户可见的标记。如果我计划拥有数百万个值,当我放大伦敦时从纽约市获取标记会使地图活动的工作非常缓慢,并且我从数据库发回的数据将是巨大的。

这就是为什么当用户打开地图时,我想获取例如距离地图中心 10 公里的所有标记。(我可以在可见区域之外获取标记。我只是不想获取 100 公里外的标记)

经过彻底的研究,我选择了带有希尔伯特空间填充曲线的 S2 几何库方法。

将二维值映射到一个整数值的想法是一个很大的卖点,其中两个索引之间的共享前缀越长,它们在空间上就越接近。

我需要我的数据库能够快速执行此 SELECT 查询,并且我希望将来有大量数据,因此仅对一列进行操作是一大优势。

此外,最让我感兴趣的是执行快速邻近搜索的能力,因为地图上彼此接近的两个数字将具有彼此接近的一维索引。

希尔伯特曲线

这个想法看起来很简单(如果我没有错过任何东西)。

我遇到的问题是如何(如果可能的话)选择一维平面上的最小值和最大值,以确保我正在扫描整个可见区域。

我在互联网上找到的大多数答案和教程都提出了一个解决方案,在该解决方案中,您获取一个充满较小 S2 索引“框”的边界区域,然后扫描数据库中的每个索引以查看它是否包含在其中一个“框”中大批。这很容易做到,但是当您拥有 5000 万条记录时,不可能查看每一条记录以查看它是否在“盒子”中。

我想到的是一个解决方案,您可以取该区域的最小值和您正在搜索的区域的最大值,然后执行以下操作SELECT (...) WHERE s2cellid BETWEEN min AND max

例如,我在位置47194c并且想要获取 10 公里距离内的所有标记,所以我在索引左侧取一个x值,在索引右侧取一个x值并执行BETWEEN 47194c-x AND 47194c+x query

使用 S2 库可以实现类似的功能吗?如果不是,那么我应该采取什么方法来尽可能快地进行查询?

提前致谢 :)

[我打算使用 PostgreSQL]

标签: geometrylocationgeospatialspatial-indexs2

解决方案


推荐阅读