首页 > 解决方案 > QGIS 3.22从同一层聚合元素

问题描述

我有一层代表几个土地覆盖类别,每个类别都通过代码识别。我想汇总每个类别对于代码子集的对象数量(即从 111:113 我有多少个对象,从 114:222 我有多少个对象?等等)我怎么能从属性表?我想到了字段计算器,并添加了以下功能:

总计的

有人可以帮忙吗?

标签: qgis

解决方案


要使用的表达式是:

count ("code_90", group_by:= "code_90" in (111,112,113))

这会计算字段中包含值 111、112 或 113 的要素code_90


要自动创建一系列值(例如从 114 到 222),请使用以下表达式:

count ("code_90", group_by:= array_contains (generate_series (114,222), "code_90" ))

这会计算包含 114 到 222 值的特征。


要一次计算多个范围的数量,请使用CASE条件:

case 
when array_contains (generate_series (111,113), "code_90" ) then count ("code_90", group_by:= array_contains (generate_series (111,113), "code_90" ))
when array_contains (generate_series (114,122), "code_90" ) then count ("code_90", group_by:= array_contains (generate_series (114,122), "code_90" ))
when array_contains (generate_series (123,133), "code_90" ) then count ("code_90", group_by:= array_contains (generate_series (123,133), "code_90" ))
when array_contains (generate_series (134,144), "code_90" ) then count ("code_90", group_by:= array_contains (generate_series (134,144), "code_90" ))
end

这计算了以下 4 个范围的特征:111 到 113、114 到 122、123 到 133 和 134 到 144。


相同,但无需为每个范围手动定义一条线。在括号内的第 4 行中定义一次范围(这里有 4 个范围:111 到 113 / 114 到 122 / 123 到 133 / 134 到 144),然后获得所有范围的正确计数:

array_max(
    with_variable (
        'list',
        'map(111,113,114,122,123,133,134,144)',
        array_foreach(
            map_akeys( eval(@list)),
            case
                when array_contains (generate_series (@element,map_get( eval(@list),@element)), "code_90" ) 
                then count ("code_90", group_by:= array_contains (generate_series (@element,map_get( eval(@list),@element)), "code_90" ))
            end
        )
    )
)

推荐阅读