在Geodjango中,通过几何交集将两个模型关联起来

4
在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如何实现这一点?
1个回答

6
一种有用且相当优化的解决方案是将英语国家的多边形合并为多面体(由至少两个定义良好的多边形产生的区域)。然后过滤与该区域相交的点。
为此,我们将使用GeoDjango的Union

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

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

或者我们可以避免使用子查询(对于 Django 版本 < 1.11):

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

另一种方法是修改我的答案中的一点内容:GeoDjango查询:所有包含在多边形中的点,以符合您的需要。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接