我想要进行基于半径的距离搜索。为此,我想在点对象周围创建一个缓冲区,以便过滤其中的对象。
这是我的情况:
>>> lat = 37.7762179974
>>> lon = -122.411562492
>>> from django.contrib.gis.geos import Point
>>> pnt = Point(lat, lon)
>>> buf = pnt.buffer(0.0001)
但是我在根据 Thing
对象是否位于缓冲区内来过滤它们时遇到问题:
>>> z = Thing.objects.filter(pnt__intersects=buf)
(我知道上面的内容是不正确的,但我用它来阐述我想要做的事情。)
如何在点
周围创建缓冲区,然后过滤缓冲区
内的事物
?
编辑:models.py
class Thing(models.Model):
lat = models.FloatField()
lon = models.FloatField()
如何根据这两个模型字段的组合组成的点进行过滤?
这显然不起作用,因为我的模型中没有 pnt
字段:
>>> pnt = Point(lat, lon)
>>> z = Thing.objects.filter(pnt__intersects=buf)
但是我怎样才能做类似的事情呢?
最佳答案
PostGIS 有一个名为 ST_MakePoint
的方法,可以创建 2D、3D 或 4D 点。
在 previous answer 中,我们看到可以从现有的 PostGIS 函数创建自定义数据库函数:
from django.contrib.gis.db.models.functions import GeoFunc
class MakePoint(GeoFunc):
function='ST_MakePoint'
现在我们可以通过 annotate()
ing 创建一个点并在其上应用相交
:
z = Thing.objects.annotate(pnt=MakePoint('lat', 'lon'))
.filter(pnt__intersects=buf)
您可以使用 GeoFunc()
和 F()
表达式实现相同的效果:
from django.contrib.gis.db.models.functions import GeoFunc
z = Thing.objects.annotate(pnt=GeoFunc(
F('lat'), F('lon'),
function='ST_MakePoint'
)).filter(pnt__intersects=buf)
<小时/>
注意:您可以考虑在 Thing
模型中添加 pnt
字段并避免上述情况。
关于python - Geodjango:如何从点缓冲,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19144834/