我正在尝试使用对象与用户提供的位置的距离来注释查询集。以下是我到目前为止的情况:
lat1 = request.POST['lat']
lon1 = request.POST['lon']
locations = Location.objects.annotate(distance_away = posDifference('lat', 'lon', lat1, lon1)).order_by('distance_away')[0]
这是posDifference
函数,它以英里为单位返回两点之间的距离。
def posDifference(lat1, lon1, lat2, lon2):
EARTH_RADIUS_IN_MILES = 3958.761
lat1 = float(lat1)
lon1 = float(lon1)
lat2 = float(lat2)
lon2 = float(lon2)
lat1 = radians(lat1)
lat2 = radians(lat2)
delta_lon = radians(lon1 - lon2)
cos_x = (sin(lat1) * sin(lat2) + cos(lat1) * cos(lat2) * cos(delta_lon)) # Distance formula
distance = acos(cos_x) * EARTH_RADIUS_IN_MILES # Conversion to miles
return distance
我得到的错误是ValueError: could not convert string to float: lat
lat1 = float(lat1)
行posDifference
。我相信字符串'lat'
和'lon'
正在传递给函数而不是位置对象的字段lat
和lon
。
答案 0 :(得分:0)
当然,它们只是传递给了功能。您只需使用该参数调用posDifference
即可。我不确定你为什么期待其他结果...
您应该以不同的方式构建函数,使用F
引用正确的db列,使用Func
引用一些SQL函数(sin
,cos
,{ {1}})。它看起来像这样:
acos
这应该可以正常工作。更多相关信息,您可以向django documentation
学习答案 1 :(得分:0)
您最好使用GeoDjango进行测量。有现成的使用函数来计算距离,比较距离,检查地图上的点是否在某个范围或矩形等内。所有这些都是在数据库级别完成的,只需要一些数据库扩展。