GeoDjango:查找半径内的对象 [英] GeoDjango: Finding objects in radius
本文介绍了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的角度来看,您正在list
的list
方法中创建模型实例。这是绝对错误的,应该避免。如果您想干扰对象创建过程,则应该重写create
方法。
这篇关于GeoDjango:查找半径内的对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文