Python 优雅地利用两点经纬度计算地理空间距离 您所在的位置:网站首页 怎么算经纬度距离 Python 优雅地利用两点经纬度计算地理空间距离

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

2024-07-04 23:32| 来源: 网络整理| 查看: 265

一、基本原理

处理地理数据时,经常需要用到两个地理位置间的距离。比如 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实现如下:

代码语言:javascript复制# -*- 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代码如下:

代码语言:javascript复制from math import sin, asin, cos, radians, fabs, sqrt EARTH_RADIUS = 6371 # 地球平均半径大约6371km def 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安装上即可

代码语言:javascript复制pip install geopy -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

Python代码如下:

代码语言:javascript复制from geopy.distance import geodesic distance = geodesic((39.995304, 116.308264), (40.003304, 116.326759)).km print("距离:{:.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代码如下:

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

结果如下:

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有