Haversine 距离算法详解(零基础友好版)

作为算法领域的研究者,我会从用途、核心原理、前置知识、公式拆解、代码实现五个维度,给你讲清楚 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(sin2(2Δlat​)+cos(lat1)⋅cos(lat2)⋅sin2(2Δlon​)​)

其中:

  • Δlat=lat2−lat1 :两点的纬度差
  • Δlon=lon2−lon1 :两点的经度差
  • R :地球平均半径(6371km)
  • d :两点的球面直线距离

2. 公式的通俗理解(分 4 步计算)

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

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

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

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

python

运行

# 导入数学库,用于三角函数和弧度转换 import math def haversine_distance(lat1, lon1, lat2, lon2): """ 计算地球表面两点的球面直线距离 参数: lat1: 点1的纬度(角度值) lon1: 点1的经度(角度值) lat2: 点2的纬度(角度值) lon2: 点2的经度(角度值) 返回: distance: 两点的球面距离,单位为千米(km) """ # 步骤1:定义地球平均半径(单位:km) R = 6371.0 # 步骤2:将角度值转换为弧度值 phi1 = math.radians(lat1) # 点1纬度弧度 lambda1 = math.radians(lon1)# 点1经度弧度 phi2 = math.radians(lat2) # 点2纬度弧度 lambda2 = math.radians(lon2)# 点2经度弧度 # 步骤3:计算纬度差和经度差的弧度值 delta_phi = phi2 - phi1 delta_lambda = lambda2 - lambda1 # 步骤4:计算公式中的a值 a = math.sin(delta_phi / 2.0) ** 2 + \ math.cos(phi1) * math.cos(phi2) * \ math.sin(delta_lambda / 2.0) ** 2 # 步骤5:计算最终距离 c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) # 等价于2*arcsin(sqrt(a)) distance = R * c return distance # 测试:北京到上海的经纬度 beijing_lat, beijing_lon = 39.9042, 116.4074 shanghai_lat, shanghai_lon = 31.2304, 121.4737 # 调用函数计算距离 distance = haversine_distance(beijing_lat, beijing_lon, shanghai_lat, shanghai_lon) print(f"北京到上海的球面直线距离约为:{distance:.2f} 千米") 

代码运行结果

plaintext

北京到上海的球面直线距离约为:1067.99 千米 

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

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

1. 优点

  • 计算简单:仅依赖基础三角函数,代码实现成本低。
  • 精度足够:对于非高精度场景(如打车、外卖、旅游),误差可忽略。
  • 无依赖:不需要额外的地理数据,只要经纬度就能计算。

2. 缺点

  • 假设地球是完美球体:实际地球是 “椭球体”,在高纬度地区误差会略大(但不超过 0.5%)。
  • 不适合超长距离高精度计算:比如洲际导航,此时建议用更精确的 Vincenty 算法(基于椭球模型)。

3. 典型适用场景

  • 地图 APP 的两点测距功能
  • 打车 / 外卖软件的预估里程与费用计算
  • 物流行业的路径规划(同城 / 省内)
  • 户外探险的定位与距离估算

六、 总结

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

Read more

磨损均衡算法介绍

磨损均衡算法介绍

🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习 🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发 ❄️作者主页:一个平凡而乐于分享的小比特的个人主页 ✨收录专栏:硬件知识,本专栏为记录项目中用到的知识点,以及一些硬件常识总结 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖 磨损均衡算法介绍 有关磨损均衡技术的相关资料下载地址:磨损均衡技术相关论文 核心问题:为什么需要磨损均衡? 要理解磨损均衡,首先要明白Flash存储器(包括NAND Flash和NOR Flash)的物理限制: 1. 有限的擦写次数: Flash存储单元在经历一定次数的擦除操作后,会因物理损耗而失效。这个次数就是耐久度。 * SLC NAND: ~10万次 * MLC NAND: ~3千 - 1万次 * TLC NAND: ~500 - 1.5千次 * QLC NAND: ~100

By Ne0inhk
【大数据存储与管理】分布式文件系统HDFS:06 HDFS的数据读写过程

【大数据存储与管理】分布式文件系统HDFS:06 HDFS的数据读写过程

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈大数据技术原理与应用 ⌋ ⌋ ⌋专栏系统介绍大数据的相关知识,分为大数据基础篇、大数据存储与管理篇、大数据处理与分析篇、大数据应用篇。内容包含大数据概述、大数据处理架构Hadoop、分布式文件系统HDFS、分布式数据库HBase、NoSQL数据库、云数据库、MapReduce、Hadoop再探讨、数据仓库Hive、Spark、流计算、Flink、图计算、数据可视化,以及大数据在互联网领域、生物医学领域的应用和大数据的其他应用。 【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/BigData_principle_application。 文章目录 * 一、读数据的过程 * 二、写数据的过程 * 小结 在介绍 HDFS 的数据读写过程之前,需要简单介绍一下相关的类。FileSystem 是一个通用文件系统的抽象基类,可以被分布式文件系统继承,所有可能使用

By Ne0inhk
【数据结构和算法】面试必刷之随机链表复制:这三步让你彻底吃透 random 指针

【数据结构和算法】面试必刷之随机链表复制:这三步让你彻底吃透 random 指针

🔥小龙报:个人主页 🎬作者简介:C++研发,嵌入式,机器人等方向学习者 ❄️个人专栏:《C语言》《【初阶】数据结构与算法》 ✨ 永远相信美好的事情即将发生 文章目录 * 前言 * 一、随即链表的复制 * 1.1 题目 * 1.2 算法原理 * 1.3 代码 * 总结与每日励志 前言 随机链表的复制是数据结构中的经典难题,核心难点在于复制节点的random指针——其指向的节点可能尚未创建,也可能指向链表中的任意节点。本文采用“原地拷贝+拆分”的最优思路,分三步拆解解题逻辑,结合代码实现与原理分析,清晰讲解如何高效解决该问题,帮助读者吃透random指针的处理技巧,掌握链表操作的核心思维。 一、随即链表的复制 1.1 题目 链接:随机链表的复制 1.2 算法原理

By Ne0inhk
HDFS核心组件深度解析:分布式文件系统的架构基石

HDFS核心组件深度解析:分布式文件系统的架构基石

HDFS核心组件深度解析:分布式文件系统的架构基石 * 引言:HDFS——大数据的存储基石 * 一、HDFS架构全景 * 1.1 主从架构设计 * 1.2 核心组件概览 * 二、NameNode:HDFS的"大脑" * 2.1 核心职责 * 2.2 元数据存储结构 * 2.3 内存与持久化 * 2.4 单点故障问题 * 三、DataNode:HDFS的"数据仓库" * 3.1 核心职责 * 3.2 工作流程 * 3.3 数据存储结构 * 四、Secondary NameNode:NameNode的&

By Ne0inhk