Используя некоторые из предложенных ответов выше, я получал незаметные результаты, поэтому решил снова проверить уравнение
используя [эту ссылку] http://www.movable -type.co.uk / scripts / latlong.html в качестве ссылки, уравнение
d = acos(sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2)*cos(lon2-lon1) ) * 6371
, где d
- рассчитываемое расстояние,
lat1,lon1
- это координата базовой точки, а lat2,lon2
- это координаты других точек, которые в нашем случае являются точками в базе данных.
Из приведенных выше ответов класс LocationManager
выглядит следующим образом
class LocationManager(models.Manager):
def nearby_locations(self, latitude, longitude, radius, max_results=100, use_miles=True):
if use_miles:
distance_unit = 3959
else:
distance_unit = 6371
from django.db import connection, transaction
from mysite import settings
cursor = connection.cursor()
if settings.DATABASE_ENGINE == 'sqlite3':
connection.connection.create_function('acos', 1, math.acos)
connection.connection.create_function('cos', 1, math.cos)
connection.connection.create_function('radians', 1, math.radians)
connection.connection.create_function('sin', 1, math.sin)
sql = """SELECT id, (acos(sin(radians(%f)) * sin(radians(latitude)) + cos(radians(%f))
* cos(radians(latitude)) * cos(radians(%f-longitude))) * %d)
AS distance FROM skills_coveragearea WHERE distance < %f
ORDER BY distance LIMIT 0 , %d;""" % (latitude, latitude, longitude,distance_unit, radius, max_results)
cursor.execute(sql)
ids = [row[0] for row in cursor.fetchall()]
return self.filter(id__in=ids)
Использование сайта [ссылка] http://www.movable -type.co.uk / scripts / latlong.html в качестве проверки, мои результаты, если они согласуются