计算两个地理坐标点之间的球面距离

地球表面两点距离计算算法详解:Haversine vs Vincenty

1. Haversine 公式

1.1 公式简介

Haversine公式是一种计算球面两点间大圆距离(Great-circle distance)的方法,假设地球是完美球体,计算结果是近似值(误差通常在0.5%以内)。

1.2 公式推导

使用半正矢函数(Haversine function):
[
\text{haversin}(\theta) = \sin^2\left(\frac{\theta}{2}\right)
]

计算步骤:

  1. 经纬度转弧度:
    [
    \phi_1 = lat_1 \times \frac{\pi}{180}, \quad \phi_2 = lat_2 \times \frac{\pi}{180}
    ]
    [
    \Delta \phi = \phi_2 - \phi_1, \quad \Delta \lambda = (lon_2 - lon_1) \times \frac{\pi}{180}
    ]

  2. 计算中心角θ:
    [
    a = \sin^2\left(\frac{\Delta \phi}{2}\right) + \cos(\phi_1) \cos(\phi_2) \sin^2\left(\frac{\Delta \lambda}{2}\right)
    ]
    [
    c = 2 \cdot \text{atan2}(\sqrt{a}, \sqrt{1 - a})
    ]

  3. 计算距离:
    [
    d = R \cdot c \quad (R=6371\text{km})
    ]

1.3 SQL实现

```sql
ROUND(
6378.138 * 2 * ASIN(
SQRT(
POW(SIN((lat1 * PI() / 180 - lat2 * PI() / 180) / 2), 2) +
COS(lat1 * PI() / 180) * COS(lat2 * PI() / 180) *
POW(SIN((lon1 * PI() / 180 - lon2 * PI() / 180) / 2), 2)
)
),
2
)