我有一组代表街道(黑线)的点和代表地图上某个地点的点(红点)。我想找到指定街道附近的所有点,按距离排序。我还需要能够指定最大距离(蓝色和绿色区域)。这是一个简单的例子:
我想用$near
运算符,但它只接受Point
作为输入,而不是LineString
.
mongodb 如何处理这种类型的查询?
正如您提到的,Mongo 目前不支持除Point
。您是否遇到过路线拳击手的概念?1 http://google-maps-utility-library-v3.googlecode.com/svn/trunk/routeboxer/docs/examples.html几年前,它在谷歌地图上非常流行。根据您绘制的线,找到范围内的停靠点dist(x)
。这是通过在线中每个点周围创建一系列边界框并搜索落在桶内的点来完成的。
在我刚刚意识到 Mongo 只适用于点之后,我偶然发现了你的问题,我认为这是合理的。
我已经有一些如何做到这一点的选项(它们扩展了 @mnemosyn 在评论中所说的内容)。对于我正在处理的数据集,它全部位于客户端,因此我可以使用路由箱,但出于性能原因我想在服务器端实现它。以下是我的建议:
打破LineString
深入到其单独的坐标集,并查询$near
使用其中每一个,组合结果并提取唯一的集合。有一些算法可以通过减少点数来简化复杂的直线,但简单的算法很容易编写。
与上面相同,但作为存储过程/函数。我还没有使用过 Mongo 的存储函数,而且我不知道它们与驱动程序的配合情况如何,但这可能比上面的第一个选项更快,因为您不必进行往返,并且取决于所使用的机器如果您托管了 Mongo 实例,计算速度可能会快几微秒。
在服务器端实现routeboxer方法(已在PHP中完成),然后使用上述两种方法之一来查找$within
由此产生的边界框。哎呀,由于routeboxer方法返回矩形,因此可以将所有这些矩形合并成一个覆盖您路线的多边形,然后只需执行$within
关于这一点。 (@mnemosyn 建议的)。
EDIT:我想到了这一点,但忘记了,但使用聚合框架也许可以实现上述一些功能。
这是我很快就会做的事情(希望如此),我将根据我最终的结果开源我的结果。
EDIT:我必须提到,虽然 1 和 2 有一个缺陷,如果你在一条线上有 2 个相距 2 公里的点,并且你想要距离你的线 1.8 公里以内的点,那么你显然会错过该部分之间的所有点你的线路。解决方案是在简化线时将点注入到线上(我知道,这比添加新点时减少点的目标要好)。
3 的缺陷是它并不总是准确的,因为多边形内的某些点的距离可能大于您的限制,尽管差异不会占限制的很大百分比。
[1 http://google-maps-utility-library-v3.googlecode.com/svn/trunk/routeboxer/docs/examples.html] 谷歌地图 utils 路线箱 http://google-maps-utility-library-v3.googlecode.com/svn/trunk/routeboxer/docs/examples.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)