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月前
|
Python
【10月更文挑战第10天】「Mac上学Python 19」小学奥数篇5 - 圆和矩形的面积计算
本篇将通过 Python 和 Cangjie 双语解决简单的几何问题:计算圆的面积和矩形的面积。通过这道题,学生将掌握如何使用公式解决几何问题,并学会用编程实现数学公式。
163 60
|
14天前
|
数据可视化 数据挖掘 定位技术
Python和Geopandas进行地理数据可视化
【10月更文挑战第22天】本文介绍了如何使用Python和Geopandas进行地理数据可视化和分析,涵盖从准备工作、加载数据、数据探索与处理、地理数据可视化、空间分析与查询到交互式地理数据可视化等内容。通过丰富的代码示例和案例演示,帮助读者掌握地理数据分析的基本方法,为实际应用提供支持。
57 19
|
11天前
|
机器学习/深度学习 数据处理 Python
SciPy 教程 之 SciPy 空间数据 7
本教程介绍了SciPy的空间数据处理功能,涵盖如何使用`scipy.spatial`模块进行点的位置判断、最近点计算等操作。还详细解释了距离矩阵的概念及其在生物信息学中的应用,以及汉明距离的定义和计算方法。示例代码展示了如何计算两个点之间的汉明距离。
21 1
|
13天前
|
图形学 Python
SciPy 空间数据2
凸包(Convex Hull)是计算几何中的概念,指包含给定点集的所有凸集的交集。可以通过 `ConvexHull()` 方法创建凸包。示例代码展示了如何使用 `scipy` 库和 `matplotlib` 绘制给定点集的凸包。
23 1
|
20天前
|
机器学习/深度学习 算法 编译器
Python程序到计算图一键转化,详解清华开源深度学习编译器MagPy
【10月更文挑战第26天】MagPy是一款由清华大学研发的开源深度学习编译器,可将Python程序一键转化为计算图,简化模型构建和优化过程。它支持多种深度学习框架,具备自动化、灵活性、优化性能好和易于扩展等特点,适用于模型构建、迁移、部署及教学研究。尽管MagPy具有诸多优势,但在算子支持、优化策略等方面仍面临挑战。
52 3
|
1月前
|
Python
【10月更文挑战第15天】「Mac上学Python 26」小学奥数篇12 - 图形变换与坐标计算
本篇将通过 Python 和 Cangjie 双语实现图形变换与坐标计算。这个题目帮助学生理解平面几何中的旋转、平移和对称变换,并学会用编程实现坐标变化。
64 1
|
1月前
|
机器学习/深度学习 移动开发 Python
【10月更文挑战第11天】「Mac上学Python 22」小学奥数篇8 - 排列组合计算
本篇将通过 Python 和 Cangjie 双语讲解如何计算排列与组合。这道题目旨在让学生学会使用排列组合公式解决实际问题,并加深对数学知识和编程逻辑的理解。
63 4
|
1月前
|
数据可视化 Python
【10月更文挑战第12天】「Mac上学Python 23」小学奥数篇9 - 基础概率计算
本篇将通过 Python 和 Cangjie 双语实现基础概率的计算,帮助学生学习如何解决简单的概率问题,并培养逻辑推理和编程思维。
48 1
|
13天前
|
索引 Python
SciPy 空间数据1
SciPy 通过 `scipy.spatial` 模块处理空间数据,如判断点是否在边界内、计算最近点等。三角测量是通过测量角度来确定目标距离的方法。多边形的三角测量可将其分解为多个三角形,用于计算面积。Delaunay 三角剖分是一种常用方法,可以对一系列点进行三角剖分。示例代码展示了如何使用 `Delaunay()` 函数创建三角形并绘制。
23 0
|
1月前
|
Python
使用python计算两个日期之前的相差天数,周数
使用python计算两个日期之前的相差天数,周数
37 0
下一篇
无影云桌面