Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python 优雅地利用两点经纬度计算地理空间距离

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

作者头像
叶庭云
发布于 2021-12-07 05:49:53
发布于 2021-12-07 05:49:53
12.8K01
代码可运行
举报
文章被收录于专栏:Python进阶之路Python进阶之路
运行总次数:1
代码可运行

一、基本原理

处理地理数据时,经常需要用到两个地理位置间的距离。比如 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
代码运行次数:0
运行
AI代码解释
复制
# -*- 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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
pip install geopy -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

Python代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
import haversine

print(tuple(haversine.Unit))   # 查看所有可用的单位
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 计算的结果一致!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/10/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python学习——库Geopy用法之经纬度坐标转换、经纬度距离计算
转换原理:借助第三方API平台,为了方便,Geopy将市面上提供经纬度转换的第三方平台的接口都分别封装在一个类中,借助Geopy模块来调用。
Sparkle^
2022/03/01
5.7K0
基于GPS与经纬度距离计算
基于GPS与经纬度距离计算 # -*- coding:utf-8 -*- # /usr/bin/python import warnings warnings.filterwarnings("ignore") from math import radians, cos, sin, asin, sqrt # 方法1 def geodistance(lat1,lng1,lat2,lng2): ''''数学转换''' lng1, lat1, lng2, lat2 = map(radians,
AI拉呱
2021/04/23
1K0
Python实现经纬度换算+计算两地距离+地理可视化(代码全分享)
大家好,我是小五🧐 前几天我发了一篇文章《啊?北京确诊病例曾距离我650米!》,文中提到了如何使用Python获取坐标点的经纬度,计算坐标点间的距离,以及地理可视化等。其实里面的内容主要摘自本文,所以今天干脆把原文发出来👇 ---- 故事的起因:小五的驾驶证在今年有效期满了,需要提交体检信息才可以进行换证。那么哪些医院是支持驾驶员体检的呢? 打开北京市公安局公安交通管理局,可以查到对应的体检医院。网址:http://jtgl.beijing.gov.cn/jgj/qtym/1734494/index.h
快学Python
2022/03/23
3.3K0
Python实现经纬度换算+计算两地距离+地理可视化(代码全分享)
地址转换为经纬度,经纬度距离计算
根据已知地址,将地址经纬度计算出来,不多说直接上代码 import org.apache.commons.lang.StringUtils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util
一觉睡到小时候
2019/07/02
2.4K0
Python实践 | 亿级经纬度距离计算代码实现
计算经纬度的代码网上一搜一大把,通常是单点距离的计算,无法实现批量计算,本文将利用pandas实现亿级经纬度距离代码的实现。 最短距离计算建议参考下文,mapinfo能够很好的实现。 MAPINFO 最小站间距统计
披头
2019/12/26
4.4K0
《SQL 中计算地理坐标两点间距离的魔法》
在当今数字化的世界中,地理数据的处理和分析变得越来越重要。当我们面对一个包含地理坐标数据的表时,经常会遇到需要计算两点之间距离的需求。无论是在物流配送路线规划、地理信息系统应用,还是在基于位置的服务开发中,准确计算两点间的距离都是至关重要的。那么,如何使用 SQL 来实现这一复杂的任务呢?
程序员阿伟
2024/12/09
3300
如何计算经纬度之间的距离_根据经纬度算距离
function getdistance(lng1,lat1,lng2,lat2){
全栈程序员站长
2022/09/28
4.8K0
原 PHP下的经纬度求距离
/** *  @desc 根据两点间的经纬度计算距离 *  @param float $lat 纬度值 *  @param float $lng 经度值 */  function getDistance($lat1, $lng1, $lat2, $lng2)  {      $earthRadius = 6367000; //approximate radius of earth in meters        /*        Convert these degrees to radians     
霡霂
2018/06/04
9190
java 根据两个位置的经纬度,来计算两地的距离 经纬度处理
package com.fh.util; import java.util.HashMap; import java.util.Map; /** * 说明:经纬度处理 * 作者:FH Admin * from:fhadmin.cn */ public class MapDistance { private static double EARTH_RADIUS = 6378.137; private static double rad(double d) {
FHAdmin
2021/09/26
9770
PHP经纬度距离计算「建议收藏」
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
8610
PHP 通过经纬度计算距离
封装的方法: 传递参数: 地址1的纬度:lat1  ,经度:lng1, 地址2的纬度   lat2  ,经度:lng2, /** * 计算两个经纬度距离 */ public function get_distance($lat1, $lng1, $lat2, $lng2){ $earthRadius = 6367000; //approximate radius of earth in meters $lat1 = ($lat1 * pi
超级小可爱
2023/02/20
1.4K0
php mysql 经纬度_mysql,php和js根据经纬度计算距离
a=Lat1 – Lat2 为两点纬度之差 b=Lung1 -Lung2 为两点经度之差;
全栈程序员站长
2022/11/09
5.9K0
php mysql 经纬度_mysql,php和js根据经纬度计算距离
计算经纬度的距离_经纬度测距
public function GetDistance(lat1, lng1, lat2, lng2)
全栈程序员站长
2022/09/29
3.6K0
计算经纬度的距离_经纬度测距
经纬度距离公式_经纬度差的计算
上述适合百公里以内,几百公里的时候两者误差量级为几米,在计算1000公里级别是误差能到达几十米。 要真正精准计算,必须考虑地球椭球体。建议采用椭球体算法,比较著名的算法有Vincenty方案算法,参考:Vincenty solutions of geodesics on the ellipsoid
全栈程序员站长
2022/11/09
1.9K0
经纬度距离公式_经纬度差的计算
php根据经纬度计算距离和方向
不过现在有了更多的可选项了,例如geohash,存储geo的服务,mogodb,等等
jerryteng
2018/09/14
2.2K0
php根据经纬度计算距离和方向
经纬度转换-----度分秒以及经纬度和米
经纬度互换 度(DDD):E 108.90593度    N 34.21630度     如何将度(DDD):: 108.90593度换算成度分秒(DMS)东经E 108度54分22.2秒?转换方法是
水击三千
2018/02/27
12.1K0
经纬度转换-----度分秒以及经纬度和米
PHP之根据经纬度和半径计算范围和距离
根据经纬度和半径计算经纬度范围: /** * 根据经纬度和半径计算出范围 * @param string $lat 纬度 * @param String $lng 经度 * @param float $radius 半径 单位:m * @return Array 范围数组 */ if (!function_exists('calc_scope')){ function calc_scope($lat, $lng, $radius) { $degree = (2490
Petrochor
2022/06/07
9531
已知两点的经度和纬度,计算两点间的距离(php,javascript)
php代码:转载  http://www.cnblogs.com/caichenghui/p/5977431.html
lin_zone
2018/08/15
9690
PHP计算两个经纬度地点之间的距离
function getdistance($lng1, $lat1, $lng2, $lat2) {
lin_zone
2018/08/15
1.4K0
【GIS - 地理信息系统】经纬度计算 ( 经度、纬度概念 | 地球周长计算 | 地球经线周长计算 | 经纬度相关计算 | 经纬度坐标距离计算公式 | 经纬度与实际距离换算 | 相关代码实现 )
经度 Longitude , 本初子午线 位置 为 0 度经线 , 相当于水平 x 轴 的坐标 , 经度的取值范围 -180 度 ~ +180 度 ;
韩曙亮
2023/10/11
7.5K0
【GIS - 地理信息系统】经纬度计算 ( 经度、纬度概念 | 地球周长计算 | 地球经线周长计算 | 经纬度相关计算 | 经纬度坐标距离计算公式 | 经纬度与实际距离换算 | 相关代码实现 )
推荐阅读
相关推荐
Python学习——库Geopy用法之经纬度坐标转换、经纬度距离计算
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验