python根据经纬度计算距离示例

yizhihongxing

下面是针对“Python根据经纬度计算距离”的完整攻略。

1. 确定坐标系

在进行经纬度计算时,首先需要确定所使用的坐标系。通常使用的是WGS-84坐标系,它是GPS使用的坐标系,也是Google Maps和其他在线地图平台的标准坐标系。

2. 计算距离

计算距离的方法有很多种,以下是其中比较常用的两种方法。

方法一:Haversine公式

Haversine公式是根据经纬度计算两点间最短距离的常见算法之一,它的基本思路是将地球看成一颗球体,根据两个点的经纬度计算出它们在球面上对应点的夹角,然后将夹角转换成弧长即距离。下面是使用Haversine公式计算距离的示例代码:

from math import radians, sin, cos, sqrt, atan2

def haversine(lat1, lon1, lat2, lon2):
    R = 6371  # 地球平均半径,单位为公里
    lat1, lon1, lat2, lon2 = map(radians, [lat1, lon1, lat2, lon2])
    dlon = lon2 - lon1
    dlat = lat2 - lat1
    a = sin(dlat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dlon / 2) ** 2
    c = 2 * atan2(sqrt(a), sqrt(1 - a))
    distance = R * c
    return distance

该函数接受四个参数,分别为两个点的经度和纬度,返回值为两点之间的距离,单位为千米。

方法二:Vincenty公式

Vincenty公式是Haversine公式的改进版,它同样也是根据经纬度计算两点之间距离的方法,但是它考虑了地球不是完全的球形,而是一个椭球体的事实。下面是使用Vincenty公式计算距离的示例代码:

from math import sin, cos, atan2, sqrt, pi

def vincenty(lat1, lon1, lat2, lon2):
    a = 6378137  # 赤道半径,单位为米
    b = 6356752.314245  # 极半径,单位为米
    f = 1 / 298.257223563  # 扁率
    L = radians(lon2 - lon1)
    U1 = atan2((1 - f) * sin(radians(lat1)), cos(radians(lat1)))
    U2 = atan2((1 - f) * sin(radians(lat2)), cos(radians(lat2)))
    sinU1, cosU1 = sin(U1), cos(U1)
    sinU2, cosU2 = sin(U2), cos(U2)
    lam = L
    i = 0
    while True:
        sinLam, cosLam = sin(lam), cos(lam)
        sinSigma = sqrt((cosU2 * sinLam) ** 2 + (cosU1 * sinU2 - sinU1 * cosU2 * cosLam) ** 2)
        if sinSigma == 0:
            return 0  # 两点重合
        cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLam
        sigma = atan2(sinSigma, cosSigma)
        sinAlpha = cosU1 * cosU2 * sinLam / sinSigma
        cosSqAlpha = 1 - sinAlpha ** 2
        if cosSqAlpha == 0:
            cos2SigmaM = 0  # 两点在赤道上
        else:
            cos2SigmaM = cosSigma - 2 * sinU1 * sinU2 / cosSqAlpha
        C = f / 16 * cosSqAlpha * (4 + f * (4 - 3 * cosSqAlpha))
        newLam = L + (1 - C) * f * sinAlpha * (sigma + C * sinSigma * (cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM ** 2)))
        if abs(newLam - lam) < 1e-12:
            break
        lam = newLam
        i += 1
        if i == 1000:
            return None  # 失败,迭代次数太多
    uSq = cosSqAlpha * (a ** 2 - b ** 2) / b ** 2
    A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq)))
    B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq)))
    deltaSigma = B * sinSigma * (cos2SigmaM + 1 / 4 * B * (cosSigma * (-1 + 2 * cos2SigmaM ** 2) - 1 / 6 * B * cos2SigmaM * (-3 + 4 * sinSigma ** 2) * (-3 + 4 * cos2SigmaM ** 2)))
    s = b * A * (sigma - deltaSigma)
    return s / 1000  # 返回值单位为千米

与Haversine相比,Vincenty需要进行更多的计算,但精度更高。

3. 示例

下面是两个示例,一个使用Haversine公式计算距离,一个使用Vincenty公式计算距离。

示例一:Haversine公式

lat1 = 31.281334
lon1 = 121.500464
lat2 = 31.230416
lon2 = 121.473701

distance = haversine(lat1, lon1, lat2, lon2)
print(f"两地之间的距离为{distance:.2f}千米")

