1. 概述
本文将深入讲解 Haversine 公式(Haversine Formula),它用于计算球面上两点之间的最短距离(即大圆距离)。
我们将从以下角度展开:
- 首先,回顾在笛卡尔坐标系和极坐标系中如何计算两点距离;
- 然后,将极坐标系扩展到三维球面坐标系;
- 最后,介绍 Haversine 公式及其在地理空间计算中的应用。
学习完本文后,你将能理解并实现 Haversine 公式,用于估算地球表面任意两点之间的近似距离。
2. 为什么需要 Haversine 公式?
2.1. 大圆距离的直观理解
在地理信息系统中,计算两点之间的最短路径是一个常见需求,比如:
从 A 地出发,沿地球表面到达 B 地,最短路径是哪条?
这个最短路径就是 大圆路径(Great Circle Path)。Haversine 公式正是用来计算这种路径长度的重要工具。
2.2. 什么是大圆距离?
一个球面可以被无数个平面切割,但只有穿过球心的平面与球面相交形成的圆,才被称为 大圆(Great Circle)。
当两个点位于球面上时,它们之间的大圆距离就是连接它们的唯一一条大圆路径的长度。
✅ 这条路径也被称为 测地线(Geodesic),是球面上两点之间的最短路径。
2.3. 地球不是平的,但也不是完美的球体
在三维平直空间中,我们可以用欧几里得距离(Euclidean Distance)计算两点之间的直线距离。但在球面上,比如地球表面,这种直线并不存在,我们只能沿着球面移动。
因此,我们需要用大圆距离来代替欧几里得距离。
⚠️ 虽然地球不是完美的球体,但在大多数应用中,使用球面近似已足够精确。
2.4. 不仅用于地球表面
除了地球表面,Haversine 公式也适用于以下场景:
- 卫星轨道(如地球同步轨道)中的路径计算;
- 飞机航线规划;
- 电子绕原子核运动的轨迹计算。
这些场景的共同点是:运动路径限制在某个球面上。
2.5. 距离公式应满足的条件
为了计算球面两点之间的距离,公式应满足以下条件:
- ✅ 距离是球体半径的单调递增函数;
- ✅ 当两点重合时,距离为 0;
- ✅ 当两点位于球体两端时,距离最大(即 π × 半径);
- ✅ 公式应能表达两点之间的角度差。
这些要求最终都由 Haversine 公式所满足。
3. 平面和球面的距离计算
3.1. 欧几里得距离
在二维平面上,两点 A(x₁, y₁) 和 B(x₂, y₂) 之间的欧几里得距离为:
$$ d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2} $$
在更高维空间中,也可以推广为:
$$ d = \sqrt{\sum_{i=1}^n (B_i - A_i)^2} $$
但这种公式只适用于平面,不适用于球面。
3.2. 极坐标系下的距离
在极坐标系中,点用 (r, θ) 表示。两点 A(r₁, θ₁) 和 B(r₂, θ₂) 之间的距离为:
$$ d = \sqrt{r_1^2 + r_2^2 - 2 r_1 r_2 \cos(\theta_1 - \theta_2)} $$
⚠️ 但这个公式也不适用于球面距离。
4. Haversine 公式详解
4.1. 三维极坐标系统
在三维空间中,有两种常见的极坐标扩展:
- 圆柱坐标系(Cylindrical Coordinates);
- 球面坐标系(Spherical Coordinates)。
我们主要使用球面坐标系,因为地球表面的点通常用经纬度表示。
在球面坐标系中,大圆路径是球面与穿过球心的平面的交线。
两点之间的距离就是这条大圆路径的弧长。
4.2. Haversine 公式定义
设两点 A 和 B 的经纬度分别为:
- A: (φ₁, λ₁)
- B: (φ₂, λ₂)
其中 φ 表示纬度,λ 表示经度,单位为 弧度。
球体半径为 r(通常取地球平均半径 6371 km)。
则两点之间的大圆距离 d 为:
$$ d = r \cdot \text{archav}(\text{hav}(\Delta\phi) + \cos(\phi_1) \cdot \cos(\phi_2) \cdot \text{hav}(\Delta\lambda)) $$
其中:
- Δφ = φ₂ - φ₁
- Δλ = λ₂ - λ₁
- $\text{hav}(\theta) = \sin^2\left(\frac{\theta}{2}\right)$
4.3. 地球不是完美的球体
地球是一个 椭球体,赤道半径约为 6378 km,极半径约为 6356 km。
在实际应用中,我们通常使用平均半径:
$$ r = 6371 \text{ km} $$
但如果两点靠近极地或赤道,可以分别使用极半径或赤道半径以提高精度。
5. 总结
- ✅ Haversine 公式用于计算球面两点之间的大圆距离;
- ✅ 它适用于地球表面、卫星轨道、飞机航线等场景;
- ✅ 公式基于球面三角学,使用经纬度计算;
- ✅ 实际应用中,地球半径通常取 6371 km。
掌握 Haversine 公式后,你就可以在 Java、Python 或其他语言中轻松实现地理距离计算功能了。