Ik heb verschillende manieren geprobeerd om de afstand tussen twee punten in mijn Django-applicatie te meten en de resultaten te vergelijken met een betrouwbare meting. Mijn nummers zijn ver verwijderd. Ik ga er bijvoorbeeld van uit dat de werkelijke afstand tussen Dublin en Liverpool ~ 217 km is, zoals gerapporteerd door Google Maps:
Gebruik geopy
(moet extreem nauwkeurig ):
>>> from geopy.distance import distance >>> dublin = (-6.270447, 53.339791) >>> liverpool = (-2.991028, 53.402061) >>> distance(dublin, liverpool).km 362.70989455939394
Met Django “s GEOS API (minder nauwkeurige lineaire berekening):
>>> 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: Een betere projectie gebruiken voor dit gebied (UTM 30N) levert bijna hetzelfde resultaat op:
>>> dublin.transform(32630) >>> liverpool.transform(32630) >>> dublin.distance(liverpool)*100 328.32200116442266
In beide gevallen ben ik weg met meer dan 100 km! Kleine afstanden meten (< 1km) is net zo onnauwkeurig. Wat doe ik hier verkeerd !?
Reacties
Antwoord
Als je de coördinaten omkeert, werkt het niet (geopy gebruikt (breedtegraad, lengtegraad) in de 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 ( welgevormd , django ) gebruikt een Cartesiaans vlak en de Euclidische afstand. Met pyproj (django gebruikt (lengtegraad, breedtegraad))
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
Maar, als Vince zegt dat de Mercator-projectie nooit gebruikt mag worden voor afstandsmeting.
Met de 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
En alle resultaten (geopy en django) zijn vergelijkbaar met de Google-afstand of de Afstand van Liverpool naar Dublin (218 km)
Reacties
- De lon, lat / lat, lon verwarring slaat weer toe! Ik wist zeker dat ik het daar had.
geopy
documenten of in andere antwoorden, en de Vincenty-afstand die ik krijg, moet nauwkeurig zijn op mm-niveau .dublin.distance(liverpool)*100
< – Het feit dat je moest vermenigvuldigen met 100 in plaats van 1000 zou je iets moeten vertellen verdacht is hier aan de hand.