objects = Position.objects.exclude(latitude__isnull = True).exclude(longitude__isnull = True).exclude(startup__isnull = True).extra(where=["3956 * 2 * ASIN(SQRT(POWER(SIN((%(latitude)s - abs(latitude)) * pi()/180 / 2), 2) + COS(%(latitude)s * pi()/180 ) * COS(abs(latitude) * pi()/180) * POWER(SIN((%(longitude)s - longitude) * pi()/180 / 2), 2) )) < 50" % {'latitude': latitude, 'longitude': longitude}],)
objects = objects.order_by('startup').distinct('startup')
我使用上面的代码查找附近的对象。但是,即使对象具有与数据库中的对象相同的纬度/经度,数据库中的该对象也不会显示。
例如,假设位置对象1具有以下坐标:
Latitude: -23.5551522346
Longitude: -46.6540710256
用户1具有以下坐标:
Latitude: -23.5551522346
Longitude: -46.6540710256
位置对象1不会显示为用户1作为附近的对象。
我该怎么办?
答案 0 :(得分:1)
如果您不想使用GeoDjango,请查看我在我的项目中使用的代码片段(MySQL,Haversine)
def nearby_spots_old(request, lat, lng, radius=5000, limit=50):
"""
WITHOUT use of any external library, using raw MySQL and Haversine Formula
http://en.wikipedia.org/wiki/Haversine_formula
"""
radius = float(radius) / 1000.0
query = """SELECT id, (6367*acos(cos(radians(%2f))
*cos(radians(latitude))*cos(radians(longitude)-radians(%2f))
+sin(radians(%2f))*sin(radians(latitude))))
AS distance FROM demo_spot HAVING
distance < %2f ORDER BY distance LIMIT 0, %d""" % (
float(lat),
float(lng),
float(lat),
radius,
limit
)
queryset = Spot.objects.raw(query)
serializer = SpotWithDistanceSerializer(queryset, many=True)
return JSONResponse(serializer.data)
也许这种比较(Haversine vs GeoDjango)会说服你: https://gist.github.com/andilab/4232b463e5ad2f19c155 [GEODJANGO示例]
答案 1 :(得分:0)
我该怎么办?
获取生成的查询的输出(django-debug-toolbar
将适用于此)。对数据库服务器运行手动查询,直到它运行为止。然后返回并修改您的extra
。
答案 2 :(得分:0)
你应该使用geodjango(http://geodjango.org/)和postgis。