我有一组代表街道(黑线)的点和代表 map 上一个地点的点(红点)。我想找到指定街道附近的所有点,按距离排序。我还需要能够指定最大距离(蓝色和绿色区域)。这是一个简单的例子:

mongodb - 在mongodb中查找LineString附近的点按距离排序-LMLPHP

我想过使用 $near 运算符,但它只接受 Point 作为输入,而不是 LineString

mongodb 如何处理这种类型的查询?

最佳答案

正如您所提到的,Mongo 目前不支持除 Point 以外的任何内容。您是否遇到过路线拳击手的概念? 1 几年前它在谷歌 map 上非常流行。根据您绘制的线,找到 dist(x) 内的停靠点。它是通过在线条中的每个点周围创建一系列边界框并搜索落入桶内的点来完成的。

在我刚刚意识到 Mongo 仅适用于积分后,我偶然发现了您的问题,我认为这是合理的。

我已经有了一些关于如何去做的选择(他们扩展了@mnemosyn 在评论中所说的内容)。对于我正在处理的数据集,它全部在客户端,因此我可以使用 routeboxer,但出于性能原因,我想在服务器端实现它。以下是我的建议:

  • LineString 分解为单独的坐标集,并使用每个坐标集查询 $near,组合结果并提取唯一的集。有一些算法可以通过减少点数来简化复杂的线,但简单的算法很容易编写。
  • 与上述相同,但作为存储过程/函数。我没有玩过 Mongo 的存储函数,我不知道它们与驱动程序的配合情况如何,但这可能比上面的第一个选项更快,因为您不必进行往返,并且取决于机器您的 Mongo 实例是托管的,计算速度可能会快几微秒。
  • 在服务端实现routeboxer方法(PHP已经实现),然后使用上面2个中的任何一个来找到$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/

    10-13 02:11