Jai essayé plusieurs façons de mesurer la distance entre deux points dans mon application Django et de comparer les résultats à une mesure fiable. Mon les chiffres sont très décalés. Par exemple, je suppose que la distance réelle entre Dublin et Liverpool est denviron 217 km, comme indiqué par Google Maps:

entrez la description de limage ici

Utilisation de geopy (doit être extrêmement précis ):

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

Utilisation de lAPI GEOS de Django (calcul linéaire moins précis):

>>> 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: Utilisation dune meilleure projection pour cette zone (UTM 30N) donne presque le même résultat:

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

Dans les deux cas, je « m off de plus de 100 km! Mesure de petites distances (< 1km) est tout aussi inexact. Quest-ce que je fais mal ici !?

Commentaires

  • Pour votre exemple django, ne ' t EPSG: 3857 mètres au lieu de degrés ?
  • Mercator ne doit jamais être utilisé pour la mesure de distance, en particulier dans le grand nord.
  • Jai essayé de transformer les points en 32630 (zone UTM 30N) et jai obtenu 328,3 km. Presque aucune différence dans ce cas. Il ny a ' rien sur la projection dans la documentation geopy ou dans dautres réponses, et la distance de Vincenty que jobtiens doit être précise au niveau mm .
  • dublin.distance(liverpool)*100 < – Le fait que vous ayez dû multiplier par 100 au lieu de 1000 devrait vous dire quelque chose suspicieux se passe ici.

Réponse

Si vous inversez les coordonnées, cela ne fonctionne pas (geopy utilise (latitude, longitude) dans le crs WGS84)

 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 ( galbé , django ) utilise un plan cartésien et la distance euclidienne. Avec pyproj (django utilise (longitude, latitude))

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 

Mais, comme Vince dit, la projection Mercator ne doit jamais être utilisée pour la mesure de distance.

Avec lEPSG: 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 

Et tous les résultats (geopy et django) sont comparables avec la distance Google ou la Distance de Liverpool à Dublin (218 km)

Commentaires

  • La confusion lon, lat / lat, lon frappe à nouveau! Jétais sûr de lavoir juste là.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *