Más cercano de latitud y longitud de los puntos en python

0

Pregunta

Tengo una lista de estaciones de la Lista 1 y Lista 2 ¿Cómo puedo encontrar las estaciones más cercanas a la Lista 1 de la Lista 2 ?

lista 1 y 2

Lista 1

SS Ninguna Latitud Longtitude 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 Ninguna Latitud Longtitude 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

Puedo hacer esto de forma manual mediante la asignación de ellos en PowerBI pero estoy en busca de una solución escalable y Prefiero Python.

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

Mejor respuesta

0

geopy es tu amigo. Dispone de funciones que calcular la distancia entre pares de coordenadas. Este es un enfoque:

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

Si me quedo con tu ejemplo de los datos que obtengo:

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

Si usted necesita las distancias de cada uno de la lista 1 para cada uno de la lista 2, usted podría tratar de

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

Esto le da una lista de listas, ordenadas por la lista 1 del artículo primero:

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

 # etc

Además de ordenar o agrupar a la izquierda como una prueba para el lector.

2021-11-17 12:11:25

Gracias ! pero, ¿cómo puedo obtener múltiples estaciones de cerca ? Si quiero que el top 2 o 3 estaciones más cercanas en la lista 2 lista 1?
Raul V

Por ejemplo : 977 es el más cercano a 962,: 57.909274476145846 km 760,: 57.909274476145846 km xyz: 57.909274476145846 km
Raul V

He editado mi respuesta te ayudarán a empezar.
xpqz

eres una BESTIA. Muchas gracias.
Raul V
0

Esto es bastante similar a la pregunta anterior
Obtener la distancia entre dos puntos en función de la latitud/longitud
así, podría ser reclamado como duplicados.
De todos modos, después de Kurt Peek de la respuesta, se podría hacer:

import geopy.distance

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

para obtener una función que devuelve la distancia en "km". Entonces, dado un par de listas como la suya, en la forma

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

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

usted probablemente podría hacer:

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)

Tomarlo como un proyecto, una idea, para ser depurado y probado antes de cualquier aplicación.

2021-11-16 12:03:54

En otros idiomas

Esta página está en otros idiomas

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