假设我有一个包含描述路径的点(lat, lon)
的有序数组,并且我还有一个描述我当前位置的点(lat, lon)
。
如何将点投影到路径上(并将点放在数组中的适当位置)?
我尝试的只是通过搜索最近的两个点并假设它们位于它们的中间。这是一个很好的猜测,但有时会失败。
这样做的好方法是什么?
答案 0 :(得分:1)
我认为是这样的:
p0,p1
是路径线段端点p
是您的职位q'
最接近3D cartessian q
q'
由球形投影修正所以:
计算与点和线的垂直距离
q'=p0+(dot(p-p0,p1-p0)*(p1-p0)/(|p-p0|*|p1-p0|))
perpendicular_distance = |p-q'|
找到具有最小vertical_distance的段
并仅将其用于剩余的子弹
计算q
如果您使用球体而不是椭球,那么您已经知道了半径,如果没有,则以代数方式计算半径或使用平均值:
r=0.5*(|p0-(0,0,0)|+|p1-(0,0,0)|)
假设(0,0,0)
是地球的中心。如果你按位置加权,你也可以更精确:
w=|q'-p0|/|p1-p0|
r=(1-w)*|p0-(0,0,0)|+w*|p1-(0,0,0)|
现在只需更正q'
q=q'*r/|q'|
如果不够明显,请将向量q'
设置为q
,其大小为r
。另外|p0-(0,0,0)|=|p0|
显然,但我想确定你得到它的方式......
将q
从笛卡尔坐标转换为球坐标
<强> [注释] 强>
|a|
是向量a
的大小,类似于:|a|=sqrt(ax*ax+ay*ay+az*az)
dot(a,b)
是向量a,b
的点积,其完成方式如下:dot(a,b)=(a.b)=ax*bx+ay*by+az*bz
如果您的路径形状不是太复杂,那么您可以使用二分搜索来找到最近的段。
对于距离比较,您不需要sqrt
...
答案 1 :(得分:0)
找到最接近当前位置的路径段。