【问题标题】:Find points near LineString in mongodb sorted by distance在 mongodb 中查找 LineString 附近的点,按距离排序
【发布时间】:2013-09-25 21:56:55
【问题描述】:

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

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

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

【问题讨论】:

  • 我认为这不可能。但是,您可以“放大”街道并使用 $polygon 或使用 $near 并在客户端执行其余的操作,或者使用带有重叠球体的一系列 $near
  • 你“放大”街道并使用 $polygon 吗?
  • 您好,您找到解决方案了吗?

标签: mongodb


【解决方案1】:

正如您所提到的,Mongo 目前不支持 Point 以外的任何内容。你遇到过路线拳击手的概念吗? 1 几年前它在 Google 地图上非常流行。给定您绘制的线,找到位于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

【讨论】:

    【解决方案2】:

    正如您所说,Mongo 的 $near 仅适用于点而不是线作为中心点,但是如果您将前提从在线附近的查找点翻转到该点附近的线,那么您可以将您的点用作中心和线目标

    这就是区别

    foreach line find points near it
    

    foreach point find line near it
    

    如果您有大量的点要检查,您可以将其与 nevi_me 的答案结合起来,以将需要检查的点列表减少到一个更小的子集

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 2014-09-16
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多