Am încercat mai multe moduri de a măsura distanța dintre două puncte în aplicația mea Django și de a compara rezultatele cu o măsurare fiabilă. cifrele sunt departe oprite. De exemplu, presupun că distanța reală dintre Dublin și Liverpool este de ~ 217 km, după cum a raportat Google Maps:
Utilizând geopy
(ar trebui să fie extrem de precis ):
>>> from geopy.distance import distance >>> dublin = (-6.270447, 53.339791) >>> liverpool = (-2.991028, 53.402061) >>> distance(dublin, liverpool).km 362.70989455939394
Utilizarea API-ului GEOS al Django (calcul liniar mai puțin precis):
>>> from django.contrib.gis.geos import Point >>> dublin = Point(-6.270447, 53.339791, srid=3857) >>> liverpool = Point(-2.991028, 53.402061, srid=3857) >>> dublin.distance(liverpool)*100 328.00101418228877
EDIT: Utilizarea unei proiecții mai bune pentru această zonă (UTM 30N) produce aproape același rezultat:
>>> dublin.transform(32630) >>> liverpool.transform(32630) >>> dublin.distance(liverpool)*100 328.32200116442266
În ambele cazuri, am „oprit cu peste 100 km! Măsurarea distanțelor mici (< 1km) este la fel de inexact. Ce greșesc aici !?
Comentarii
Răspuns
Dacă inversați coordonatele, acesta nu funcționează (geopoly folosește (latitudine, longitudine) în WGS84 crs)
dublin = (53.33306,-6.24889) liverpool = ( 53.41058,-2.97794) print distance(dublin, liverpool).km 217.863019038 print(vincenty(dublin, liverpool).kilometers) 217.863019038 print(great_circle(dublin, liverpool).kilometers) 217.211596704
GEOS ( bine format , django ) folosește un plan cartezian și distanța euclidiană. Cu pyproj (django utilizează (longitudine, latitudine))
from django.contrib.gis.geos import Point dublin = Point(-6.270447, 53.339791, srid=4326) # in degrees liverpool = Point(-2.991028, 53.402061, srid=4326) # in degrees dublin.distance(liverpool)*100 328.00101418228877 # units ? import pyproj # conversion from WGS84 to epsg:3857 p1 = pyproj.Proj(proj="latlong",datum="WGS84") p2 = pyproj.Proj(init="epsg:3857") a = pyproj.transform(p1,p2,-6.270447, 53.339791) b = pyproj.transform(p1,p2,-2.991028, 53.402061) dublin = Point(a) # in meters liverpool = Point(b) # in meters dublin.distance(liverpool)/1000 # Euclidean 365.2480859440489 #in km
Dar, după cum Vince spune că proiecția Mercator nu ar trebui folosită niciodată pentru măsurarea distanței.
Cu EPSG: 32630 (zona UTM 30N):
p3 = pyproj.Proj(init="epsg:32630") a = pyproj.transform(p1,p3,-6.270447, 53.339791) b = pyproj.transform(p1,p3,-2.991028, 53.402061) dublin = Point(a) liverpool = Point(b) dublin.distance(liverpool)/1000 218.32514783088294 #in km
Și toate rezultatele (geopy și django) sunt comparabile cu distanța Google sau Distanța de la Liverpool la Dublin (218 km)
Comentarii
- Confuzia lon, lat / lat, lon lovește din nou! Am fost sigur că o am chiar acolo.
geopy
documente sau în alte răspunsuri, iar distanța pe care o obțin Vincenty ar trebui să fie exactă la nivelul mm .dublin.distance(liverpool)*100
< – Faptul că trebuia să înmulțiți cu 100 în loc de 1000 ar trebui să vă spună ceva suspect se întâmplă aici.