python通过经纬度算出距离_Python中如何利用经纬度进行距离计算
前些天由于工作中需求,要计算经纬度之间的距离,当我去网上搜索距离计算的方法时,发现很多文章中的方法乍一看都是很不同的,同是进行距离计算,为啥这么不一样呢?后来才发现问题在于很多文章没有进行相关的原理说明,直接上了一段代码,让人看了云里雾里的。
其实经纬度属于球面坐标,而我们常规的距离是在平面维度上的,因此,在进行距离计算之前,首先需将球面坐标转换为平面坐标,这样之后才能进行平面距离的测算,计算出来的距离单位就是米了,符合我们的常规认知。(我之前查到的一些方法中,有些是直接调包,有些是十进制和弧度互相做转换,初次接触时可能不是那么好理解背后原理)
以下是亲身实践后,总结的一些可行的计算方法。
一、这种方法按照以上原理,一步一步进行。即先做坐标转换,再进行平面距离计算。
1、这里的坐标转换,可以使用pyproj包中的Transformer功能,以下是代码:
def axis_conversion(data,lat,lon):
#注意lat 在前,lon在后,不能写反
lon = data[lon].values
lat = data[lat].values
transformer = Transformer.from_crs("epsg:4326", "epsg:3857")
#这里将epsg4326转换为epsg3857
#关于坐标系的知识可以参考这个网址:https://www.cnblogs.com/E7868A/p/11460865.html
x3, y3 = transformer.transform(lat, lon)
return (x3,y3)
2、坐标转换完成后,套用欧氏距离计算公式,来进行距离的测算。
二、直接使用python中现有包的功能(推荐)。
这里的包指的是scipy,scipy是一个高级的科学计算库,常见的是插值运算、优化算法、图像处理和数学统计等。它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题。
这里使用到的是scipy.spatial子模块,具体使用方式如下:
from scipy.spatial.distance import cdist
lonlat1=data_lonlat_1[['lat_1','lon_1']]
lonlat2=data_lonlat_2[['lat_2','lon_2']]
distance=cdist(lonlat1,lonlat2,metric='euclidean')
不得不说,方法二真的很强大了!对比方法一会高效很多,当数据量大的时候尤其明显,更推荐哈(两种方法的结果是一致的)。
三、其他
在资料搜索过程中,也有看到另外两种方法,我目前没有真正使用,但是测试过,与上面两种方法得出的结果,会稍有偏差,感兴趣的可以研究下。
from geopy.distance import geodesic
print(geodesic((lat1,lon1), (lat2,lon2)).m)
from math import radians, cos, sin, asin, sqrt
def distance_between_points(lat1, lon1, lat2, lon2):
"""
Calculate the great circle distance between two points
on the earth (specified in decimal degrees)
"""
# 将十进制度数转化为弧度
lon1, lat1, lon2, lat2 = map(radians, [float(lon1), float(lat1), float(lon2), float(lat2)])
# haversine 公式
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2
c = 2 * asin(sqrt(a))
r = 6371 # 地球平均半径,单位为公里
return c * r * 1000
如果这篇文章对你有帮助,请帮忙点点赞哦~
python通过经纬度算出距离_Python中如何利用经纬度进行距离计算相关推荐
- python运行input不出结果_Python中print和input调用了Python中底层的什么方法
print print() 用 sys.stdout.write() 实现 import sys print('hello') sys.stdout.write('hello') print('new ...
- android double值排序,android根据Double类型数据经纬度算出距离再根据距离实现排序功能...
前言 项目中用到全国的加油站数据加载 并根据经纬度算出距离 然后根据距离从小到大排序 主要是数据类型是Double 这里必须对数据进行封装 实现也不难 这里讲一下自己的实现方法和实现思路 效果图 先来 ...
- Python基础_第3章_Python中的循环结构
Python基础_第3章_Python中的循环结构 文章目录 Python基础_第3章_Python中的循环结构 Python中的循环结构 一.回顾分支练习题 1.判断是否为一个合法三角形 2.求世界 ...
- Python基础_第5章_Python中的数据序列
Python基础_第5章_Python中的数据序列 文章目录 Python基础_第5章_Python中的数据序列 Python中的数据序列 一.字典--Python中的==查询==神器 1.为什么需要 ...
- python 垃圾回收哪时候执行_Python 中的垃圾回收机制是如何工作的?
CPython 中垃圾回收的主要思路 1.维护引用计数器 .对于每一个对象,都有一个对于该对象的引用次数的计数器.如果这个计数器的值减为了 0 ,这就代表这个对象在程序中已经没用了,那么该对象所占用的 ...
- pythonmathcot函数_math库是python语言的数学模块吗_Python中的数学模块:Math和Cmath
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 当我们在日常生活中编写程序时,我们通常遇到需要使用数学来完成任务的情况.像其他编程语言一样,Python提 ...
- python数学库函数包括求最大公约数函数吗_pythonmathcot函数_math库是python语言的数学模块吗_Python中的数学模块:...
Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 当我们在日常生活中编写程序时,我们通常遇到需要使用数学来完成任务的情况.像其他编程语言一样,Python提 ...
- python 正则findall右斜杠_python中正则表达式的使用
本文将介绍几个最常用的正则符号,以及正则表达式的应用场景. 如果说[数学表达式]刻画的是数字的内在规律,那么[正则表达式]则是用来刻画和描述字符串内在规律的表达式.记得刚接触python时学习过sli ...
- python里面返回上一步_Python中的这3个骚操作你会吗?
本文主要介绍Python的高级特性:列表推导式.迭代器和生成器,是面试中经常会被问到的特性. 因为生成器实现了迭代器协议,可由列表推导式来生成,所有,这三个概念作为一章来介绍,是最便于大家理解的,现在 ...
最新文章
- C++ 应用程序性能优化,第 6 章:内存池
- 卡写入保护开关原理_老电工带你解密:插卡取电开关
- audio h5 src 变了之后_我在叩丁狼学H5
- mysql 数据传输 定时,MySQL数据库定时备份的实现方法
- 【Leetcode | 01】Backtracking
- ie6 7下 relative absolute无法冲破的等级问题解决办法
- lua android弹窗关闭,安卓精灵lua调用pm指令实现清除App缓存,举个栗子的说
- 广度优先搜索_快速入门广度优先搜索
- MongoDB学习(黑马教程)-6-数据库MongoDB的验证时的错误信息的获取
- 回顾2020的爷青结:有哪些记忆里的应用正在消逝!
- Raucous Rockers_usaco3.4.4
- 不容忽视的细节——线面积分中的奇点
- 太极自定义diy名片模板_没有合适的手帐本?拿走这些电子模板,自制属于自己的手帐本...
- 计算机上画正比例函数,信息技术应用 用计算机画函数图象教案1
- JS异步加载库LABjs简易说明
- 【TCO2013 Semifinal 2】 OneBlack
- java sleep的意义_thread.sleep的作用是什么
- 计算机学院 运动会稿,强健体魄,英姿飒爽——计算机学院举办师生迷你运动会...
- IoT物联网——各大厂质量保障实践汇总(智能硬件其他篇)
- 所有计算机用户的共同点,2016年职称计算机WindowsXP考前押题及答案3