计算地球平面地图上两点之间的最短路径

Posted

技术标签:

【中文标题】计算地球平面地图上两点之间的最短路径【英文标题】:Calculating shortest path between 2 points on a flat map of the Earth 【发布时间】:2009-12-08 16:28:47 【问题描述】:

你如何画出代表地球平面地图上两点之间最短距离的曲线?

当然,这条线不会是直线,因为地球是弯曲的。 (例如,两个机场之间的最短距离是弯曲的。)

编辑:感谢所有的答案家伙 - 抱歉我选择解决方案的速度很慢:/

【问题讨论】:

您想将地球建模为一个简单的球体还是它的真实形状(在两极上变平)?如果你把它简化成一个球体就很容易了。 您要使用什么投影?或者,你能澄清一下这个问题吗? 复制:***.com/questions/23569/… 还有更多:***.com/questions/365826/…, ***.com/questions/1420045/… 您所问的问题显然很混乱。绘制最短路径和计算最短距离是两个截然不同的问题。您需要哪方面的帮助? 【参考方案1】:

我从Aviation Formulary 得到这类信息。

在这种情况下:

点之间的距离

之间的大圆距离d 有坐标的两点 给出 lat1,lon1 和 lat2,lon2 作者:

d=acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon1-lon2))

数学上等价的公式, 较少受到四舍五入的影响 短距离的错误是:

d=2*asin(sqrt((sin((lat1-lat2)/2))^2 + cos(lat1)*cos(lat2)*(sin((lon1-lon2)/2))^2))

大圆上的中间点

在前面的章节中我们发现 大圆上的中间点 给定交叉纬度或 经度。在这里我们找到点 (lat,lon) 的给定分数 它们之间的距离(d)。假设 起点是 (lat1,lon1) 和 最后一点(lat2,lon2),我们想要 点 f 沿大 循环路线。 f=0 是点 1。 f=1 是 点2.两点不能 对映(即 lat1+lat2=0 和 abs(lon1-lon2)=pi) 因为那么 路线未定义。中间体 然后给出纬度和经度 作者:

    A=sin((1-f)*d)/sin(d)
    B=sin(f*d)/sin(d)
    x = A*cos(lat1)*cos(lon1) +  B*cos(lat2)*cos(lon2)
    y = A*cos(lat1)*sin(lon1) +  B*cos(lat2)*sin(lon2)
    z = A*sin(lat1)           +  B*sin(lat2)
    lat=atan2(z,sqrt(x^2+y^2))
    lon=atan2(y,x)

【讨论】:

Paul,您说,“短距离的舍入误差较小”。这对多短的距离有好处?我需要在 100M 到 1000M 距离内准确的东西。 @kevin - 我在引用航空公式。我不知道他认为什么短,但我总是为我的飞行计划器使用“较少受到舍入误差”的版本。 谢谢!大圆上的中间点正是我所需要的。顺便说一句,很抱歉这个问题不太清楚 - 我在这方面的知识目前充其量是模糊的。【参考方案2】:

要将地球表面上两点之间的 3D 最短路径绘制到地球表面的 2D 地图上,您必须知道地球的 3D 表面是如何投影到相关的 2D 地图上的。如果您知道使用的投影,只需将其应用于 3D 最短路径即可将其投影到 2D 地图上。如果您不知道使用的确切投影,但可以通过某种界面访问它(即输入 3D 表面坐标 -> 输出 2D 地图坐标),您可以沿 3D 表面路径采样点,生成它们对应的地图通过所述界面点,然后用线段/贝塞尔曲线/等近似投影路径。通过投影的样本点。

【讨论】:

以上是关于计算地球平面地图上两点之间的最短路径的主要内容,如果未能解决你的问题,请参考以下文章

两点之间的最短路径

求c++ 程序 网络上两点间的最短路径

最短路径之最短路径问题

最短路径问题 (最短路模板)

最短路径问题

最短路径——Floyed