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:
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
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à.
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.