我需要一些简单的东西

"Subject 1.02: How do I find the distance from a point to a line?"

但这适用于 Lon/Lat。

最佳答案

我们将从一些假设开始:

  • 我们将 figure of the earth 建模为 oblate spheroid
  • “线”是指 great circle 的小弧。
  • 我们正在寻找高度准确的解决方案(对于建议的模型)

  • 所以,重新表述你的问题:

    给定三个地球表面点 - p0、p1 和 p2,
    在由 p1 和 p2 定义的大圆的短弧上找到一个地球表面点,它最接近 p0。


    作为解决方案的基础设施,我们需要:
  • 基于初始点、初始方位角和距离找到目标点的精确函数。
  • 测量两点之间距离的精确函数。

  • 我建议分别使用 GeographicLib 的 Direct 和 Inverse 函数,这是我所知道的最准确的实现。

    由于涉及扁球体计算的数学是高度非线性的,我们将构建一个迭代解决方案。

    作为第一步,我们将尝试了解一个图形,其中 X 轴是由 p1 和 p2 定义的大圆的短弧上的一个点,Y 轴是从 p0 到该点的距离 - 可能看起来喜欢:

    这种图形的外观有多种选择: 函数可以单调递增或单调递减。它也可能包含一个点,其一阶导数可能为 0。它可能是最小值(非常微不足道),但也可能是最大值(例如 - 如果 Lat(p0)=0,Lat(p1)= 100 和 Lat(p2)=-100)。但是,在所有情况下,导数改变符号的位置都有 0 或 1 个点。

    理解了这一点,我们现在可以构建一个迭代算法。在每次迭代中:

    我们将计算 dist(p0,p1)、dist(p0,p2) 和 dist(p0,pM),其中 M 是 p1 和 p2 定义的大圆的短弧上 p1 和 p2 之间的中点.现在。我们将检查:
  • if (dist(p0,p1)
  • if (dist(p0,p2)
  • if (dist(p0,p1)
  • if (dist(p0,p2)
    否则,我们无法确定最小值是更接近 p1 还是 p2,因此我们将使用另外两个点来检查:我们将 pL 定义为 p1 和 pM 之间的中点,将 pN 定义为中间点pM 和 p2 之间的点。现在,
  • if (dist(p0,pL)
  • if (dist(p0,pN)
    否则 - p0 介于 pL 和 pN 之间。

    因此,在每次迭代中,我们都将寻找解决方案的弧长减半。

    使用这种方法,我们可以在不到 30 次迭代中获得 1 cm 的精度。

    关于algorithm - 地球上点到线的距离,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7803004/

  • 10-10 16:12