Ich habe in meiner Django-Anwendung verschiedene Methoden zum Messen der Entfernung zwischen zwei Punkten und zum Vergleichen der Ergebnisse mit einer zuverlässigen Messung ausprobiert Die Zahlen sind weit entfernt. Ich gehe beispielsweise davon aus, dass die tatsächliche Entfernung zwischen Dublin und Liverpool ~ 217 km beträgt, wie von Google Maps angegeben:

Geben Sie hier die Bildbeschreibung ein.

Verwenden Sie geopy (sollte äußerst genau ):

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

Verwenden der GEOS-API von Django (weniger genaue lineare Berechnung):

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

BEARBEITEN: Verwenden einer besseren Projektion für Dieser Bereich (UTM 30N) liefert fast das gleiche Ergebnis:

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

In beiden Fällen bin ich ausgeschaltet um über 100 km! Messen kleiner Entfernungen (< 1 km) ist genauso ungenau. Was mache ich hier falsch?

Kommentare

  • Für Ihr Django-Beispiel ist nicht ' t EPSG: 3857 Meter anstelle von Grad verwenden ?
  • Mercator sollte niemals zur Entfernungsmessung verwendet werden, insbesondere nicht so weit im Norden.
  • Ich habe versucht, die Punkte in 32630 (UTM-Zone 30N) umzuwandeln und habe 328,3 km erhalten. Fast kein Unterschied in diesem Fall. In den geopy -Dokumenten oder in anderen Antworten gibt es ' nichts über Projektion, und der Vincenty-Abstand, den ich erhalte, sollte auf mm-Ebene genau sein .
  • dublin.distance(liverpool)*100 < – Die Tatsache, dass Sie mit 100 statt 1000 multiplizieren mussten, sollte Ihnen etwas sagen Verdächtig ist hier.

Antwort

Wenn Sie die Koordinaten umkehren, funktioniert dies nicht (Geopy verwendet (Breite, Länge) in den 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 ( formschön , django ) verwendet eine kartesische Ebene und den euklidischen Abstand. Mit pyproj (django verwendet (Längen- und Breitengrad))

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 

Aber als Vince Die Mercator-Projektion sollte niemals zur Entfernungsmessung verwendet werden.

Mit dem 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 

Und alle Ergebnisse (Geopy und Django) sind vergleichbar mit der Google-Entfernung oder der Entfernung von Liverpool nach Dublin (218 km)

Kommentare

  • Die Verwirrung von lon, lat / lat, lon schlägt wieder zu! Ich war mir sicher, dass ich es genau dort hatte.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.