为使用 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数据库及数据入库案例详解
pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用agg函数计算每个分组不同数值变量的聚合统计值agg参数为字典指定不同变量的聚合计算统计量的形式