跳转到主要内容

计算地球上两点之间的距离。

项目描述

Haversine

使用两点的纬度和经度计算地球上两点之间的距离(以各种单位)。

安装

pip install haversine

用法

计算里昂和巴黎之间的距离

from haversine import haversine, Unit

lyon = (45.7597, 4.8422) # (lat, lon)
paris = (48.8567, 2.3508)

haversine(lyon, paris)
>> 392.2172595594006  # in kilometers

haversine(lyon, paris, unit=Unit.MILES)
>> 243.71250609539814  # in miles

# you can also use the string abbreviation for units:
haversine(lyon, paris, unit='mi')
>> 243.71250609539814  # in miles

haversine(lyon, paris, unit=Unit.NAUTICAL_MILES)
>> 211.78037755311516  # in nautical miles

纬度/经度值需要以[-90,90](纬度)和[-180,180](经度)的度数提供。如果值超出其范围,将引发错误。可以通过通过normalize参数进行自动归一化来避免这种情况。

haversine.Unit枚举包含所有支持的单位

import haversine

print(tuple(haversine.Unit))

输出

(<Unit.KILOMETERS: 'km'>, <Unit.METERS: 'm'>, <Unit.MILES: 'mi'>,
 <Unit.NAUTICAL_MILES: 'nmi'>, <Unit.FEET: 'ft'>, <Unit.INCHES: 'in'>,
 <Unit.RADIANS: 'rad'>, <Unit.DEGREES: 'deg'>)

关于弧度和度的说明

弧度和度返回球面上两点的大圆距离

注意

  • 在单位球体上,角距离等于球面上两点的距离(弧度的定义)
  • 当使用"度"时,这个角度只是从弧度转换为度

逆Haversine公式

从给定的向量(距离和方向)和起点计算一个点。当前明确支持正方向(北、东、南、西)和半正方向(东北、东南、西南、西北)的方向。但也允许显式地以弧度表示的角度。

示例:从巴黎找到任意点

from haversine import inverse_haversine, Direction
from math import pi
paris = (48.8567, 2.3508) # (lat, lon)
# Finding 32 km west of Paris
inverse_haversine(paris, 32, Direction.WEST)
# returns tuple (48.85587279023947, 1.9134085092836945)
# Finding 32 km southwest of Paris
inverse_haversine(paris, 32, pi * 1.25)
# returns tuple (48.65279552300661, 2.0427666779658806)
# Finding 50 miles north of Paris
inverse_haversine(paris, 50, Direction.NORTH, unit=Unit.MILES)
# returns tuple (49.58035791599536, 2.3508)
# Finding 10 nautical miles south of Paris
inverse_haversine(paris, 10, Direction.SOUTH, unit=Unit.NAUTICAL_MILES)
# returns tuple (48.690145868497645, 2.3508)

优化两个向量中所有点之间的距离性能

为了在向量上获得性能,您需要安装numpy。为了获得最佳性能,您可以通过添加check=False来关闭坐标检查,并安装可选包numbaicc_rt

然后您可以这样做

from haversine import haversine_vector, Unit

lyon = (45.7597, 4.8422) # (lat, lon)
paris = (48.8567, 2.3508)
new_york = (40.7033962, -74.2351462)

haversine_vector([lyon, lyon], [paris, new_york], Unit.KILOMETERS)

>> array([ 392.21725956, 6163.43638211])

通常使用haversine_vector获取两点之间的距离会慢一些,但比较两个向量之间的距离可以非常快。

组合矩阵

通过将comb参数设置为True,您可以通过设置不同向量坐标的所有组合来生成矩阵。

from haversine import haversine_vector, Unit

lyon = (45.7597, 4.8422) # (lat, lon)
london = (51.509865, -0.118092)
paris = (48.8567, 2.3508)
new_york = (40.7033962, -74.2351462)

haversine_vector([lyon, london], [paris, new_york], Unit.KILOMETERS, comb=True)

>> array([[ 392.21725956,  343.37455271],
 	  [6163.43638211, 5586.48447423]])

上述示例的输出数组返回以下表格

巴黎 纽约
里昂 里昂 <-> 巴黎 里昂 <-> 纽约
伦敦 伦敦 <-> 巴黎 伦敦 <-> 纽约

根据定义,如果您有一个具有n个元素的向量a和一个具有m个元素的向量b。结果矩阵M将是$n \times m$,矩阵中的元素M[i,j]将是向量a的第i个坐标与向量b的第j个坐标之间的距离。

贡献

克隆项目。

安装pipenv

运行pipenv install --dev

使用pipenv run pytest启动测试

项目详情


下载文件

下载适用于您的平台文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

haversine-2.8.1.tar.gz (7.0 kB 查看哈希)

上传时间

构建分布

haversine-2.8.1-py2.py3-none-any.whl (7.7 kB 查看哈希)

上传时间 Python 2 Python 3

由以下支持