Cel mai apropiat latitudine și longitudine puncte în python

0

Problema

Am o listă de stații din Lista 1 și Lista 2 Cum pot găsi cele mai apropiate stații de la Lista 1 Lista 2 ?

lista 1 și 2

Lista 1

SS Nu Latitudine 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 Nu Latitudine 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

Pot face acest lucru manual, prin mapping-le pe PowerBI dar eu sunt în căutarea pentru o soluție scalabilă și Prefera Python.

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

Cel mai bun răspuns

0

geopy este prietenul tău. Ea are funcții care calculează distanța între perechi de coordonate. Aici e o abordare:

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

Dacă am alerga cu date de exemplu am:

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

Dacă ai nevoie de distanțele de la fiecare din lista 1 la fiecare din lista 2, ai putea încerca

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

Acest lucru vă oferă o listă de liste, ordonate de lista 1 articol în primul rând:

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

 # etc

În continuare ordonare sau grupare a lăsat ca un exercițiu pentru cititor.

2021-11-17 12:11:25

Multumesc!!! dar cum pot obține mai multe stații în apropiere ? Dacă vreau top 2 sau 3 mai apropiate stații în lista 2 lista 1?
Raul V

De exemplu : 977 este cel mai apropiat de 962,: 57.909274476145846 m 760,: 57.909274476145846 km xyz: 57.909274476145846 m o
Raul V

Am editat raspunsul meu să-ți dau un început.
xpqz

ești o FIARĂ. Vă mulțumesc foarte mult.
Raul V
0

Acest lucru este destul de similare la întrebarea anterioară
Obtinerea distanța dintre două puncte în funcție de latitudine/longitudine
deci, ar putea fi susținut ca duplicat.
Oricum, în urma Kurt Privire răspunsul lui, ai putea face:

import geopy.distance

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

pentru a obține o funcție care returnează distanța în "km". Apoi, a dat o pereche de liste ca a ta, în formă

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

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

probabil ai putea face:

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)

Ia-o ca un proiect, o idee, pentru a fi depanate și testate înainte de orice aplicație.

2021-11-16 12:03:54

În alte limbi

Această pagină este în alte limbi

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