I've noticed that in GeoDjango the distance method behaves differently if it's being used inside an annotation, a query etc.. or if it's used between two points or geometries.
Look at this example:
bss = BusStop.objects.filter(point__distance_gt=(base_point, D(m=1000))).filter(point__distance_lt=(base_point, D(m=1200))).annotate(distance=Distance('point', base_point)).order_by('distance') In : for bs in bss: ...: print(bs.amic_code, bs.distance) ...: 1800SBH0781 1002.00849246 m 1800SB30351 1002.56747241 m 1800SB04941 1003.2266972 m 1800SB30331 1008.46770311 m
The distance is correctly expressed in meters, as I expect.
This is instead what happens if I use the distance method between two points:
In : type(base_point) Out: django.contrib.gis.geos.point.Point In : bss.point.distance(base_point) Out: 0.014417147670674185
I can't really understand how the distance is being expressed. What I get back is just a float. Having the distance in meters would be nice, but even better if I can have a measurement object where I can get all the other formats: https://docs.djangoproject.com/en/1.10/ref/contrib/gis/measure/
Note: I've read this https://docs.djangoproject.com/en/1.10/ref/contrib/gis/geos/#django.contrib.gis.geos.GEOSGeometry.distance where it says "GEOS distance calculations are linear – in other words, GEOS does not perform a spherical calculation even if the SRID specifies a geographic coordinate system.", but it doesn't explain how to do a spherical calculation.
How can I get the distance in meters like in the first use case?
Update: I've tried to use this library https://pypi.python.org/pypi/geopy/1.11.0 and I've nothing against using it, but... if I try to calculate the distance between one of the points and the base_point I get 1.6 Km that is quite unexpected, given that I have a list of points which have a distance > 1000 meters and < 1200 meters. Something is still wrong.