以上代码使用Haversine公式,计算了上海市区浦东机场与虹桥机场之间的距离,输出结果为:

两地之间的距离为33.70千米

示例二:Vincenty公式

lat1 = 31.281334
lon1 = 121.500464
lat2 = 31.230416
lon2 = 121.473701

distance = vincenty(lat1, lon1, lat2, lon2)
print(f"两地之间的距离为{distance:.2f}千米")

以上代码使用Vincenty公式,计算了上海市区浦东机场与虹桥机场之间的距离,输出结果为:

两地之间的距离为32.61千米

以上就是根据经纬度计算距离的Python攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python根据经纬度计算距离示例 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 基于Python编写一个自动关机程序

    基于Python编写一个自动关机程序的攻略如下: 1. 确定操作系统版本 在编写自动关机程序之前,需要先确定操作系统的版本。因为不同版本的操作系统在关机命令的实现方式可能略有不同。比如,在Windows系统中,可以使用shutdown命令实现自动关机,而在Linux系统中,可以使用init命令或shutdown命令实现自动关机。因此,需要根据操作系统版本选择…

    python 2023年5月19日
    00
  • 使用pycallgraph分析python代码函数调用流程以及框架解析

    使用pycallgraph分析Python代码函数调用流程以及框架解析 pycallgraph是一个Python库,用于生成函数调用图。它可以帮助我们分析Python代码的函数调用流程,以及了解代码中各个函数之间的关系。本文将详细讲解如何使用pycallgraph分析Python代码函数调用流程以及框架解析,并提供两个示例。 安装pycallgraph 在使…

    python 2023年5月15日
    00
  • python 实现在Excel末尾增加新行

    下面是详细讲解“python实现在Excel末尾增加新行”的完整实例教程: 1. 准备工作 在开始编写代码之前,我们需要先安装一些必要的Python库:- pandas:用于读取和修改Excel文件- openpyxl:用于创建和保存Excel文件 我们可以通过在终端中输入以下命令来安装这两个库: pip install pandas openpyxl 2.…

    python 2023年5月13日
    00
  • Python计算不规则图形面积算法实现解析

    Python计算不规则图形面积算法实现解析 计算不规则图形面积是一个常见的问题,可以使用多种算法来解决。在本文中,我们将介绍如何使用Python实现计算不规则图形面积的算法。 算法实现 方法一:三角剖分法 三角剖分是一种常见的计算不规则图形面积的方法。它将不规则图形分解为多个三角形,并计算每个三角形的面积,最后将所有三角形的面积相加得到不规则图形的面积。以下…

    python 2023年5月14日
    00
  • python apscheduler cron定时任务触发接口自动化巡检过程

    以下是详细的“Python APScheduler Cron定时任务触发接口自动化巡检过程”的攻略。 概述 在项目开发中,我们需要经常进行接口巡检,确保API的稳定运行。而随着业务量的逐渐增加,这项工作变得越来越繁琐。通过使用Python的APScheduler结合Cron表达式,我们可以实现接口自动化巡检,节约了大量的时间和精力。 步骤 下面是实现Pyth…

    python 2023年5月18日
    00
  • Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)

    Python3的urllib.parse常用函数小结 urllib.parse模块是Python的一个重要的URL解析器,其中包含了许多常用的函数,例如urlencode、quote、unquote、quote_plus、unquote_plus等。这些函数能够帮助我们解析URL,加密URL内容,或者将URL转换为可读的内容。 urlencode urlen…

    python 2023年6月3日
    00
  • 最基础的Python的socket编程入门教程

    最基础的Python的socket编程入门教程 本文将介绍Python的socket编程,包括socket的基本概念、socket的创建、socket的连接、socket的发送和接收等内容,并供两个示例说明socket的使用。 socket的基本概念 socket是一种通信机制,它允许不同的进程在上进行通信。socket通常使用IP地址和端口号来标识网络上的…

    python 2023年5月14日
    00
  • pygame外星人入侵小游戏超详细开发流程

    Pygame外星人入侵小游戏超详细开发流程 介绍 本文将提供超详细的 Pygame 外星人入侵小游戏开发流程,为想要学习 Pygame 或者开发小游戏的开发者提供帮助。 准备 在开始之前,您需要安装 Pygame,可以通过 pip 进行安装: pip install pygame 创建窗口 首先,我们需要创建游戏窗口。需要导入 Pygame 和 sys 模块…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部