在mongodb中找到靠近距离的LineString附近的点

Kin*_*ien 12 mongodb

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

在此输入图像描述

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

mongodb如何处理这类查询?

nev*_*_me 7

正如你所提到的,Mongo目前不支持任何其他内容Point.你有没有遇到过路线拳击手的概念?1几年前它在谷歌地图上非常受欢迎.给定您绘制的线,找到内部的止损dist(x).这是通过在线中的每个点周围创建一系列边界框并搜索落在桶中的点来完成的.

在我意识到Mongo只能使用积分时,我偶然发现了你的问题,这是合理的.

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

  1. 将其LineString分解为各自的坐标集,并查询$near每个坐标集,组合结果并提取唯一集.有一些算法可以通过减少点数来简化复杂的线条,但是一个简单的算法很容易编写.

  2. 与上面相同,但作为存储过程/函数.我没有使用Mongo的存储函数,我不知道它们与驱动程序的工作情况如何,但这可能比上面的第一个选项更快,因为你不必进行往返,并且取决于机器你的Mongo实例是托管的,计算速度可以快几微秒.

  3. 实现routeboxer方法服务器端(已在PHP中完成),然后使用上述2中的任何一个来查找$within结果边界框的停靠点.因为routeboxer方法返回矩形,所以可以将所有这些矩形合并为覆盖路线的一个多边形,然后就可以了$within.(@mnemosyn建议的).

  4. 编辑:我想到了这个,但忘了它,但有可能使用聚合框架实现上述一些.

这是我即将开始工作的东西(希望如此),我将根据我的结果开源我的结果.

编辑:我必须提一下,虽然1和2有一个缺陷,如果你在一条线上有2个点,相距2公里,而你想要的线距你的线1.8公里,你显然会错过所有点之间你的那一部分.解决方案是在简化时将点注入你的线上(我知道,当重新添加新点时,可以减少点的目标).

然后3的缺陷是它并不总是准确的,因为你的多边形中的某些点可能有一个大于你的极限的距离,尽管差异不会是你的极限的重要百分比.

[ 1 ] google maps utils routeboxer