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
:
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-卡米很乐意帮忙:)