python - 在 Geodjango 中通过几何相交关联两个模型
问题描述
在具有两个的 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.location
完成Country.territory
。
如何使用 GeoDjango 的 ORM 实现这一点?
解决方案
一个有用且相当优化的解决方案是将英语国家的多边形组合成一个多多边形(由至少 2 个定义明确的多边形产生的区域)。然后过滤哪些点与该区域相交。
为此,我们将使用 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 查询:根据您的需要包含在多多边形中的所有点。
推荐阅读
- amazon-web-services - 如何将 Amazon 状态语言 json 渲染到图像?
- c++ - clang 格式重排评论不正确且不可重复
- azure - 测试 Azure Functions 时如何调用 ConfigureAppConfiguration
- amazon-web-services - AWS API Gateway、EventBridge:指定的选择表达式无效
- python - 替换 np.array 中的字符串字符
- kubernetes - 在节点故障的情况下,如何抑制在其他节点上再次启动 Job-based Pod?
- project-reactor - 为什么连接池获得的大小是-1?
- node.js - 我应该如何为以下标准创建 mongodb 数据库设计
- ios - SwiftUI 如何创建单独的 FormField 以更好地分离代码?
- c# - 使用 selemium 自动填充文本框命名地址 forms.office C#