# GeoDjango: how to calculate distance between two Point()?

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 [20]: 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 [23]: type(base_point)
Out[23]: django.contrib.gis.geos.point.Point

In [24]: bss[0].point.distance(base_point)
Out[24]: 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.