专栏首页Python进阶之路Python 优雅地利用两点经纬度计算地理空间距离

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

一、基本原理

处理地理数据时,经常需要用到两个地理位置间的距离。比如 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      # 地球平均半径大约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安装上即可

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

Python代码如下:

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代码如下:

import haversine

print(tuple(haversine.Unit))   # 查看所有可用的单位
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 计算的结果一致!

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!
本文分享自作者个人站点/博客:https://blog.csdn.net/fyfugoyfa复制
如有侵权,请联系 yunjia_community@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • PHP计算两个经纬度地点之间的距离

    function getdistance($lng1, $lat1, $lng2, $lat2) {

    lin_zone
  • Java通过经纬度计算两地之间的距离 转

    用户2603479
  • 利用JS实现的根据经纬度计算地球上两点之间的距离

    第一种是默认地球是一个光滑的球面,然后计算任意两点间的距离,这个距离叫做大圆距离(The Great Circle Distance)。

    大江小浪
  • java 根据两个位置的经纬度,来计算两地的距离 经纬度处理

    FHAdmin
  • java 经纬度处理、计算两地的距离、获取当前一定距离以内的经纬度值

    FHAdmin
  • Python实现经纬度换算+计算两地距离+地理可视化(代码全分享)

    前几天我发了一篇文章《啊?北京确诊病例曾距离我650米!》,文中提到了如何使用Python获取坐标点的经纬度,计算坐标点间的距离,以及地理可视化等。其实里面的内...

    快学Python
  • iOS开发中使用百度地图计算两点间的距离

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

    用户1451823
  • Python实践 | 亿级经纬度距离计算代码实现

    计算经纬度的代码网上一搜一大把,通常是单点距离的计算,无法实现批量计算,本文将利用pandas实现亿级经纬度距离代码的实现。 最短距离计算建议参考下文,mapi...

    披头
  • Python实践 | 亿级经纬度距离计算工具V2

    计算经纬度的代码网上一搜一大把,通常是单点距离的计算,无法实现批量计算,本文将利用pandas实现亿级经纬度距离代码的实现。 最短距离计算建议参考下文,mapi...

    披头
  • python与地理空间分析(二)矢量数据

    距离测量是地理空间分析中的一个非常重要的功能,在气象数据处理中也会经常用到,例如查找最临近的气象站点、气象站点数据与其他数据匹配等操作。目前,针对不同的地球模型...

    MeteoAI
  • 气象编程 | Python反距离权重(IDW)插值计算及可视化绘制

    前面几篇推文我们分辨介绍了使用Python和R绘制了二维核密度空间插值方法,并使用了Python可视化库plotnine、Basemap以及R的ggplot2完...

    气象学家
  • 啊?北京确诊病例曾距离我650米!

    那么在京的小伙伴,估计都想查询一下这些途经点距离自己有多远?自己的行程卡会不会出现星号?今天我就分享一下自己是如何用数据查询的吧!

    朱小五
  • Python学习——库Geopy用法之经纬度坐标转换、经纬度距离计算

    转换原理:借助第三方API平台,为了方便,Geopy将市面上提供经纬度转换的第三方平台的接口都分别封装在一个类中,借助Geopy模块来调用。

    Sparkle^
  • Redis GeoHash核心原理解析

    小麦同学是个吃货+技术宅,平日里就喜欢拿着手机地图点点按按来查询一些好玩的东西。某一天到北海公园游玩,肚肚饿了,于是乎打开手机地图,搜索北海公园附近的餐馆,并选...

    sowhat1412
  • 数据科学 IPython 笔记本 8.16 地理数据和 Basemap

    数据科学中一种常见的可视化类型是地理数据。Matplotlib 用于此类可视化的主要工具是 Basemap 工具包,它是位于mpl_toolkits命名空间下的...

    ApacheCN_飞龙
  • GeoHash核心原理解析

    http://www.cnblogs.com/LBSer/p/3310455.html

    杉枫
  • Redis 实战篇:通过 Geo 类型实现附近的人邂逅女神

    码老湿,阅读了你的巧用数据类型实现亿级数据统计之后,我学会了如何游刃有余的使用不同的数据类型(String、Hash、List、Set、Sorted Set、H...

    码哥字节
  • Redis 实战篇:通过 Geo 类型实现附近的人邂逅女神

    记忆中,一个下班的夜晚,她从人群中轻盈的移动着,那高挑苗条的身材像漂浮在空间中的一个飘逸的音符。她的眼睛充满清澈的阳光和活力,她的双眸中印着银河系的星光。

    Guide哥
  • GeoHash 经纬度坐标编码与解码算法

    关于GeoHash的了解是我在做爬虫时发现一些网站比如美团、饿了么都会把一些地理位置进行编码,在检索时能够更快的进行地理空间上的检索,找到距离相近的位置。

    张凝可

扫码关注云+社区

领取腾讯云代金券