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:

introduceți descrierea imaginii aici

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

  • Pentru exemplul dvs. django, nu ' t EPSG: 3857 folosiți contoare în loc de grade ?
  • Mercator nu ar trebui să fie folosit niciodată pentru măsurarea distanței, mai ales în nord.
  • Am încercat să transform punctele în 32630 (zona UTM 30N) și am obținut 328,3 km. Aproape nici o diferență în acest caz. ' nu este nimic despre proiecție în 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.

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.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *