我有一组代表街道(黑线)的点和代表 map 上一个地点的点(红点)。我想找到指定街道附近的所有点,按距离排序。我还需要能够指定最大距离(蓝色和绿色区域)。这是一个简单的例子:
我想过使用 $near
运算符,但它只接受 Point
作为输入,而不是 LineString
。
mongodb 如何处理这种类型的查询?
最佳答案
正如您所提到的,Mongo 目前不支持除 Point
以外的任何内容。您是否遇到过路线拳击手的概念? 1 几年前它在谷歌 map 上非常流行。根据您绘制的线,找到 dist(x)
内的停靠点。它是通过在线条中的每个点周围创建一系列边界框并搜索落入桶内的点来完成的。
在我刚刚意识到 Mongo 仅适用于积分后,我偶然发现了您的问题,我认为这是合理的。
我已经有了一些关于如何去做的选择(他们扩展了@mnemosyn 在评论中所说的内容)。对于我正在处理的数据集,它全部在客户端,因此我可以使用 routeboxer,但出于性能原因,我想在服务器端实现它。以下是我的建议:
LineString
分解为单独的坐标集,并使用每个坐标集查询 $near
,组合结果并提取唯一的集。有一些算法可以通过减少点数来简化复杂的线,但简单的算法很容易编写。 $within
得到的边界框的停靠点。哎呀,因为 routeboxer 方法返回矩形,所以可以将所有这些矩形合并到一个覆盖您的路线的多边形中,只需在其上执行 $within
即可。 (@mnemosyn 建议的内容)。 这是我将很快(希望如此)进行的工作,我将根据我最终使用的结果开源我的结果。
编辑: 我必须提到虽然 1 和 2 有缺陷,如果你在一条线上有 2 点相距 2 公里,并且你想要点在你的线 1.8 公里内,你显然会错过所有线的那部分之间的点。解决方案是在简化它时将点注入(inject)到您的线上(我知道,在添加新点时击败了减少点的目标)。
3 的缺陷是它并不总是准确的,因为多边形内的某些点的距离可能大于您的限制,尽管差异不会是您的限制的很大一部分。
[ 1 ] google maps utils routeboxer
关于mongodb - 在mongodb中查找LineString附近的点按距离排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19015861/