python中的haversine库如何计算大距离矩阵?
How do I calculate a large distance matrix with the haversine library in python?
我有一个小位置集和一个大位置集,我需要知道这些集中位置之间的地理距离。我的数据集示例(它们具有相同的结构,但一个更大):
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。
haversine 函数希望输入如下所示:
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 函数等。谢谢!
您使用 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,
}
我有一个小位置集和一个大位置集,我需要知道这些集中位置之间的地理距离。我的数据集示例(它们具有相同的结构,但一个更大):
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。 haversine 函数希望输入如下所示:
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 函数等。谢谢!
您使用 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,
}