Python 优雅地利用两点经纬度计算地理空间距离

简介: Calculate the distance (in various units) between two points on Earth using their latitude and longitude.


一、基本原理


处理地理数据时,经常需要用到两个地理位置间的距离。比如 A 点经纬度(30.553949,114.357399),B点经纬度(129.1344,25.5465),求 AB 两点之间的距离。


已知地球上任意两点(lng1,lat1),(lng2, lat2)的经纬度坐标,求两点间的距离可以利用 haversine 公式:


  • 首先先将经纬度坐标的角度化成弧度(rlng1,rlat1),(rlng2,rlat2)


  • 利用如下公式:


  • 其中 a 表示两点维度的差值,即 a = rlat1 - rlat2, b表示两点经度的差值,即 b = rlng1 - rlng2;其中 r 表示地球的半径


网址:https://map.baidu.com/search/%E5%85%A8%E5%9B%BD/


利用百度地图测距可知,清华大学与北京大学距离大约为1.8km,如下所示:





二、获取地点的经纬度


主要利用高德地图地理编码 / 逆地理编码 API 来获取北京大学和清华大学的经纬度,Python实现如下:


# -*- coding: UTF-8 -*-"""@Author  :叶庭云@CSDN    :https://yetingyun.blog.csdn.net/"""import requests
import json
from pprint import pprint
url ='https://restapi.amap.com/v3/geocode/geo'# 输入API问号前固定不变的部分params = {'key': '换成您的key',                       # 注册高德地图,创建应用获得的key'address': '清华大学'}                      # 将两个参数放入字典res = requests.get(url, params)
# pprint(json.loads(res.text))results = json.loads(res.text)
# 打印结果print(results["geocodes"][0]["formatted_address"] +":"+ results["geocodes"][0]["location"])


结果如下:


  • 北京市海淀区北京大学经纬度:116.308264,39.995304
  • 北京市海淀区清华大学经纬度:116.326759,40.003304


三、手写 haversine 公式计算


Python代码如下:


from math import sin, asin, cos, radians, fabs, sqrt
EARTH_RADIUS =6371# 地球平均半径大约6371kmdef hav(theta):
    s = sin(theta / 2)
    return s * s
def get_distance_hav(lat0, lng0, lat1, lng1):
# 用haversine公式计算球面两点间的距离# 经纬度转换成弧度    lat0 = radians(lat0)
    lat1 = radians(lat1)
    lng0 = radians(lng0)
    lng1 = radians(lng1)
    dlng = fabs(lng0 - lng1)
    dlat = fabs(lat0 - lat1)
    h = hav(dlat) + cos(lat0) * cos(lat1) * hav(dlng)
    distance =2 * EARTH_RADIUS * asin(sqrt(h))      # km    return distance
result = get_distance_hav(39.995304, 116.308264, 40.003304, 116.326759)
print("距离:{:.2f}km".format(result))


结果如下:



四、利用 geopy 库


geopy是一个关于地理编码的 Python 库。主要有以下几个功能:


  • 地理编码:将字符串转换为地理位置
  • 逆地理编码:用于将地理坐标转换为具体地址
  • 计算两个点的距离:经纬度距离和球面距离


pip install安装上即可


pip install geopy -i http://pypi.douban.com/simple --trusted-host pypi.douban.com


Python代码如下:


fromgeopy.distanceimportgeodesicdistance=geodesic((39.995304, 116.308264), (40.003304, 116.326759)).kmprint("距离:{:.3f}km".format(distance))


对比结果如下:



手写 haversine 公式计算距离为:1.809km,而直接调用 geopy 库的 geodesic 方法计算距离为:1.812km,二者计算结果相差很小。


更多有关 geopy 的使用可以学习官方文档: https://www.osgeo.cn/geopy/


五、利用 haversine 库


pypi地址:https://pypi.org/project/haversine/


Calculate the distance (in various units) between two points on Earth using their latitude and longitude.


用经纬度计算地球上两点之间的距离(以不同单位表示),pip install安装即可:



Python代码如下:


importhaversineprint(tuple(haversine.Unit))   # 查看所有可用的单位
fromhaversineimporthaversine, Unit# 两点的经纬度point1= (39.995304, 116.308264)
point2= (40.003304, 116.326759)
result1=haversine(point1, point2, unit=Unit.KILOMETERS)    # kmresult2=haversine(point1, point2, unit=Unit.METERS)        # m# 打印计算结果print("距离:{:.3f}km".format(result1))
print("距离:{:.3f}m".format(result2))


结果如下:



