GeoDjango:查找半径内的对象 [英] GeoDjango: Finding objects in radius

查看:0
本文介绍了GeoDjango:查找半径内的对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我当前正在尝试获取半径内包含的点的列表,但无法使其工作。到目前为止,我的视图代码如下:

from django.contrib.gis.geos import Point
from django.contrib.gis.measure import Distance

class AreaInfoViewSet(viewsets.ViewSet):
    queryset = models.AreaInfoRequest.objects.all()
    serializer_class = serializers.AreaInfoRequestRequestSerializer

    def list(self, request):
        center_point = 'POINT(48.80033 2.49175)'
        radius = "50.0"

        data = {"center_point": center_point, "radius": radius, "source_ip": utils.get_client_ip(request)}
        serializer = serializers.AreaInfoRequestRequestSerializer(data=data)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        # Contains an object with field "from_location"="SRID=4326;POINT (48.80029 2.49157)"
        objs = models.PointsResult.objects.all()

        float_radius = serializer.data["radius"]
        center_point = serializer.data["center_point"] # Point object

        res = models.PointsResult.objects.filter(from_location__distance_lte=(
            center_point, Distance({"meter": float_radius})))
        # Here the res doesn't contain the unique object in the db even if it's within the radius

        return Response(res)

你知道为什么它不起作用吗?谢谢您

推荐答案

我相信您遇到了与此处描述的问题类似的问题:GeoDjango & SpatiaLite - filtering nearby objects

首先,我建议使用dwithin而不是distance_lte进行筛选,因为它已针对该用途进行了优化(这是一个非常分类的解释here)
我们从dwithin文档中看到:

返回到几何图形字段的距离 查寻几何图形之间的距离在给定的范围内。注意 仅当目标几何图形为 都在一个投影系统中。对于地理几何图形,您应该使用 几何字段的单位(例如,WGS84的度数)。

因此,您必须将查询更改为以下内容:

meters_to_degrees = CONVERT YOUR METERS TO DEGREES
res = models.PointsResult.objects.filter(
    from_location__dwithin=(center_point, meters_to_degrees)
)

可以在这里找到米(特别是公里)到度的计算:How do I convert kilometres to degrees in Geodjango/GEOS?

最后,从DRF的角度来看,您正在listlist方法中创建模型实例。这是绝对错误的,应该避免。如果您想干扰对象创建过程,则应该重写create方法。

这篇关于GeoDjango:查找半径内的对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