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

5

如何在地球平面图上绘制表示两点之间最短距离的曲线?

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

编辑:谢谢大家的回答 - 很抱歉我选择解决方案的速度有点慢 :/


你想将地球建模为一个简单的球体还是它真实的形状(在极点处扁平)?如果你将其简化为一个球体,那就很容易了。 - Michael Myers
计算两个城市之间的距离 - ire_and_curses
还有一些:https://dev59.com/enRC5IYBdhLWcg3wP-dh,https://dev59.com/cnM_5IYBdhLWcg3wWRkF - ire_and_curses
@ire - 我不同意这是一个重复问题。那些问题只是想要距离,而这个问题想要“绘制曲线”,这意味着需要计算中间点以便在图形上绘制它们。 - Paul Tomblin
2
显然,关于你所询问的问题存在很多混淆。绘制最短路径和计算最短距离是两个非常不同的问题。你需要哪方面的帮助? - Donnie DeBoer
显示剩余2条评论
2个回答

12

我从Aviation Formulary获取到如下信息:

在这个例子里:

两点之间的距离

坐标为{lat1,lon1}和{lat2,lon2}的两点之间的大圆距离d可以由以下公式计算:

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))

以及

大圆上的中间点

在前面的部分,我们已经找到了大圆上给定纬度或经度的中间点。这里我们要找到大圆路线上给定距离(d)的一定比例(f)的点(lat,lon)。假设起始点为(lat1,lon1),终点为(lat2,lon2),我们想要沿着大圆路线找到距离起点一定比例的点。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)

保罗,你说:“对于短距离来说,这种方法不太容易出现舍入误差。”那么,这种方法适用于多长的距离呢?我需要一种能够在100米到1000米的距离范围内保持准确的方法。 - KevinDTimm
@kevin - 我在引用航空公式。我不知道他认为什么是短的,但我总是为我的飞行计划使用“更不容易出现舍入误差”的版本。 - Paul Tomblin
谢谢!大圆上的中间点正是我所需要的。顺便说一下,抱歉问题表述不够清晰 - 我在这个领域的知识目前最多只能算模糊。 - helloworlder

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接