2013-09-25 42 views
11

我有一系列代表街道(黑色线条)和积分的点,代表着地图上的一个地方(红色点)。我想查找指定街道附近的所有点,按距离排序。我还需要能够指定最大距离(蓝色和绿色区域)。下面是一个简单的例子:在mongodb找到LineString附近的相关信息排序按距离排序

enter image description here

我想使用$near操作者的,但它仅接受Point作为输入,而不是LineString

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

+0

我不认为这是可能的点列表。但是,你可以“放大”街道和使用'$ polygon'或使用'$ near'和做其他的客户端或使用一系列'$ near'的重叠领域。 – mnemosyn

+0

你“放大”街道和使用$多边形? – icaro56

+0

嗨,你有没有找到解决办法? –

回答

7

正如您所提到的,Mongo目前不支持除Point以外的其他任何内容。你有没有遇到过路线拳击手的概念? 1它几年前在Google地图上非常流行。鉴于你绘制的线,找到在dist(x)之内的止损点。这是通过在线的每个点周围创建一系列边界框并搜索桶内的点来完成的。

我刚刚意识到Mongo只能使用点,我认为这是合理的,所以我偶然发现了你的问题。

我已经有几个选择,如何做到这一点(他们扩大@mnemosyn在评论中说)。使用我正在处理的数据集,所有这些都在客户端,所以我可以使用routeboxer,但是为了性能原因,我想在服务器端实现它。这里是我的建议:

  1. 断裂LineString分解成其各个坐标集,并使用每个那些$near查询结果相结合,并提取了独特的一套。有些算法通过减少点数来简化复杂的线条,但是一个简单的点很容易编写。

  2. 和上面一样,但是作为存储过程/函数。我还没有玩过Mongo的存储功能,我不知道他们的驱动程序有多好,但是这可能比上面的第一个选项更快,因为你不需要往返,并且取决于机器您的Mongo实例已被托管,计算速度可能会更快(微秒)。

  3. 执行routeboxer方法服务器端(已在PHP中完成),然后使用上述2中的任意一个找到停止位,即$within所产生的边界框。由于routeboxer方法返回矩形,因此可以将所有这些矩形合并为一个覆盖您的路线的多边形,并且只需执行$within即可。 (什么@mnemosyn建议)。

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

这是我将要工作不久(希望),我会开源我在此基础上我最终会导致(S)的东西。

编辑:我必须指出,虽然1和2有一个缺陷,如果你有一条线,说2公里,并且你想要的点在1以内的点。你的路线8km,你显然会错过你的路线之间的所有点。解决的办法是简化它,当注入点到你的线(我知道,拍在添加新的回来时减少点的目标)。

3的缺陷则是,它不会永远是准确的,因为你的多边形内的一些点可能比你的极限的距离更大,但差别不会是你的极限的显著比例。

[1]google maps utils routeboxer

0

至于你说蒙戈的$附近仅适用于点不是行作为然而,如果从找点翻转你的前提线附近找点附近的线,则中心点您可以使用您的点为中心,以线为目标

这是

foreach line find points near it 

之间的区别
foreach point find line near it 

,如果你有大量的点来检查,你可以结合这与nevi_me的回答减少需要检查,以更小的子集