Python GeoDjango:查找半径范围内的对象

Python GeoDjango:查找半径范围内的对象,python,django,django-rest-framework,gis,geodjango,Python,Django,Django Rest Framework,Gis,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 =

我目前正在尝试获取半径内包含的点的列表,但无法使其工作。以下是我迄今为止的观点代码:

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)

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

我在这里看到两个问题:

  • 您尚未在中心点上指定SRID,这意味着您正在比较两个不同的SRID。您需要在
    中心点设置SRID

    center_point = 'SRID=4326;POINT(48.80033 2.49175)'
    
  • 您的内联注释显示
    点(2.49157 48.80029)
    ,但您的代码使用
    点(48.80033 2.49175)
    ——请注意,纬度和经度已交换位置。我不知道您打算使用哪一种,但它们指的是完全不同的位置


  • 我确信您遇到了与此处描述的问题类似的问题:

    第一件事首先我建议使用而不是
    distance\u lte
    进行过滤,因为它针对这种用途进行了优化(一种非常合理的解释)
    dwithin
    文档中,我们看到:

    返回模型,其中距离几何体字段的距离为 查找几何图形彼此之间的距离在给定范围内<强>音符 仅当目标几何图形 在投影系统中。对于地理几何图形,应使用 几何字段的单位(例如WGS84的度数)。

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

    meters_to_degrees = CONVERT YOUR METERS TO DEGREES
    res = models.PointsResult.objects.filter(
        from_location__dwithin=(center_point, meters_to_degrees)
    )
    
    可以在此处找到米(特别是公里)到度的计算:


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

    很抱歉,我在一次实验后交换了这两个方法。实际的一个实际上没有交换。我编辑了我的问题并修复了这个问题;点(48.80033 2.49175)不起作用,我相信默认情况下,
    SRID=4326
    用于我创建的所有
    POINT
    对象请提供您希望匹配的点的示例数据?注释中的一个应该可以找到:````包含一个带有字段“from\u location”=“SRID=4326;POINT(48.80029 2.49157)”objs=models.PointsResult.objects.all()``非常感谢您的回复!我想这就是我一直在寻找的,我很快就会尝试这个。同样感谢DRF的建议,我会将此视图更改为APIView并使用
    get
    instead@E-卡米很乐意帮忙:)