微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 S2 几何库对数据库执行位置邻近搜索

如何解决使用 S2 几何库对数据库执行位置邻近搜索

我正在开展一个项目,该项目需要对包含位置数据的数据库快速执行邻近查询

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

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

经过深入研究后,我选择了 S2 Geometry Library 方法和 Hilbert 的空间填充曲线。

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

我需要我的数据库能够以闪电般的速度执行这个 SELECT 查询,我希望将来有很多数据,所以只对一列进行操作是一个很大的优势。

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

Hilbert's Curve

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

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

我在互联网上找到的大多数答案和教程都提出了一种解决方案,在该解决方案中,您可以使用一个充满较小 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 举报,一经查实,本站将立刻删除。