为使用 Qgis 中的聚合函数连接的每个值创建索引

Posted

技术标签:

【中文标题】为使用 Qgis 中的聚合函数连接的每个值创建索引【英文标题】:Create index for each value concatenated using aggregate function in Qgis 【发布时间】:2021-11-07 05:13:42 【问题描述】:

这是我关于堆栈溢出的第一篇文章。如果您能帮我解决我遇到的以下问题,我会非常高兴:

我正在使用 qgis 计算器,特别是聚合函数,来获取穿过我的管道层的电缆的名称 (id),因为有时有不止一根电缆穿过管道。代码如下:

aggregate(
   layer:='cables',
   aggregate:='concatenate', 
   expression:= to_string(name), 
   concatenator:=',',
   filter:=within(geometry(@parent),buffer($geometry,0.2))
)

这段代码在我的管道层中填充了一个名为“电缆”的字段,如下所示:

CLS00083,CLS00084,CLS000309

我现在想索引每个已填充的值,使其如下所示:

1:CBL00083,2:CBL00084,3:CBL000309,4:CBL000310 etc. 

有没有办法使用聚合函数来实现这一点?

非常感谢您的帮助

【问题讨论】:

【参考方案1】:

使用这个表达式:

array_to_string (
    with_variable (
        'array',
        
            aggregate(
                layer:='cables',
                aggregate:='array_agg', 
                expression:= to_string(name), 
                concatenator:=','
            ),
            array_foreach (
                @array,
                (to_int (array_find (@array, @element))+1) || ': '  ||  @element
)))

我想电缆和管道位于不同的层。如果没有,您可以使用更简单的 array_agg 函数而不是 aggregate,例如:

array_to_string(
    with_variable (
        'array',
        array_agg(to_string(name)),
        array_foreach (
            @array,
            (to_int (array_find (@array, @element))+1) || ': '  ||  @element
)))

顺便说一句:GIS 相关问题,better use GIS SE。

【讨论】:

是的,电缆和管道是不同的层。由于某种原因,您发送的那段代码似乎不起作用(它是一个有效的表达式,但不返回名称字段),它为所有行返回一个空列表。知道为什么吗?提前谢谢你 抱歉,忘记array() 声明 - 请参阅更新的答案,应该可以。 请原谅我的无知,但我应该把数组语句放在哪里?我对这个 qgis 表达式很陌生。我曾尝试将它放在聚合函数之前,但它会为每一行抛出以下结果 ['1:'],并且它会在有电缆的地方抛出 ['1:CBL000155,CBL000154']。谢谢你,弗兰 我尝试了您刚刚编辑的新版本,但似乎发生了同样的情况。谢谢你。弗兰 你试过第二个版本array_agg(现在更新)?

以上是关于为使用 Qgis 中的聚合函数连接的每个值创建索引的主要内容,如果未能解决你的问题,请参考以下文章

QGIS入门实战精品教程3.4:QGIS创建连接打包GeoPackage数据库及数据入库案例详解

Power BI 中的索引和聚合函数

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用agg函数计算每个分组不同数值变量的聚合统计值agg参数为字典指定不同变量的聚合计算统计量的形式

SQL Server 索引视图:无法创建聚集索引,因为选择列表包含聚合函数结果的表达式

将列值转换为行值

优化 R 中的时间序列聚合