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:

voer de beschrijving van de afbeelding hier in

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

  • Voor je django-voorbeeld doet geen ' t EPSG: 3857 gebruik meters in plaats van graden ?
  • Mercator mag nooit worden gebruikt voor afstandsmeting, vooral niet in het uiterste noorden.
  • Ik probeerde de punten te transformeren naar 32630 (UTM zone 30N) en kreeg 328,3 km. Bijna geen verschil in dit geval. Er ' s niets over projectie in de 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.

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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *