如何用tastypie和geodjango测量距离?

时间:2014-08-20 20:32:59

标签: python django tastypie geodjango

使用Tastypie和GeoDjango,我试图返回位于1英里范围内的建筑物的结果。

TastyPie documentation表示尚未支持距离查找,但我发现人们可以使用它的示例,例如StackOverflow上的this discussionthis discussion,但没有工作代码示例可以应用。

我正在尝试使用的想法是,如果我将GET命令附加到URL的末尾,则会返回附近的位置,例如:

http://website.com/api/?format=json&building_point__distance_lte=[{"type": "Point", "coordinates": [153.09537, -27.52618]},{"type": "D", "m" : 1}]

但是当我尝试时,我得到的只是:

{"error": "Invalid resource lookup data provided (mismatched type)."}

我已经在Tastypie文档上花了几天时间,只是无法弄清楚如何实现它。

我会提供更多的例子,但我知道他们都很可怕。感谢所有建议,谢谢!

1 个答案:

答案 0 :(得分:2)

搞定了,这是后人的一个例子:

在api.py中,创建一个如下所示的资源:

from django.contrib.gis.geos import *

class LocationResource(ModelResource):
    class Meta:
        queryset = Building.objects.all()
        resource_name = 'location'

    def apply_sorting(self, objects, options=None):
        if options and "longitude" in options and "latitude" in options:
            pnt = fromstr("POINT(" + options['latitude'] + " " + options['longitude'] + ")", srid=4326)
            return objects.filter(building_point__distance_lte=(pnt, 500))

        return super(LocationResource, self).apply_sorting(objects, options)

“building”字段在models.py。中定义为PointField。

然后在资源的URL中添加以下内容,例如:

&latitude=-88.1905699999999939&longitude=40.0913469999999990

这将返回500米范围内的所有物体。