Mais próximo da latitude e da longitude pontos em python

0

Pergunta

Eu tenho uma lista de estações na Lista 1 e Lista 2 Como faço para encontrar o mais próximo de estações de Lista 1 Lista 2 ?

lista 1 e 2

Lista 1

SS Nenhuma Latitude Longitude 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

Lista 2

SS Nenhuma Latitude Longitude 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

Eu posso fazer isso manualmente através do mapeamento-los em PowerBI mas eu estou procurando uma solução escalável e Prefere Python.

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

Melhor resposta

0

geopy é seu amigo. Ele tem funções que calculam a distância entre pares de coordenadas. Aqui está uma abordagem:

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

Se eu executá-lo com seus dados de exemplo eu recebo:

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

Se você precisa de distâncias de cada uma das lista de 1 a cada lista 2, você pode tentar

sorted([[ss, dd, distance.distance(a, b).km] for (ss, a) in s.items()
        for (dd, b) in d.items()])

Isso dá uma lista de listas, ordenadas pela lista de 1 item de primeira:

[[660, 387, 273.98088337893], 
 [660, 664, 272.6633222300461], 
 [660, 675, 109.98235440892797], 
 [660, 743, 65.56437761273963],

 # etc

Mais de ordenação ou agrupamento deixado como um exercício para o leitor.

2021-11-17 12:11:25

Obrigado ! mas como posso obter várias estações de perto ? Se eu quero o top 2 ou 3 estações mais próximas na lista 2 lista 1?
Raul V

Por exemplo : 977 está mais próximo 962,: 57.909274476145846 km 760,: 57.909274476145846 km xyz: 57.909274476145846 km
Raul V

Que eu tenha editado a minha resposta para dar a você um início.
xpqz

você é uma BESTA. Muito obrigado.
Raul V
0

Isto é muito semelhante à questão anterior
Chegando distância entre dois pontos com base na latitude/longitude
assim, poderia ser alegado como duplicados.
De qualquer maneira, a seguir Kurt Peek da resposta, você poderia fazer:

import geopy.distance

def get_distnace(coords_1, coords_2):
    return geopy.distance.vincenty(coords_1, coords_2).km

para obter uma função que retorna a distância em 'km'. Em seguida, dado um par de listas como a sua, na forma

list1 = [[stat_name_1, lat_1, lon_1], [stat_name_1, lat_1, lon_1], ... ]

list2 = [[...], ... ]

você provavelmente poderia fazer:

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)

Tomá-lo como um projecto, uma ideia, para ser depurado e testado antes de qualquer aplicação.

2021-11-16 12:03:54

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................