跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python算法

Haversine 距离算法详解

Haversine 距离算法,用于计算地球表面两点基于经纬度的最短球面距离。文章介绍算法用途、经纬度与弧度转换、公式拆解及 Python 实现示例(北京至上海)。同时分析优缺点:计算简单、精度足够但假设地球为球体,适用于地图测距、物流规划等场景,高精度长距离建议使用 Vincenty 算法。

修罗发布于 2026/3/29更新于 2026/10/24124 浏览

Haversine 距离算法是计算地球表面两点球面直线距离的经典算法,日常用的地图测距、打车软件预估里程,背后都有它的身影。

一、算法的核心用途

我们生活的地球是一个近似球体,如果要计算两个地点(比如北京到上海)的'直线距离',不能直接用平面几何的勾股定理(因为地球表面是曲面)。

Haversine 算法的作用,就是基于两点的经纬度坐标,计算它们在地球球面上的最短距离(这个最短距离也叫大圆距离,即穿过球心的平面切割球面形成的圆弧长度)。

二、必须掌握的前置知识

在理解公式前,先记住 3 个关键概念:

  1. 经纬度的定义
    • 纬度 (latitude):衡量地点南北位置,范围是 [-90°, 90°],赤道是 0°,北极是 90°N,南极是 90°S。
    • 经度 (longitude):衡量地点东西位置,范围是 [-180°, 180°],本初子午线是 0°,向东为东经,向西为西经。
  2. 角度与弧度的转换数学中三角函数(sin、cos)的计算需要弧度值,而我们日常用的经纬度是角度值,因此必须先转换:
    • 弧度 = 角度 × π / 180°
    • 角度 = 弧度 × 180° / π
  3. 地球半径的取值地球不是完美球体,赤道半径约 6378km,极半径约 6357km。日常计算取平均半径 R = 6371km 即可满足精度需求。

三、Haversine 公式拆解

1. 公式的数学表达式

假设地球表面有两点:

  • 点 A:纬度 lat1,经度 lon1
  • 点 B:纬度 lat2,经度 lon2

Haversine 公式的最终形式为:

d = 2R · arcsin(√(sin²(Δφ/2) + cos(φ1)·cos(φ2)·sin²(Δλ/2)))

其中:

  • Δφ = lat2 − lat1:两点的纬度差
  • Δλ = lon2 − lon1:两点的经度差
  • R:地球平均半径(6371km)
  • d:两点的球面直线距离
2. 公式的通俗理解(分 4 步计算)

我们不用死记公式,而是把计算拆成 4 个简单步骤:

  1. 角度转弧度将 lat1, lon1, lat2, lon2 全部转换成弧度值(记为 φ1, λ1, φ2, λ2)。
  2. 计算差值计算纬度差 Δφ=φ2−φ1,经度差 Δλ=λ2−λ1。
  3. 计算核心根式代入公式计算根号内的部分:a=sin²(Δφ/2)+cos(φ1)·cos(φ2)·sin²(Δλ/2)
  4. 计算最终距离代入公式计算距离:d=2R·arcsin(√a)

四、零基础能看懂的 Python 代码实现

下面给出完整的 Python 代码,逐行添加中文注释,你可以直接复制运行。我们以北京(39.9042°N, 116.4074°E)到上海(31.2304°N, 121.4737°E)为例计算距离。

# 导入数学库,用于三角函数和弧度转换
import math

def haversine_distance(lat1, lon1, lat2, lon2):
    
    
    R = 
    
    
    phi1 = math.radians(lat1)  
    lambda1 = math.radians(lon1)  
    phi2 = math.radians(lat2)  
    lambda2 = math.radians(lon2)  
    
    
    delta_phi = phi2 - phi1
    delta_lambda = lambda2 - lambda1
    
    
    a = math.sin(delta_phi / ) **  + \
        math.cos(phi1) * math.cos(phi2) * \
        math.sin(delta_lambda / ) ** 
    
    
    c =  * math.atan2(math.sqrt(a), math.sqrt( - a))
    
    distance = R * c
     distance


beijing_lat, beijing_lon = , 
shanghai_lat, shanghai_lon = , 


