在缓冲的MongoDB Linestring中使用$ within

时间:2014-08-07 17:18:32

标签: mongodb geometry geospatial geojson

我需要使用MongoDB评估PointLineString的接近程度。

由于$near运算符只能将Point与另一个Point进行比较,因此我需要从LineString生成多边形,因此我可以使用{{ 1}}运算符。 LineString和多边形边缘之间的距离应该代表我想要搜索的半径,例如下面用红色表示:

Polygon from Linestring

为了实现这个目标,有什么可能是有用的算法?

2 个答案:

答案 0 :(得分:3)

我认为编写自己的函数要容易得多

找到点和线之间的(垂直)距离,然后通过多边形方法创建多边形线的粗细。

pnt line

其中:

  • P0,P1是行结束点
  • P是点
  • d是他们之间的距离

行定义为:p(t)=P0+(P1-P0)*t其中t=<0.0,1.0>

所以函数应该这样做:

  1. 创建垂直线

    • q(t)=P+DQ*u其中u=(-inf,+inf)
    • DQ是(P1-P0)
    • 的垂直向量

    在2D中,您可以像(x,y) -> (y,-x)一样轻松获取它。在更高的维度中,使用具有一些非共面向量的交叉积。

  2. 计算线与线交叉

    关于这一点有很多东西,所以谷歌或自己解决方程here你可以提取我的实施。

  3. 成功交叉后
  4. d计算为P与交叉点之间的距离。不要忘记参数t必须在范围内。如果不是(或没有交集)那么return min(|P-P0|,|P-P1|)

  5. <强> [提示]

    tu参数可以直接从交叉点测试中获取,因此如果将(P1-P0)的垂直向量归一化为size = 1,则abs(u)参数为交点是距离

    <强> [注释]

    我不熟悉 mongodb ,所以如果你无法在里面使用自己的测试,那么这个答案已经过时了。

答案 1 :(得分:0)

不幸的是,MongoDB提供了非常基本的地理空间查询,因此您应该自己创建缓冲区。您可以在此处阅读如何操作:Computing a polygon that surrounds a multi-point line

如果您有像WGS84这样的经度/纬度坐标,则必须调整此代码;请在此处阅读如何计算球体上的点之间的距离https://en.wikipedia.org/wiki/Haversine_formula