上記の提案された回答のいくつかを使用すると、一貫性のない結果が得られたため、[このリンク] 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をチェックとして使用すると、私の結果は一貫しています。