Többféle módszert kipróbáltam a Django alkalmazásom két pontja közötti távolság mérésére, és az eredmények összehasonlítását egy megbízható méréssel. A számok útból vannak. Például feltételezem, hogy a Dublin és Liverpool közötti valós távolság ~ 217 km, amint azt a Google Maps jelentette:

ide írja be a kép leírását

A geopy használatával (legyen rendkívül pontos ):

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

A Django GEOS API-jának használata (kevésbé pontos lineáris számítás):

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

SZERKESZTÉS: Jobb vetítés használata a ez a terület (UTM 30N) majdnem ugyanazt az eredményt adja:

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

Mindkét esetben “leállok” több mint 100 km-rel! Kis távolságok mérése (< 1km) ugyanolyan pontatlan. Mit csinálok itt rosszul !?

Megjegyzések

  • A django példájához: nem ' t EPSG: 3857 métereket használ fokok helyett ?
  • A Mercator-ot soha nem szabad használni távolságméréshez, különösen északra.
  • Megpróbáltam átalakítani a pontokat 32630-ra (UTM 30N zóna), és 328,3 km-t kaptam. Ebben az esetben szinte nincs különbség. ' nincs semmi a vetítésről a geopy dokumentumokban vagy más válaszokban, és a kapott Vincenty-távolságnak pontosnak kell lennie az mm-es szinten .
  • dublin.distance(liverpool)*100 < – Az a tény, hogy 1000 helyett 100-zal kellett szoroznod, mondanivalót ad neked gyanús itt folyik.

Válasz

Ha megfordítja a koordinátákat, az nem működik (a geopy használja (szélesség, hosszúság) a WGS84 crs-ben)

 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 ( formás , django ) derékszögű síkot és az euklideszi távolságot használ. pyproj -vel (a django használja (hosszúság, szélesség))

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 

De, mint Vince szerint a Mercator vetületét soha nem szabad távolságmérésre használni.

Az EPSG-vel: 32630 (UTM zóna 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 

És az összes eredmény (geopy és django) összehasonlítható a Google távolságával vagy a Liverpool és Dublin távolságával (218 km)

Megjegyzések

  • A lon, lat / lat, lon zavartság ismét támad! Biztos voltam benne, hogy pontosan ott van.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük