python 中最近的纬度和经度点
Nearest latitude and longitude points in python
我有列表 1 和列表 2 中的电台列表
我如何从列表 2 中找到距离列表 1 最近的车站?
list 1 and 2
列表 1
SS 无纬度经度
977 23.141747 53.796469
946 23.398398 55.422916
742 23.615732 53.717952
980 23.633077 55.567046
660 23.6504 54.4007
列表 2
SS 无纬度经度
962 23.657571 53.703683
745 23.671971 52.955976
743 23.766849 53.770344
978 23.847163 52.809653
748 23.942166 52.16236
744 23.955817 52.790424
760 23.984592 55.55764
945 24.030256 55.844842
894 24.03511 53.891547
856 24.741601 55.80063
893 24.04123 53.899958
387 24.059988 51.748138
675 24.061578 53.417912
664 24.063978 51.76195
我可以通过在 PowerBI 上映射它们来手动执行此操作,但我正在寻找可扩展的解决方案并且
更喜欢 Python.
这与上一个问题非常相似
Getting distance between two points based on latitude/longitude
所以,它可以被声明为重复的。
无论如何,按照 Kurt Peek 的回答,您可以这样做:
import geopy.distance
def get_distnace(coords_1, coords_2):
return geopy.distance.vincenty(coords_1, coords_2).km
得到returns距离'km'的函数。然后,给定几个像你这样的列表,格式为
list1 = [[stat_name_1, lat_1, lon_1], [stat_name_1, lat_1, lon_1], ... ]
list2 = [[...], ... ]
你可能会这样做:
min_stat = get_distance(list1[0][1:], list2[0][1:])
for stat_1 in list1:
coord_1 = stat_1[1:]
for stat_2 in list2:
coord_2 = stat_2[1:]
min_stat = min(min_stat, get_distance(coord_1, coord_2)
将其作为一个草稿,一个想法,在任何应用之前进行调试和测试。
geopy 是你的朋友。它具有计算坐标对之间距离的功能。这是一种方法:
from geopy import distance
s = {
977: (23.141747, 53.796469),
946: (23.398398, 55.422916),
# etc etc
}
d = {
962: (23.657571, 53.703683),
745: (23.671971, 52.955976),
743: (23.766849, 53.770344),
# etc etc
}
for (ss, a) in s.items():
best = None
dist = None
for (dd, b) in d.items():
km = distance.distance(a, b).km
if dist is None or km < dist:
best = dd
dist = km
print(f'{ss} is nearest {best}: {dist} km')
如果我 运行 使用您的示例数据,我得到:
977 is nearest 962: 57.909274476145846 km
946 is nearest 760: 66.3613771288571 km
742 is nearest 962: 4.857141728990575 km
980 is nearest 760: 38.94400553289674 km
660 is nearest 743: 65.56437761273963 km
如果您需要从每个列表 1 到每个列表 2 的距离,您可以尝试
sorted([[ss, dd, distance.distance(a, b).km] for (ss, a) in s.items()
for (dd, b) in d.items()])
这给出了列表的列表,按列表第 1 项排序:
[[660, 387, 273.98088337893],
[660, 664, 272.6633222300461],
[660, 675, 109.98235440892797],
[660, 743, 65.56437761273963],
# etc
进一步排序或分组留作 reader 的练习。
我有列表 1 和列表 2 中的电台列表 我如何从列表 2 中找到距离列表 1 最近的车站?
list 1 and 2
列表 1
SS 无纬度经度 977 23.141747 53.796469 946 23.398398 55.422916 742 23.615732 53.717952 980 23.633077 55.567046 660 23.6504 54.4007
列表 2
SS 无纬度经度 962 23.657571 53.703683 745 23.671971 52.955976 743 23.766849 53.770344 978 23.847163 52.809653 748 23.942166 52.16236 744 23.955817 52.790424 760 23.984592 55.55764 945 24.030256 55.844842 894 24.03511 53.891547 856 24.741601 55.80063 893 24.04123 53.899958 387 24.059988 51.748138 675 24.061578 53.417912 664 24.063978 51.76195
我可以通过在 PowerBI 上映射它们来手动执行此操作,但我正在寻找可扩展的解决方案并且 更喜欢 Python.
这与上一个问题非常相似
Getting distance between two points based on latitude/longitude
所以,它可以被声明为重复的。
无论如何,按照 Kurt Peek 的回答,您可以这样做:
import geopy.distance
def get_distnace(coords_1, coords_2):
return geopy.distance.vincenty(coords_1, coords_2).km
得到returns距离'km'的函数。然后,给定几个像你这样的列表,格式为
list1 = [[stat_name_1, lat_1, lon_1], [stat_name_1, lat_1, lon_1], ... ]
list2 = [[...], ... ]
你可能会这样做:
min_stat = get_distance(list1[0][1:], list2[0][1:])
for stat_1 in list1:
coord_1 = stat_1[1:]
for stat_2 in list2:
coord_2 = stat_2[1:]
min_stat = min(min_stat, get_distance(coord_1, coord_2)
将其作为一个草稿,一个想法,在任何应用之前进行调试和测试。
geopy 是你的朋友。它具有计算坐标对之间距离的功能。这是一种方法:
from geopy import distance
s = {
977: (23.141747, 53.796469),
946: (23.398398, 55.422916),
# etc etc
}
d = {
962: (23.657571, 53.703683),
745: (23.671971, 52.955976),
743: (23.766849, 53.770344),
# etc etc
}
for (ss, a) in s.items():
best = None
dist = None
for (dd, b) in d.items():
km = distance.distance(a, b).km
if dist is None or km < dist:
best = dd
dist = km
print(f'{ss} is nearest {best}: {dist} km')
如果我 运行 使用您的示例数据,我得到:
977 is nearest 962: 57.909274476145846 km
946 is nearest 760: 66.3613771288571 km
742 is nearest 962: 4.857141728990575 km
980 is nearest 760: 38.94400553289674 km
660 is nearest 743: 65.56437761273963 km
如果您需要从每个列表 1 到每个列表 2 的距离,您可以尝试
sorted([[ss, dd, distance.distance(a, b).km] for (ss, a) in s.items()
for (dd, b) in d.items()])
这给出了列表的列表,按列表第 1 项排序:
[[660, 387, 273.98088337893],
[660, 664, 272.6633222300461],
[660, 675, 109.98235440892797],
[660, 743, 65.56437761273963],
# etc
进一步排序或分组留作 reader 的练习。