我已经在各种编程语言中看到许多使用Douglas-Peucker折线简化算法来生成要在Google地图上使用的GPolyline的示例。 该算法在计划中为折线表示时,涉及计算点与线之间的距离(通过另外两个点)。
现在我到目前为止看到的所有例子都是以非常天真的方式应用算法,只需用纬度和经度替换x和y即可。只要折线非常局部化,不太靠近极点,并且不会穿过180°子午线,这可能会产生可接受的结果,但我想实现更一般的算法版本。
所以,如果我没有弄错的话,我需要计算一个球体表面上最短弧的长度,从一个点到圆圈穿过球体表面的两个其他点,即它与球体的中心(地球)重合。
有谁知道计算这个长度的公式?
提前致谢
答案 0 :(得分:2)
我会尝试用单位向量 p , q 和 r 来表达一切,可以将其视为点在单位范围Σ以原点 0 为中心。您可以通过按地球半径放大来将其转换为地面数量。有一些background material here。
我们希望找到 p 的大圆距离 d 到通过 q 的大圆 C 和 r 。 C 是平面 P 和球体Σ的交点,其中 P 是通过的平面< strong> q , r ,原点 0 。 d 只是 p 和 P 之间的角度θ(以弧度表示)。 P 的法线向量是归一化的叉积 q × r /sinφ,其中φ是 q 和 r 。
我们最终
θ= arcsin( p ⋅( q × r )/sinφ)
正如我所说,这里的一切都被地球的半径 R 放大了。所以三点是* R *** p **,* R *** q **,* R *** r **,距离是 R θ。
但是,如果你想要的是找到最短距离的点/线组合,你可以省略乘以 R 。实际上你可以省略arcsin(),只看一下 p 的相对大小( q × r )/sinφ。 / p>