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

Haversine 距离算法详解

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

修罗发布于 2026/3/29更新于 2026/7/2162 浏览

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):
    """
    计算地球表面两点的球面直线距离
    参数:
        lat1: 点 1 的纬度(角度值)
        lon1: 点 1 的经度(角度值)
        lat2: 点 2 的纬度(角度值)
        lon2: 点 2 的经度(角度值)
    返回:
        distance: 两点的球面距离,单位为千米 (km)
    """
    
    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)
()
# 步骤 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. 六、总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 从零构建可扩展 Flutter 应用:v1.0 到 v2.0 架构演进详解
  • C++ 模拟实现 list:双向链表构建与解析
  • 主流大模型横评:GPT、Claude、Gemini、Llama 及国产模型选型指南
  • 文心大模型 4.5 开源实测:快速部署与多模态识别能力测评
  • GitHub Copilot 学生身份认证及激活教程
  • 大模型测评:七款工具降英文 AI 率横向对比
  • llama.cpp 大模型本地部署指南
  • 聪明的人已经发现,26年的前端不对劲了!
  • Claude Code vs. GitHub Copilot CLI 深度评测与选型指南
  • DeepSeek-R1-Distill-Llama-8B 数学解题实战指南
  • 搭建一个基于 Django 框架的 WebApi 项目
  • 离线安装 python-docx:给 Python 3.8.8 用户的一些步骤
  • C 语言无人机传感器数据处理实战:高效滤波与校准技术
  • C语言数组的内存布局与访问方式
  • C++ 核心面试题总结:语法、内存与类机制详解
  • C 语言链表入门详解
  • LLM 大模型存储记忆功能详解
  • C语言精准操控FPGA寄存器与通信协议底层机制
  • Cursor、Kiro 与 Google Antigravity 三款 AI 编程工具评测
  • CVE-2026-21962 Oracle WebLogic 代理插件未授权 RCE 检测与利用

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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