如何解决使用 S2 几何库对数据库执行位置邻近搜索
我正在开展一个项目,该项目需要对包含位置数据的数据库快速执行邻近查询。
在我的数据库中,我想存储带有附加信息的位置。想法是用户在某个位置打开地图,我的程序只获取用户可见的标记。如果我计划拥有数百万个值,当我放大伦敦时从纽约获取标记会使地图活动的工作速度极慢,而我从数据库发回的数据将非常庞大。
这就是为什么当用户打开地图时,我想获取所有标记,例如距离地图中心 10 公里的距离。 (我可以在可见区域之外获取标记。我只是不想获取 100 公里外的标记)
经过深入研究后,我选择了 S2 Geometry Library 方法和 Hilbert 的空间填充曲线。
将二维值映射到一个整数值的想法是一个很大的卖点,其中两个索引之间的共享前缀越长,它们在空间上越接近。
我需要我的数据库能够以闪电般的速度执行这个 SELECT 查询,我希望将来有很多数据,所以只对一列进行操作是一个很大的优势。
另外最让我感兴趣的是执行快速邻近搜索的能力,因为在地图上彼此接近的两个数字将具有彼此接近的一维索引。
这个想法看起来很简单(如果我没有遗漏任何东西)。
我遇到的问题是如何(如果可能的话)在一维平面上选择最小值和最大值,以确保我正在扫描整个可见区域。
我在互联网上找到的大多数答案和教程都提出了一种解决方案,在该解决方案中,您可以使用一个充满较小 S2 索引“框”的边界区域,然后扫描数据库中的每个索引以查看它是否包含在其中一个“框”中"来自数组。这很容易做到,但是当您有 5000 万条记录时,不可能逐一查看它们是否在“盒子”中。
我想到的是一种解决方案,其中您取区域的最小值和您正在搜索的区域的最大值,然后在 SELECT (...) WHERE s2cellid BETWEEN min AND max
例如,我在一个位置 47194c 并且想要获取 10 公里距离内的所有标记,所以我取了一个 x 位于索引左侧的值和一个索引右侧 x 的值并执行 BETWEEN 47194c-x AND 47194c+x query
S2 库可以实现类似的功能吗? 如果不是,那么我应该采取什么方法来尽快进行查询?
提前致谢:)
[我打算使用 Postgresql]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。