Python Can';t与GeoDjango在数据块聚合上合并
当我尝试在Python Can';t与GeoDjango在数据块聚合上合并,python,django,geodjango,Python,Django,Geodjango,当我尝试在范围聚合上合并时, 我得到一个字符串,而不是预期的4元组 解释: 这项工作: >>> Community.objects.annotate(extent=Extent('geometry')).get(...).extent (2726459.05875, 1220672.3825, 2736397.89, 1227645.2375) 除此之外: >>> Community.objects.annotate(extent=Extent('poten
范围
聚合上合并
时,
我得到一个字符串,而不是预期的4元组
解释:
这项工作:
>>> Community.objects.annotate(extent=Extent('geometry')).get(...).extent
(2726459.05875, 1220672.3825, 2736397.89, 1227645.2375)
除此之外:
>>> Community.objects.annotate(extent=Extent('potential__geometry')).get(...).extent
(2726687.04049593, 1221917.0, 2732056.725, 1223760.94563836)
但当我在合并调用中同时使用它们时,这不起作用:
>>> Community.objects.annotate(extent=
... Coalesce(Extent('potential__geometry'), Extent('geometry'))).get(...).extent
'BOX(2726687.04049593 1221917,2732056.725 1223760.94563836)'
这也不是
>>> Community.objects.annotate(extent=
... Coalesce(Extent('potential__geometry'), Extent('geometry'),
... output_field=ExtentField())).get(...).extent
'BOX(2726687.04049593 1221917,2732056.725 1223760.94563836)'
这是一个bug,还是我做错了什么?方法的convert\u值在Coalesce
调用期间似乎没有被调用,就像它从左侧返回第一个非空对象,而不让它完成整个过程一样
这确实很奇怪,可能应该通知@django团队(这可能是出于设计,所以至少他们可以澄清这个问题!)
同时,您可以通过以下方式之一解决此问题:
创建自己的convert\u value
函数:
def my_convert_value(value):
value = value[4:-1]
box_min, box_max = value.split(',')
xmin, ymin = map(int, box_min.split())
xman, ymax = map(int, box_max.split())
return (xmin, ymin, xmax, ymax)
而且:
my_convert_value(
Community.objects.annotate(
extent=Coalesce(
Extent('potential__geometry'),
Extent('geometry')
)).get(...).extent
)
将返回:
(2726687.04049593, 1221917.0, 2732056.725, 1223760.94563836)
省略Coalesce
的用法,并将其替换为:
from django.db.models import CharField, Case, Value, When
Community.objects.annotate(
extent=Extent(
Case(
When(
potential__geometry__isnull=False,
then=Value('potential__geometry'),
),
When(
geometry__isnull=False,
then=Value('geometry'),
),
default=Value('geometry'),
output_field=CharField(),
)
)
).get(...).extent
说明:
Extent()
方法需要几何体的名称作为参数
专栏
Coalesce
从左到右返回第一个非空字段的值
- 利用django,我们创建了一个类似于
的Coalesce方法,该方法返回第一列的名称,该列的名称不是空的,或“geometry”
,作为默认值
- 最后,我们对前面返回的列应用
Extent
如果我还发现什么,我会告诉你的 嘿,@Dan,我在想,你觉得我的答案有用吗?@JohnMoutafis是的,但我已经有一段时间没有研究过这个问题了。当你应用答案时,让我知道:)