Python-基于Haversine公式计算两点距离

软件:VS Code

目标:批量计算两点距离(经纬度)

1.准备数据

2.计算公式

为了计算基于经纬度点的两两距离,我们需要使用哈弗辛公式(Haversine Formula)。这个公式考虑了地球的球体形状,能将经纬度坐标转换为真实的地面距离(千米)。

给定地球上两点i和j的经纬度(lon1,lat1)和 (lon2,lat2),它们之间的球面距离d计算如下:

1)经纬度转换成弧度

2)计算差值

3)计算距离

3.算法设计

计算N个网格两两之间的距离:

|----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1.数据载入 | 读取 CSV 文件,提取 ID、Longitude (经度) 和 Latitude (纬度) 列。 |
| 2.单位转换 | 将所有经纬度坐标一次性转换为弧度 |
| 3.构建距离矩阵 | 1)初始化 建立一个n*n的矩阵,行代表网格i中心,列代表邻近网格j中心 2)单位统一 把所有的经度和纬度通过数学变换,全部从角度转为弧度 3)嵌套遍历计算 计算点i和点j之间的纬度差和经度差 计算a 计算c 计算d 4)矩阵完善 当 i=j时,距离直接填0 i到j的距离等于j到i的距离,所以算出一个值后,可以同时填入矩阵的 (i,j)和 (j,i)两个位置。 5)当所有的行列都遍历完毕后,你就得到了一个完整的距离矩阵 |
| 4.结果输出 | 将矩阵保存为CSV |

4.实现

1)导入需要的库

复制代码
import pandas as pd
import numpy as np

2)读取csv文件

data=pd.read_csv("计算两点间球面距离经纬度.csv", encoding='utf-8')
lons=data['x'].values
lats=data['y'].values
grid_ids=data['FID'].values

3)初始化矩阵

复制代码
matrix = np.zeros((len(data), len(data)))

4)转成弧度

复制代码
for i in range(len(data)):
    for j in range(i + 1, len(data)): # 只计算上三角
         lon1, lat1, lon2, lat2 = map(np.radians, [lons[i], lats[i], lons[j], lats[j]])

5)计算差值

复制代码
dlon = lon2 - lon1
dlat = lat2 - lat1

6)计算距离

复制代码
a = np.sin(dlat/2)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2)**2 

c = 2 * np.arcsin(np.sqrt(a)) 

r = 6371.393 # 地球半径 

d=r*c

7)给矩阵赋值

复制代码
​​​​​​​matrix[i, j] = dmatrix[j, i] = d

8)保存结果

复制代码
df = pd.DataFrame(matrix, index=grid_ids, columns=grid_ids)
df.to_csv("两点间球面距离经纬度计算结果.csv", encoding='utf-8')

9)完整代码

import pandas as pd
import numpy as np
data=pd.read_csv("计算两点间球面距离经纬度.csv", encoding='utf-8')
lons=data['x'].values
lats=data['y'].values
grid_ids=data['FID'].values
matrix = np.zeros((len(data), len(data)))
for i in range(len(data)):
    for j in range(i + 1, len(data)): # 只计算上三角
        lon1, lat1, lon2, lat2 = map(np.radians, [lons[i], lats[i], lons[j], lats[j]])
        dlon = lon2 - lon1
        dlat = lat2 - lat1
        a = np.sin(dlat/2)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2)**2
        c = 2 * np.arcsin(np.sqrt(a))
        r = 6371.393 # 地球半径
        d=r*c
        matrix[i, j] = d
        matrix[j, i] = d
df = pd.DataFrame(matrix, index=grid_ids, columns=grid_ids)
df.to_csv("两点间球面距离经纬度计算结果.csv", encoding='utf-8')

10)效果

相关推荐
Gofarlic_oms110 小时前
利用API实现ANSYS许可证管理自动化集成
运维·服务器·开发语言·matlab·自动化·负载均衡
AI+程序员在路上11 小时前
VS Code 完全使用指南:下载、安装、核心功能与 内置AI 编程助手实战
开发语言·人工智能·windows·开源
invicinble11 小时前
这里对java的知识体系做一个全域的介绍
java·开发语言·python
catchadmin11 小时前
使用 PHP TrueAsync 改造 Laravel 协程异步化的可行路径
开发语言·php·laravel
wbs_scy11 小时前
【Linux 线程进阶】进程 vs 线程资源划分 + 线程控制全详解
java·开发语言
AI人工智能+电脑小能手12 小时前
【大白话说Java面试题】【Java基础篇】第15题:JDK1.7中HashMap扩容为什么会发生死循环?如何解决
java·开发语言·数据结构·后端·面试·哈希算法
m0_6742946412 小时前
如何编写SQL存储过程性能对比_记录执行时间评估优化效果
jvm·数据库·python
运气好好的12 小时前
怎样开启phpMyAdmin的操作审计日志_记录每条执行的SQL
jvm·数据库·python
郑州光合科技余经理12 小时前
同城O2O海外版二次开发实战:从支付网关到配送算法
开发语言·前端·后端·算法·架构·uni-app·php
2401_8714928513 小时前
Layui如何修改Layui默认的UI主题颜色(换肤功能实现)
jvm·数据库·python