查看原文
其他

学点几何 | 计算球面距离的哈弗塞恩公式

王海华 模型视角 2023-10-04

又到了国庆假期,在外打工的我难得的几次回家的机会之一。坐在飞机上,我开始思考从上海飞回家的距离,飞机需要飞多久才能到家呢?飞机又是如何飞的呢?这背后都与一个数学公式有关——哈弗赛恩公式。本文就来梳理一下和计算球面距离相关的内容。

1. 测量距离的历史

在古代,人们使用非常原始的方法来估算距离,如步行或骑马,并计算所需的时间。随着地图的发展和数学的进步,人们开始寻找更准确的测量方法。16世纪,随着大航海时代的到来,准确测量两地之间的距离变得非常重要。天文观测,特别是恒星的位置,开始被用来帮助航海家确定他们的位置。18世纪,随着三角测量法的发展,测量的准确性得到了极大的提高。20世纪,随着GPS技术的出现,我们可以非常准确地计算地球上任何两点之间的距离。

2. 哈弗赛恩公式

给定两个点的经度和纬度,我们可以使用哈弗赛恩公式来计算它们之间的距离。通过这种方式,航空公司可以确定两个机场之间的最短距离,这被称为大圆航线。

给定两个点的经度和纬度,我们可以使用哈弗赛恩公式来计算它们之间的距离:

基中 lat 和 long 分别是两点纬度和经度的差。 分别是第一个点和第二个点的纬度。 是两点之间的距离。 是地球的半径,约为6371公里。

地球不是完美的球体,这里为了简化计算,我们可以将其视为一个半径为R的球体。这样,地球上任何两点之间的距离都可以使用球面距离公式(哈佛塞恩公式)来计算。但要注意,这种方法只是给出两地之间的近似距离。

3. 实际应用:飞机航线选择

在飞机航线选择上,航空公司通常使用哈弗赛恩公式来确定两个机场之间的最短距离,这被称为大圆航线。这条航线是在地球表面上两点之间的最短路径。通过这种方式,航空公司可以节省燃料、时间和成本。

为了给大家一个直观的感受,我们将使用哈弗赛恩公式计算中国的四大城市:北京、上海、广州和深圳之间的距离。

  1. 四大城市间的距离 使用哈弗赛恩公式,我们可以计算北上广深之间的距离。
import math

# 定义哈弗赛恩公式函数
def haversine_distance(lat1, lon1, lat2, lon2):
    R = 6371.0  # 地球半径,单位为公里

    dlat = math.radians(lat2 - lat1)
    dlon = math.radians(lon2 - lon1)
    
    a = (math.sin(dlat / 2) ** 2 +
         math.cos(math.radians(lat1)) * math.cos(math.radians(lat2)) * 
         math.sin(dlon / 2) ** 2)
    
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))

    distance = R * c
    return distance

# 四大城市的经纬度
cities = {
    "北京": (39.9042116.4074),
    "上海": (31.2304121.4737),
    "广州": (23.1291113.2644),
    "深圳": (22.5431114.0579)
}

# 计算城市间的距离
distances = {}
city_names = list(cities.keys())

for i in range(len(city_names)):
    for j in range(i+1, len(city_names)):
        city1 = city_names[i]
        city2 = city_names[j]
        dist = haversine_distance(cities[city1][0], cities[city1][1], cities[city2][0], cities[city2][1])
        distances[f"{city1}-{city2}"] = dist

distances

根据哈弗赛恩公式计算得到的四大城市间距离如下:

  • 北京至上海:约1067.31公里
  • 北京至广州:约1888.59公里
  • 北京至深圳:约1943.14公里
  • 上海至广州:约1211.89公里
  • 上海至深圳:约1213.27公里
  • 广州至深圳:约104.20公里

通常,一个商业喷气式飞机的巡航速度约为800-900公里/小时。知道了飞行距离和飞机的速度,我们就可以简单地计算出飞行时间。假设飞机的平均速度为850公里/小时,我们可以计算以下城市间的飞行时间:

  • 北京至上海:飞行时间约为1.25小时
  • 北京至广州:飞行时间约为2.22小时
  • 北京至深圳:飞行时间约为2.28小时
  • 上海至广州:飞行时间约为1.43小时
  • 上海至深圳:飞行时间约为1.43小时
  • 广州至深圳:飞行时间约为0.12小时
下面是真实的航班数据:

可以看到这里计算的时间比真实飞机飞行时间要长,因为没有考虑到飞机的起落时间、天气因素、交通管制等影响。


哎,似乎回家的路并不需要多少时间。飞机巡航在天空中,地球在脚下快速地掠过,所有的山川河流都变得如此渺小,而家,始终是那个不变的坐标。然而,尽管科技已经让距离变得如此短暂,为什么一年之中,我仍然回不了几次家呢?可能,真正隔在我们之间的,不仅仅是物理上的距离,还有生活的压力、工作的繁忙和那份对家的深深眷恋。每一次的思念,都让回家的脚步变得更为沉重。希望每一次的分别,都是为了更好的团聚。不过我还是马上要到家了啊!

祝大家国庆快乐!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存