我需要使用MongoDB评估Point
与LineString
的接近程度。
由于$near
运算符只能将Point
与另一个Point
进行比较,因此我需要从LineString
生成多边形,因此我可以使用{{ 1}}运算符。 LineString和多边形边缘之间的距离应该代表我想要搜索的半径,例如下面用红色表示:
为了实现这个目标,有什么可能是有用的算法?
答案 0 :(得分:3)
我认为编写自己的函数要容易得多
找到点和线之间的(垂直)距离,然后通过多边形方法创建多边形线的粗细。
其中:
P0,P1
是行结束点P
是点d
是他们之间的距离行定义为:p(t)=P0+(P1-P0)*t
其中t=<0.0,1.0>
所以函数应该这样做:
创建垂直线
q(t)=P+DQ*u
其中u=(-inf,+inf)
DQ
是(P1-P0)在2D中,您可以像(x,y) -> (y,-x)
一样轻松获取它。在更高的维度中,使用具有一些非共面向量的交叉积。
计算线与线交叉
关于这一点有很多东西,所以谷歌或自己解决方程here你可以提取我的实施。
将d
计算为P
与交叉点之间的距离。不要忘记参数t
必须在范围内。如果不是(或没有交集)那么return min(|P-P0|,|P-P1|)
<强> [提示] 强>
t
和u
参数可以直接从交叉点测试中获取,因此如果将(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