【Python】经纬度计算距离
2022/2/9 1:12:37
本文主要是介绍【Python】经纬度计算距离,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
转载自:根据经纬度计算两地距离_weixin_34218890的博客-CSDN博客最近工作需要,网上搜索了下根据经纬度计算两地距离的方法,发现要么是几何法,画图、作一堆辅助线,然后证明推理,要么二话不说直接套公式。这篇文章介绍一种容易理解的方式来求这个距离。0b00 思路地球是个不规则的椭球体、为了简便我们当作球体来计算。 球体上两地的最短距离就是经过两点的大圆的劣弧长度。思路如下:弧长 ← 弦长(两点距离)...https://blog.csdn.net/weixin_34218890/article/details/88740639
原文对原理的阐释非常清晰,浅显易懂,非常好的帖子,所以转过来留存。
原文代码使用的是非Python语言,以下我改为Python代码。原文的地球半径我改为更精确的数值。
最近工作需要,网上搜索了下根据经纬度计算两地距离的方法,发现要么是几何法,画图、作一堆辅助线,然后证明推理,要么二话不说直接套公式。这篇文章介绍一种容易理解的方式来求这个距离。
0b00 思路
地球是个不规则的椭球体、为了简便我们当作球体来计算。
球体上两地的最短距离就是经过两点的大圆的劣弧长度。
思路如下:
弧长 ← 弦长(两点距离) ← 两点坐标(直角坐标) ← 经纬度
0b01 计算
1. 坐标转换
设
- 地球半径为 R
- 地心到 E 0° N 0° 的连线为 x 轴
- 地心到 E 90° N 0° 的连线为 y 轴
- 地心到 E 0° N 90° 的连线为 z 轴
- 地球表面有一点 A , 经度为 e , 纬度为 n , 单位为弧度
则 A 的三维坐标可表示为:
如何将角度转换为弧度的代码,此非Python代码,完整Python代码见下文。
注意代码中的 e, n是角度值,如112.123456 和 34.213123。与公式中的 e , n含义不同,公式中的 e, n是弧度,如 1/2*π,3/4*π。
const R = 6371 const {cos, sin, PI} = Math let getPoint = (e, n) => { //首先将角度转为弧度 e *= PI/180 n *= PI/180 reutrn { x: R*cos(n)*cos(e), y: R*cos(n)*sin(e), z: R*sin(n) } }
2. 根据坐标计算两点距离
这个太简单,跳过
3. 根据弦长求弧长
这个可以画个图,帮助理解:
现在已知弦长 c , 半径 R , 要求弧 r 的长度
这很简单, 只需先求出 ∠a (角阿尔法) 的大小 :
0b10 最终代码
# -*- coding:utf-8 -*- # python3 import math def getDistance(e1,n1,e2,n2): ''' 获取两经纬度之间的距离 :param e1: 点1的东经, 单位:角度, 如果是西经则为负 :param n1: 点1的北纬, 单位:角度, 如果是南纬则为负 :param e2: :param n2: :return: 两个经纬度间距离,单位千米 ''' R = 6378.137 #地球半径,单位千米 # 将经纬度度数转为弧度 def getPoint(e,n): e *= math.pi / 180.0 n *= math.pi / 180.0 #这里 R* 被去掉, 相当于先求单位圆上两点的距, 最后会再将这个距离放大 R 倍 return (math.cos(n)*math.cos(e), math.cos(n)*math.sin(e), math.sin(n)) # 计算三维空间的斜边长度 def myHypot(a,b,c): return math.sqrt(a**2+b**2+c**2) a = getPoint(e1,n1) b = getPoint(e2,n2) c = myHypot(a[0] - b[0], a[1] - b[1], a[2] - b[2]) r = math.asin(c/2)*2*R return r d = getDistance(114.330455,30.551676,114.330829,30.551707) print(d*1000) # 36.01924221638155
这篇关于【Python】经纬度计算距离的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-21Python编程基础教程
- 2024-11-20Python编程基础与实践
- 2024-11-20Python编程基础与高级应用
- 2024-11-19Python 基础编程教程
- 2024-11-19Python基础入门教程
- 2024-11-17在FastAPI项目中添加一个生产级别的数据库——本地环境搭建指南
- 2024-11-16`PyMuPDF4LLM`:提取PDF数据的神器
- 2024-11-16四种数据科学Web界面框架快速对比:Rio、Reflex、Streamlit和Plotly Dash
- 2024-11-14获取参数学习:Python编程入门教程
- 2024-11-14Python编程基础入门