python - Geodjango:如何从点缓冲

标签 python django filter buffer geodjango

我想要进行基于半径的距离搜索。为此,我想在点对象周围创建一个缓冲区,以便过滤其中的对象。

这是我的情况:

>>> 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/

相关文章:

python - 模板呈现相对路径时,python app-engine django 1.2 上的 TemplateDoesNotExist

Java Stream_Don't apply filter if my filter string is null

R - 过滤数据框以仅包含列数符合条件的行

python - 在不同的 scipy ode 求解器之间互换

python - 如果存在 np.nan,则删除数据帧字典中的所有数据帧

javascript - 加载 AJAX 调用返回的文档

css - 如何从文本中删除 CSS 过滤器样式?

python - 在字典中打印键值对时,它们是否以任何特定顺序打印? (Python)

python - 如何删除 channel Telegram 上的消息?

Django Haystack 结果到 Django Rest Framework 序列化器