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是的,但我已经有一段时间没有研究过这个问题了。当你应用答案时,让我知道:)