快速方法按距离搜索数百万个坐标

Posted

技术标签:

【中文标题】快速方法按距离搜索数百万个坐标【英文标题】:Fast way search millions of coordinates by distance 【发布时间】:2018-10-31 15:01:47 【问题描述】:

我有一个大约 2000 万坐标的数据集。我希望能够以英里为单位传递纬度、经度和距离,并返回在我给定坐标的英里范围内的所有坐标。我需要理想的响应时间低于 50 毫秒。

我已经尝试在 golang 服务中加载内存中的所有坐标,该服务在每次请求时都会循环遍历数据并使用 hasrsine 过滤所有坐标,这些坐标在我给定坐标的给定英里距离内。

此方法会在大约 2 秒后返回结果。什么方法可以提高结果的速度?我愿意接受任何建议。

我正在玩弄按度数对所有坐标进行分组并仅按最接近给定坐标的值进行过滤的想法。不过,还没有任何运气可以改善响应时间。我的数据集也只是一个测试集,因为真实数据可能有数亿。

【问题讨论】:

我很好奇redis geo implementation 是否能提供更好的结果。您介意在其中加载您的数据并进行比较吗? 【参考方案1】:

我认为这更像是一个数据结构问题。存储大量地理空间坐标的一种好方法是使用R-tree。它提供 logn M 搜索。我对 Go 的了解有限,但在 JS 应用程序的类似用例中,我使用 R-Tree 对类似大小的数据集产生了很好的效果。通过快速搜索,似乎至少有几个 Go R-Tree 实现在那里。

【讨论】:

【参考方案2】:

想法是有一个划分坐标的“网格”,这样当您确实需要进行查找时,您可以安全地返回特定单元格中的所有坐标,不要从距离目标太远的单元格返回任何坐标,并且仅对包含距离内的一些坐标和距离外的一些坐标的单元格中的坐标进行每个坐标比较。

简化为一维:

坐标从 1 到 100

你分成 5 个 20 块

当有人从 47 寻找距离 25 内的所有坐标时 您返回块 [30,39]、[40,49]、[50,59]、[60,69] 中的所有坐标,然后在对块 [20,29] 和 [70,79] 进行每个坐标分析之后,您额外返回 22,23,24,25,26,27,28,29, 70,71,72。

很遗憾,我没有切实可行的方法来估计这种方法的加速效果,因此您需要自己实施它并对其进行基准测试。

【讨论】:

【参考方案3】:

MongoDB 具有多种地理搜索功能 $geoNear 将允许您搜索距点特定距离内或形状内的点。

https://docs.mongodb.com/manual/reference/operator/aggregation/geoNear/

PostGIS for Postgres 也有类似的东西,但我不太熟悉。

【讨论】:

以上是关于快速方法按距离搜索数百万个坐标的主要内容,如果未能解决你的问题,请参考以下文章

数百万个 3D 点:如何找到最接近给定点的 10 个?

使用 python 快速有效地更新数百万个 MongoDB 文档的技巧?

Booking.com如何在毫秒内搜索数百万个地点

比较数百万个 mongoDB 记录中的变化的最佳方法

当可迭代包含数百万个元素时,是不是有 zip(*iterable) 的替代方法?

如何有效地计算数百万个字符串之间的余弦相似度