python - 如何使用python中的haversine库计算大距离矩阵?

Posted

技术标签:

【中文标题】python - 如何使用python中的haversine库计算大距离矩阵?【英文标题】:How do I calculate a large distance matrix with the haversine library in python? 【发布时间】:2021-11-01 11:57:02 【问题描述】:

我有一小组和一大组地点,我需要知道这些地点之间的地理距离。我的数据集的一个示例(它们具有相同的结构,但一个更大):

     location        lat      long
0      Gieten  53.003312  6.763908
1    Godlinze  53.372605  6.814674
2  Grijpskerk  53.263894  6.306134
3   Groningen  53.219065  6.568008

为了计算距离,我使用haversine library。 hasrsine 函数希望输入看起来像这样:

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]])

如何在不单独添加所有位置的情况下使用我的两个数据集计算距离矩阵的函数?我尝试过使用字典,并尝试遍历两个数据集中的位置,但我似乎无法弄清楚。我对 python 很陌生,所以如果有人有一个易于理解但不是很优雅的解决方案,我会更喜欢 lambda 函数等。谢谢!

【问题讨论】:

您的数据集是使用 Pandas 还是 Numpy 或类似的东西(也许是 DataFrame?) 【参考方案1】:

使用haversine.haversine_vector,您在正确的轨道上。

由于我不确定您是如何获得数据集的,因此这是一个使用 CSV 数据集的自包含示例,但只要您以某种方式获得城市列表和坐标,您应该能够解决。

请注意,这不会计算同一数组中的城市之间的距离(例如,不是赫尔辛基 图尔库)——如果您也想要这样,您可以将两个数据集合并为一个并将其传递给 haversine_vector 两次。

import csv

import haversine


def read_csv_data(csv_data):
    cities = []
    locations = []
    for (city, lat, lng) in csv.reader(csv_data.strip().splitlines(), delimiter=";"):
        cities.append(city)
        locations.append((float(lat), float(lng)))
    return cities, locations


cities1, locations1 = read_csv_data(
    """
Gieten;53.003312;6.763908
Godlinze;53.372605;6.814674
Grijpskerk;53.263894;6.306134
Groningen;53.219065;6.568008
"""
)

cities2, locations2 = read_csv_data(
    """
Turku;60.45;22.266667
Helsinki;60.170833;24.9375
"""
)
distance_matrix = haversine.haversine_vector(locations1, locations2, comb=True)
distances = 

for y, city2 in enumerate(cities2):
    for x, city1 in enumerate(cities1):
        distances[city1, city2] = distance_matrix[y, x]

print(distances)

这会打印出来,例如


    ("Gieten", "Turku"): 1251.501257597515,
    ("Godlinze", "Turku"): 1219.2012174066822,
    ("Grijpskerk", "Turku"): 1251.3232414412073,
    ("Groningen", "Turku"): 1242.8700308545722,
    ("Gieten", "Helsinki"): 1361.4575055586013,
    ("Godlinze", "Helsinki"): 1331.2811273683897,
    ("Grijpskerk", "Helsinki"): 1364.5464743878606,
    ("Groningen", "Helsinki"): 1354.8847270142198,

【讨论】:

谢谢,这就像一个魅力!我将 distance_matrix 写入 xlsx,这正是我需要的!

以上是关于python - 如何使用python中的haversine库计算大距离矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

pytest报错 make sure your test modules/packages have valid Python names.

Python_报错:TypeError: file must have 'read' and 'readline' attributes

Python selenium WebDriverException: Message: ‘chromedriver‘ executable may have wrong permissions

据廖雪峰python3教程----python学习第三天

python https://www.quora.com/Does-Python-have-good-support-for-socket-programming/answer/Deepanshu-M

Python | pynlpir库 | pynlpir.LicenseError:Your license appears to have expired. Try running “pynlpir“