将点投影到路径上

Projecting a point onto a path

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

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

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

这样做的好方法是什么?

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

Distance from point to a line

我是这样看的:

  • p0,p1是路径线段端点
  • p是你的位置
  • q' 3D 笛卡尔坐标系中直线上最近的点
  • q被球面投影q'校正

所以:

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

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

    并仅将其用于其余的子弹

  4. 计算q

    如果您使用 sphere 而不是 ellipsoid 那么您已经知道半径,如果不知道,那么要么用代数方式计算半径,要么使用平均值:

    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从笛卡尔坐标转换为球坐标

[注释]

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