distance = haversine_distance(beijing_lat, beijing_lon, shanghai_lat, shanghai_lon)
()
""" 计算地球表面两点的球面直线距离 参数: lat1: 点 1 的纬度(角度值) lon1: 点 1 的经度(角度值) lat2: 点 2 的纬度(角度值) lon2: 点 2 的经度(角度值) 返回: distance: 两点的球面距离,单位为千米 (km) """
# 步骤 1:定义地球平均半径(单位:km)
6371.0
# 步骤 2:将角度值转换为弧度值
# 点 1 纬度弧度
# 点 1 经度弧度
# 点 2 纬度弧度
# 点 2 经度弧度
# 步骤 3:计算纬度差和经度差的弧度值
# 步骤 4:计算公式中的 a 值
2.0
2
2.0
2
# 步骤 5:计算最终距离 c = 2 * atan2(sqrt(a), sqrt(1-a))
2
1
return
# 测试:北京到上海的经纬度
39.9042
116.4074
31.2304
121.4737
# 调用函数计算距离
print
f"北京到上海的球面直线距离约为:{distance:.2f} 千米"
代码运行结果
北京到上海的球面直线距离约为:1067.99 千米

这个结果和实际地图测距的误差在 1% 以内,完全满足日常使用需求。

五、算法的优缺点与适用场景

1. 优点
  • 计算简单:仅依赖基础三角函数,代码实现成本低。
  • 精度足够:对于非高精度场景(如打车、外卖、旅游),误差可忽略。
  • 无依赖:不需要额外的地理数据,只要经纬度就能计算。
2. 缺点
  • 假设地球是完美球体:实际地球是'椭球体',在高纬度地区误差会略大(但不超过 0.5%)。
  • 不适合超长距离高精度计算:比如洲际导航,此时建议用更精确的 Vincenty 算法(基于椭球模型)。
3. 典型适用场景
  • 地图 APP 的两点测距功能
  • 打车 / 外卖软件的预估里程与费用计算
  • 物流行业的路径规划(同城 / 省内)
  • 户外探险的定位与距离估算

六、总结

Haversine 距离算法的核心就是把地球当成球体,用球面三角学替代平面几何,实现经纬度到实际距离的转换。对于零基础的学生,只要记住'角度转弧度→算差值→代入公式→乘地球半径'这四步,就能轻松掌握这个算法的原理和应用。

目录

  1. 一、算法的核心用途
  2. 二、必须掌握的前置知识
  3. 三、Haversine 公式拆解
  4. 1. 公式的数学表达式
  5. 2. 公式的通俗理解(分 4 步计算)
  6. 四、零基础能看懂的 Python 代码实现
  7. 导入数学库,用于三角函数和弧度转换
  8. 测试:北京到上海的经纬度
  9. 调用函数计算距离
  10. 代码运行结果
  11. 五、算法的优缺点与适用场景
  12. 1. 优点
  13. 2. 缺点
  14. 3. 典型适用场景
  15. 六、总结

更多推荐文章

查看全部
  • Java 代码性能优化的 11 个实用技巧
  • 机器学习常见分类算法实战:原理与代码示例
  • AI 大模型在制造业的深度融合与应用场景
  • Python 数据可视化实战:环境搭建与数据读取入门
  • 自适应图像变焦与边界框变换用于无人机目标检测
  • 全球老龄化背景下的护理机器人发展现状与趋势
  • 35 道常见前端 Vue 面试题解析与实战指南
  • C++ AVL 树底层原理与实现
  • OpenClaw 系统架构分析
  • TRAE SOLO AI 开发体验与 cpolar 内网穿透方案
  • 通义万相 2.1:AIGC 内容创作的新引擎与实现方案
  • 鸿蒙金融理财全栈项目:风险控制、合规审计与产品创新
  • RocketMQ 核心设计:消息存储架构解析
  • Hunyuan-MT-7B-WEBUI 企业级翻译部署与实战
  • Java 面试题及答案(208 道)
  • 线性 DP 五大经典模型:LIS、LCS、合唱队形、编辑距离详解
  • 基于 Docker 部署 One API 进行大模型接口管理与 Key 分发
  • C++ STL 进阶:unordered_set 与 unordered_map 用法及底层模拟
  • C++ 类型转换与 IO 流核心解析
  • OpenAI Whisper 语音转文字完全使用指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online