Ближайшие точки широты и долготы в python

0

Вопрос

У меня есть список станций в Списке 1 и Списке 2 Как мне найти ближайшие станции к Списку 1 из списка 2 ?

список 1 и 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.

geolocation python
2021-11-16 11:26:01
2

Лучший ответ

0

геопи-твой друг. В нем есть функции, которые вычисляют расстояние между парами координат. Вот один из подходов:

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

Дальнейшее упорядочение или группировка оставлены в качестве упражнения для читателя.

2021-11-17 12:11:25

Спасибо! но как я могу получить несколько станций поблизости ? Если я хочу, чтобы 2 или 3 ближайшие станции из списка 2 попали в список 1?
Raul V

Например : 977 находится ближе всего к 962,: 57.909274476145846 км 760,: 57.909274476145846 км xyz: 57.909274476145846 км a
Raul V

Я отредактировал свой ответ, чтобы дать вам начало.
xpqz

ты-ЧУДОВИЩЕ. Большое спасибо.
Raul V
0

Это очень похоже на предыдущий вопрос
Получение расстояния между двумя точками на основе широты/долготы
таким образом, он может быть заявлен как дубликат.
В любом случае, следуя ответу Курта Пика, вы могли бы сделать:

import geopy.distance

def get_distnace(coords_1, coords_2):
    return geopy.distance.vincenty(coords_1, coords_2).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)

Воспринимайте это как черновик, идею, которую нужно отладить и протестировать перед любым приложением.

2021-11-16 12:03:54

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................