1

我正在嘗試計算具有geodjango幾何字段的模型的總面積,並按其他屬性進行分組。我沒有找到geoqueryset api reference中的函數,而常規的Sum aggregate function不適用於這種情況。在Django中按組分組的地理區域總面積

所以我嘗試使用上查詢集「額外」的說法如下:

class MyModel(models.Model): 
    name = models.CharField(max_length = 100) 
    geom = models.MultiPolygonField() 
    objects = models.GeoManager() 

MyModel.objects.all()\ 
    .extra(select={'area': 'SUM(ST_Area(geom))'})\ 
    .values('area', 'name') 

這不工作,返回下面的編程錯誤。

column "app_mymodel.name_id" must appear in the GROUP BY clause \ 
or be used in an aggregate function 

我試過的extravaluesannotate與這些領域的多種組合,但未能獲得工作骨料。如果我放棄分組參數names,則總面積將成功返回。

關於如何獲得由附加屬性分組的幾何場的區域的任何想法?

回答

0

我能夠使用.values_list,.distinct,.areareduce來破解一些東西。

values_list(...).distinct()咒語用於獲取唯一name屬性值的列表。

接下來,循環遍歷唯一值,使用唯一值篩選模型查詢集,然後使用reduce對篩選後的QuerySet進行求和。我必須使用循環(即reduce)進行求和,因爲area不作爲數據庫中的列存在,以便與更傳統的方法一起使用。

from django.contrib.gis.measure import Area  
from data.models import MyGeoModel 

distincts = MyGeoModel.objects.order_by('name').distinct('name').values_list('name', flat=True) 

for value in distincts: 
    print reduce(lambda a,x: a+x.calculated_area.sq_ft, MyGeoModel.objects.filter(name=value).area(model_att='calculated_area'), Area(0))