Jeg har prøvet flere måder at måle afstanden mellem to punkter i min Django-applikation og sammenligne resultaterne med en pålidelig måling. tal er langt fra. For eksempel antager jeg, at den virkelige afstand mellem Dublin og Liverpool er ~ 217 km som rapporteret af Google Maps:

indtast billedbeskrivelse her

Brug af geopy (skal være ekstremt nøjagtig ):

>>> from geopy.distance import distance >>> dublin = (-6.270447, 53.339791) >>> liverpool = (-2.991028, 53.402061) >>> distance(dublin, liverpool).km 362.70989455939394 

Brug af Djangos GEOS API (mindre nøjagtig lineær beregning):

>>> 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: Brug af en bedre projektion til dette område (UTM 30N) giver næsten det samme resultat:

>>> dublin.transform(32630) >>> liverpool.transform(32630) >>> dublin.distance(liverpool)*100 328.32200116442266 

I begge tilfælde er jeg væk med over 100 km! Måling af små afstande (< 1 km) er lige så unøjagtig. Hvad laver jeg forkert her !?

Kommentarer

  • For dit django-eksempel ' t EPSG: 3857 bruger målere i stedet for grader ?
  • Mercator bør aldrig bruges til afstandsmåling, især så langt nord.
  • Jeg prøvede at omdanne punkterne til 32630 (UTM zone 30N) og fik 328,3 km. Næsten ingen forskel i dette tilfælde. Der er ' intet om projektion i geopy docs eller i andre svar, og Vincenty-afstanden jeg får skal være nøjagtig på mm-niveau .
  • dublin.distance(liverpool)*100 < – Det faktum, at du var nødt til at gange med 100 i stedet for 1000 skulle fortælle dig noget mistænkelig foregår her.

Svar

Hvis du vender om koordinaterne, fungerer det ikke (geopy bruger (latitude, longitude) i 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 ( shapely , django ) bruger et kartesisk plan og den euklidiske afstand. Med pyproj (django bruger (længdegrad, breddegrad))

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 

Men som Vince siger, at Mercator-projiceringen aldrig skal bruges til afstandsmåling.

Med EPSG: 32630 (UTM-zone 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 

Og alle resultater (geopy og django) kan sammenlignes med Google-afstanden eller Afstand fra Liverpool til Dublin (218 km)

Kommentarer

  • Forvirringen lon, lat / lat, lon rammer igen! Jeg var sikker på, at jeg havde det lige der.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *