1
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')

我使用上面的代码来查找附近的对象。但是,即使对象与数据库中的对象具有相同的纬度/经度,数据库中的该对象也不会显示。

例如,假设 Position 对象 1 具有以下坐标:

Latitude: -23.5551522346
Longitude: -46.6540710256

用户 1 具有以下坐标:

Latitude: -23.5551522346
Longitude: -46.6540710256

位置对象 1 不会作为附近的对象显示给用户 1。

我应该怎么办?

4

3 回答 3

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 示例]

于 2014-09-04T03:04:38.097 回答
0

您应该将 geodjango ( http://geodjango.org/ ) 与 postgis 一起使用。

于 2013-08-11T19:00:55.687 回答
0

我应该怎么办?

获取生成的查询的输出(django-debug-toolbar将为此工作)。对您的数据库服务器运行手动查询,直到它正常工作。然后回来修改你的extra.

于 2013-08-11T18:28:10.397 回答