前些天由于工作中需求,要计算经纬度之间的距离,当我去网上搜索距离计算的方法时,发现很多文章中的方法乍一看都是很不同的,同是进行距离计算,为啥这么不一样呢?后来才发现问题在于很多文章没有进行相关的原理说明,直接上了一段代码,让人看了云里雾里的。

其实经纬度属于球面坐标,而我们常规的距离是在平面维度上的,因此,在进行距离计算之前,首先需将球面坐标转换为平面坐标,这样之后才能进行平面距离的测算,计算出来的距离单位就是米了,符合我们的常规认知。(我之前查到的一些方法中,有些是直接调包,有些是十进制和弧度互相做转换,初次接触时可能不是那么好理解背后原理)

以下是亲身实践后,总结的一些可行的计算方法。

一、这种方法按照以上原理,一步一步进行。即先做坐标转换,再进行平面距离计算。

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中如何利用经纬度进行距离计算相关推荐

  1. python运行input不出结果_Python中print和input调用了Python中底层的什么方法

    print print() 用 sys.stdout.write() 实现 import sys print('hello') sys.stdout.write('hello') print('new ...

  2. android double值排序,android根据Double类型数据经纬度算出距离再根据距离实现排序功能...

    前言 项目中用到全国的加油站数据加载 并根据经纬度算出距离 然后根据距离从小到大排序 主要是数据类型是Double 这里必须对数据进行封装 实现也不难 这里讲一下自己的实现方法和实现思路 效果图 先来 ...

  3. Python基础_第3章_Python中的循环结构

    Python基础_第3章_Python中的循环结构 文章目录 Python基础_第3章_Python中的循环结构 Python中的循环结构 一.回顾分支练习题 1.判断是否为一个合法三角形 2.求世界 ...

  4. Python基础_第5章_Python中的数据序列

    Python基础_第5章_Python中的数据序列 文章目录 Python基础_第5章_Python中的数据序列 Python中的数据序列 一.字典--Python中的==查询==神器 1.为什么需要 ...

  5. python 垃圾回收哪时候执行_Python 中的垃圾回收机制是如何工作的?

    CPython 中垃圾回收的主要思路 1.维护引用计数器 .对于每一个对象,都有一个对于该对象的引用次数的计数器.如果这个计数器的值减为了 0 ,这就代表这个对象在程序中已经没用了,那么该对象所占用的 ...

  6. pythonmathcot函数_math库是python语言的数学模块吗_Python中的数学模块:Math和Cmath

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 当我们在日常生活中编写程序时,我们通常遇到需要使用数学来完成任务的情况.像其他编程语言一样,Python提 ...

  7. python数学库函数包括求最大公约数函数吗_pythonmathcot函数_math库是python语言的数学模块吗_Python中的数学模块:...

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 当我们在日常生活中编写程序时,我们通常遇到需要使用数学来完成任务的情况.像其他编程语言一样,Python提 ...

  8. python 正则findall右斜杠_python中正则表达式的使用

    本文将介绍几个最常用的正则符号,以及正则表达式的应用场景. 如果说[数学表达式]刻画的是数字的内在规律,那么[正则表达式]则是用来刻画和描述字符串内在规律的表达式.记得刚接触python时学习过sli ...

  9. python里面返回上一步_Python中的这3个骚操作你会吗?

    本文主要介绍Python的高级特性:列表推导式.迭代器和生成器,是面试中经常会被问到的特性. 因为生成器实现了迭代器协议,可由列表推导式来生成,所有,这三个概念作为一章来介绍,是最便于大家理解的,现在 ...

最新文章

  1. C++ 应用程序性能优化,第 6 章:内存池
  2. 卡写入保护开关原理_老电工带你解密:插卡取电开关
  3. audio h5 src 变了之后_我在叩丁狼学H5
  4. mysql 数据传输 定时,MySQL数据库定时备份的实现方法
  5. 【Leetcode | 01】Backtracking
  6. ie6 7下 relative absolute无法冲破的等级问题解决办法
  7. lua android弹窗关闭,安卓精灵lua调用pm指令实现清除App缓存,举个栗子的说
  8. 广度优先搜索_快速入门广度优先搜索
  9. MongoDB学习(黑马教程)-6-数据库MongoDB的验证时的错误信息的获取
  10. 回顾2020的爷青结:有哪些记忆里的应用正在消逝!
  11. Raucous Rockers_usaco3.4.4
  12. 不容忽视的细节——线面积分中的奇点
  13. 太极自定义diy名片模板_没有合适的手帐本?拿走这些电子模板,自制属于自己的手帐本...
  14. 计算机上画正比例函数,信息技术应用 用计算机画函数图象教案1
  15. JS异步加载库LABjs简易说明
  16. 【TCO2013 Semifinal 2】 OneBlack
  17. java sleep的意义_thread.sleep的作用是什么
  18. 计算机学院 运动会稿,强健体魄,英姿飒爽——计算机学院举办师生迷你运动会...
  19. IoT物联网——各大厂质量保障实践汇总(智能硬件其他篇)
  20. 所有计算机用户的共同点,2016年职称计算机WindowsXP考前押题及答案3

热门文章

  1. 微服务(三):python微服务框架有哪些?
  2. 农村出身的80后身处都市的十大尴尬
  3. 请求方法 GET 和 POST 的区别
  4. Python中类的使用1
  5. 【机器学习】西瓜书学习笔记01
  6. 利用Collections将非线程安全的Map转换成线程安全的Map
  7. 移动退订短信_如何退订自动短信
  8. 钢七连实战C2-P1:游戏编程 大地图移动
  9. AndroidStudio实现简易android登录注册修改密码页面。
  10. 计算机怎么不能磁盘清理,电脑使用磁盘清理功能无法删除Windows.old文件夹怎么办...