将点投射到路径上

时间:2015-06-18 20:18:01

标签: javascript algorithm geolocation latitude-longitude

假设我有一个包含描述路径的点(lat, lon)的有序数组,并且我还有一个描述我当前位置的点(lat, lon)

如何将点投影到路径上(并将点放在数组中的适当位置)?

我尝试的只是通过搜索最近的两个点并假设它们位于它们的中间。这是一个很好的猜测,但有时会失败。

这样做的好方法是什么?

2 个答案:

答案 0 :(得分:1)

我认为是这样的:

line segment overview

  • p0,p1是路径线段端点
  • p是您的职位
  • q'最接近3D cartessian
  • 的点
  • q q'由球形投影修正

所以:

  1. 将积分转换为3D cartessian坐标
  2. 计算与点和线的垂直距离

    • q'=p0+(dot(p-p0,p1-p0)*(p1-p0)/(|p-p0|*|p1-p0|))
    • perpendicular_distance = |p-q'|
  3. 找到具有最小vertical_distance的段

    并仅将其用于剩余的子弹

  4. 计算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|显然,但我想确定你得到它的方式......

  5. q从笛卡尔坐标转换为球坐标

  6. <强> [注释]

    • |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)

找到最接近当前位置的路径段。

Distance from point to a line