Plus proche de la latitude et la longitude des points en python

0

La question

J'ai une liste de stations dans la Liste 1 et Liste 2 Comment puis-je trouver les gares les plus proches de la Liste 1, Liste 2 ?

liste 1 et 2

Liste 1

SS N 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

Liste 2

SS N 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

Je peux le faire manuellement par la cartographie sur PowerBI mais je suis à la recherche d'une solution évolutive et Préférez Python.

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

La meilleure réponse

0

geopy est votre ami. Il dispose de fonctions permettant de calculer la distance entre les paires de coordonnées. Voici une approche:

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 je le lance avec vos données d'exemple j'obtiens:

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 vous avez besoin de la distance de chacun sur la liste 1 de chaque de la liste 2, vous pouvez essayer

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

Cela donne une liste de listes, classées par ordre de la liste 1 de l'article premier:

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

 # etc

Plus de la commande ou de regroupement de la gauche comme un exercice pour le lecteur.

2021-11-17 12:11:25

Merci ! mais comment puis-je obtenir plusieurs stations à proximité ? Si je veux le top 2 ou 3 gares les plus proches dans la liste 2 liste 1?
Raul V

Par exemple : 977 est le plus proche de 962,: 57.909274476145846 km de 760: 57.909274476145846 km xyz: 57.909274476145846 km
Raul V

J'ai édité ma réponse à vous donner un point de départ.
xpqz

vous êtes une BÊTE. Je vous remercie beaucoup.
Raul V
0

C'est tout à fait similaire à la précédente question
L'obtention de la distance entre deux points en fonction de la latitude/longitude
donc, on pourrait faire valoir que les doublons.
De toute façon, à la suite de Kurt Peek réponse, vous pourriez faire:

import geopy.distance

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

pour obtenir une fonction qui renvoie la distance dans 'km'. Alors, étant donné un couple de listes comme le vôtre, dans la forme

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

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

vous pourriez probablement faire:

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)

Le prendre comme un projet, une idée, d'être réglé et testé avant toute application.

2021-11-16 12:03:54

Dans d'autres langues

Cette page est dans d'autres langues

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