2017-08-14 66 views
1

當我嘗試Extent聚合 我得到一個字符串而不是預期的4元組。無法與GeoDjango合併在範圍聚合上

爲了解釋:

這工作:

>>> 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) 

但是,當我在Coalesce電話一起使用它們這不起作用:

>>> 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)' 

這是一個錯誤,還是我做錯了什麼?

+0

嘿,@丹,我想知道,你發現我的答案有幫助嗎? –

+0

@JohnMoutafis是的,但我沒有看到這個問題在一段時間 – Dan

+0

當你申請的答案讓我知道:) –

回答

1

好像Extent方法的convert_value沒有得到Coalesce通話過程中調用,就像它返回從左邊第一個不爲空的對象,而不讓它完成整個過程...
這是非常奇怪了也可能是@django球隊應該被通知(它可能被設計,所以至少他們能夠澄清主題!)


在平均時間可以解決的問題與下列方法之一:

  1. 創建自己的convert_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) 
    
  2. 省略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的conditional expressions我們創建了一個Coalesce樣方法它返回一個不爲空,或'geometry'作爲默認的第一列的名稱。

    • 最後我們在之前的回報欄上應用Extent

如果我發現任何東西,我將讓你知道!