利用 haversine 库计算距离的结果与手写 haversine 计算的结果一致!

目录
相关文章
|
1天前
|
SQL 并行计算 API
Dask是一个用于并行计算的Python库,它提供了类似于Pandas和NumPy的API,但能够在大型数据集上进行并行计算。
Dask是一个用于并行计算的Python库,它提供了类似于Pandas和NumPy的API,但能够在大型数据集上进行并行计算。
19 9
|
19天前
|
开发框架 并行计算 安全
Python的GIL限制了CPython在多核下的并行计算,但通过替代解释器(如Jython, IronPython, PyPy)和多进程、异步IO可规避
【6月更文挑战第26天】Python的GIL限制了CPython在多核下的并行计算,但通过替代解释器(如Jython, IronPython, PyPy)和多进程、异步IO可规避。Numba、Cython等工具编译优化代码,未来社区可能探索更高级的并发解决方案。尽管GIL仍存在,现有策略已能有效提升并发性能。
23 3
|
22天前
|
JSON 数据格式 索引
Python内置函数如`print()`输出信息,`len()`计算长度
【6月更文挑战第23天】Python内置函数如`print()`输出信息,`len()`计算长度,`type()`识别类型,`range()`生成序列,`sum()`求和,`min()`和`max()`找极值,`abs()`取绝对值,`round()`四舍五入,`sorted()`排序,`zip()`和`enumerate()`组合及遍历,`map()`和`filter()`应用函数。标准库如`os`用于操作系统交互,`sys`处理解释器信息,`math`提供数学运算,`re`支持正则表达式,`json`处理JSON数据。学习这些能提升编程效率。
31 5
|
2天前
|
存储 数据可视化 数据处理
`geopandas`是一个开源项目,它为Python提供了地理空间数据处理的能力。它基于`pandas`库,并扩展了其对地理空间数据(如点、线、多边形等)的支持。`GeoDataFrame`是`geopandas`中的核心数据结构,它类似于`pandas`的`DataFrame`,但包含了一个额外的地理列(通常是`geometry`列),用于存储地理空间数据。
`geopandas`是一个开源项目,它为Python提供了地理空间数据处理的能力。它基于`pandas`库,并扩展了其对地理空间数据(如点、线、多边形等)的支持。`GeoDataFrame`是`geopandas`中的核心数据结构,它类似于`pandas`的`DataFrame`,但包含了一个额外的地理列(通常是`geometry`列),用于存储地理空间数据。
4 0
|
2天前
|
存储 算法 安全
我们来看一个简单的Python代码示例,它使用`hashlib`模块中的`md5()`和`sha256()`函数来计算字符串的哈希值。
我们来看一个简单的Python代码示例,它使用`hashlib`模块中的`md5()`和`sha256()`函数来计算字符串的哈希值。
9 0
|
5天前
|
Python
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
155. 最小栈 力扣 python 空间换时间 o(1) 腾讯面试题
|
1月前
|
分布式计算 负载均衡 并行计算
Python 分布式计算框架 PP (Parallel Python):集群模式下的实践探索
该文介绍了使用Parallel Python (PP) 在两台物理机上构建分布式计算集群的经验。PP是一个轻量级框架,旨在简化Python代码在多处理器系统和集群中的并行执行。文中通过设置子节点的IP、端口和密钥启动PP服务器,并在主节点创建PP实例进行负载均衡。实验使用官方的质数和计算示例,显示PP在集群模式下能有效利用多台机器的多核CPU,实现计算效率的显著提升。未来,作者计划进一步研究PP在更复杂任务和大规模集群中的应用潜力。
143 4
|
1月前
|
机器学习/深度学习 算法 Serverless
利用无穷级数逼近计算幂运算与开根号——Python实现
使用泰勒级数逼近法,本文介绍了如何用Python计算特殊幂运算,包括分数次幂和开根号。通过定义辅助函数,如`exp`、`getN_minus_n`、`multi`和`getnum`,实现了计算任意实数次幂的功能。实验结果显示,算法能有效计算不同情况下的幂运算,例如`0.09^2`、`1^2`、`0.25^2`、`0.09^(0.5)`、`1^(0.5)`和`0.25^(0.5)`。虽然精度可能有限,但可通过调整迭代次数平衡精度与计算速度。
|
21天前
|
Python
使用Python计算有效值函数(RMS值)
使用Python计算有效值函数(RMS值)
32 0
|
1月前
|
机器学习/深度学习 存储 计算机视觉
基于YOLOv8深度学习的遥感地理空间物体检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测(2)
基于YOLOv8深度学习的遥感地理空间物体检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测