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

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

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

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

【问题讨论】:

标签: math geometry geography


【解决方案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 表面路径采样点,生成它们对应的地图通过所述界面点,然后用线段/贝塞尔曲线/等近似投影路径。通过投影的样本点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2011-07-25
    • 1970-01-01
    • 2012-06-13
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多