【问题标题】:Relate two models by geometry intersection in Geodjango通过 Geodjango 中的几何相交关联两个模型
【发布时间】:2018-07-10 04:10:47
【问题描述】:

在有两个的 GeoDjango 中有两个包含几何字段的模型:

from django.contrib.gis.db import models 

class Country(models.Model):
    territory = models.MultiPolygonField()
    language = models.CharField(max_length=2)

class House(models.Model):
    location = models.PointField()

我想做一个查询,返回位于讲英语的国家的所有房屋。
Country和House之间的关系应该通过House.locationCountry.territory相交来完成。

如何使用 GeoDjango 的 ORM 实现这一点?

【问题讨论】:

    标签: python django postgis geodjango


    【解决方案1】:

    一个有用且相当优化的解决方案是将英语国家的多边形组合成一个multipolygon(由至少 2 个定义明确的多边形产生的区域)。然后过滤哪些点与该区域相交。

    为此,我们将使用 GeoDjango 的Union

    返回一个 GEOSGeometry 对象,该对象包含查询集中每个几何图形的联合。 请注意,使用 Union 是处理器密集型的,在大型查询集上可能需要大量时间

    Subquery 内:

    Houses.objects.filter(
        location__intersects=Subquery(
            Country.objects.filter(language='English')
                           .aggregate(area=Union('territory'))['area']
        )
    )
    

    或者我们可以避免子查询(对于 Django 版本

    engish_speaking_area = Country.objects.filter(language='English')
                                          .aggregate(area=Union('territory'))['area']
    Houses.objects.filter(location__intersects=english_speaking_area)
    

    另一种方法是在这里修改我的一些答案:GeoDjango query: all point that are contained into a multi polygon 以满足您的需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多