Decorazioni: espressioni nel Title Label

Nella versione QGIS 3.22.10 le espressioni di aggregazione nella decorazione Title Label funzionavano, ora nelle recenti versioni 3.34, 3.40 e master non funzionano più.

Qualcuno conosce il motivo?

qui una dimostrazione che funzionavano, ora restituiscono sempre 0.

l’espressione usate è

aggregate (
layer:= 'LayerName',
aggregate:= 'count',
expression:= @id,
filter:= intersects (@map_extent, @geometry))

saluti

Buongiorno,
ho aperto una issue [1] nel repository di QGIS.

Il problema non è legato a QGIS, ma al contesto in cui si utilizzano le espressioni.

Il contesto Decorazioni sembra essere un po’ particolare ed occorre specificare meglio ogni opzione.

Funziona tutto!

in particolare ho testano le seguenti espressioni:

aggregate (
layer:= 'LayerName',
aggregate:= 'count',
expression:= @id,
filter:= intersects (@map_extent, @geometry))
aggregate(
layer:='World Map',
aggregate:='sum',
expression:= "fid" ,
filter:= is_selected( 'World Map', @feature ))

entrambe funzionano.

Grazie mille a @agiudiceandrea

[1] Decorations: expressions in Title Label · Issue #60355 · qgis/QGIS · GitHub

saluti

Ciao Salvatore,
mi era sfuggito il tuo messaggio di 5 giorni fa.

Effettivamente è una questione di contesto in cui si utilizzano le espressioni.

L’espressione che avevi indicato inizialmente nel tuo messaggio e poi nell’issue report in realtà funziona correttamente nella decorazione Title Label anche con QGIS 3.34 e QGIS 3.40.

L’altra espressione, quella che contiene la funzione is_selected() senza parametri come filtro all’interno della funzione aggregate, indicata in un tuo commento all’issue report, invece non da i risultati attesi nella decorazione Title Label con QGIS 3.34 e QGIS 3.40, ma ciò avveniva anche con QGIS 3.22.

aggregate(
layer:='World Map',
aggregate:='sum',
expression:= "fid" ,
filter:=is_selected())

Viceversa tale espressione da i risultati attesi, per esempio, nel calcolatore di campi, quando eseguita per il layer World Map, ma non se eseguita per un altro layer.

Questo perché il calcolatore di campi viene eseguito sempre per un determinato layer e quindi può applicare all’espressione il “contesto” relativo a tale layer e quindi la funzione is_selected() - senza parametri - evidentemente può “sapere” a quale layer far riferimento.
Se tale espressione viene eseguita nel calcolatore di campi per il layer World Map, is_selected() considererà le feature selezionate in tale layer. Se tale espressione viene eseguita nel calcolatore di campi per un altro layer, essa restituirà un risultato diverso e probabilmente non atteso in quanto aggregate cercherà di aggregare le feature del layer World Map filtrandole in base alle feature selezionate nell’altro layer in base al loro id.

Invece nel Title Label non c’è un particolare layer a cui poter fare riferimento in quanto il Title Label è collegato alla mappa e non ad un particolare layer. Quindi in questo caso la funzione is_selected() usata senza parametri non “saprebbe” a quale layer far riferimento.

Ci sarebbe da chiedersi perché is_selected() usata senza parametri all’interno della funzione aggregate, in cui un layer viene già specificato, non possa far automaticamente riferimento a tale layer.

Per esempio, nel calcolatore di campi, dovrebbe far riferimento al layer al quale viene applicato il calcolatore di campi, come avviene adesso, o al layer indicato in aggregate?

Non sono esperto di espressioni e quindi non so se il comportamento di is_selected() usata all’interno di aggregate sia diverso da quello di altre funzioni simili. In questo caso sarebbe sicuramente un bug.

Infatti avevo lasciato aperto il tuo issue report anche se avevo indicato il modo per scrivere l’espressione affinché essa restituisse il risultato da te atteso, cioè utilizzando i parametri appositi di is_selected e quindi rendendo esplicito il layer a cui dovesse far riferimento

aggregate(
layer:='World Map',
aggregate:='sum',
expression:= "fid" ,
filter:=is_selected('World Map', @feature))

in quanto non ero e non sono sicuro che il comportamento di is_selected() sia corretto / voluto / conforme al funzionamento di aggregate e delle funzioni all’interno di aggregate, oppure no e quindi volevo che sviluppatori esperti di espressioni potessero valutare la situazione.

La funzione is_selected() funziona bene e come mi aspettavo, però non ho riflettuto sul fatto che nelle decorazioni non c’è e non ci può essere un layer di riferimento, quindi va esplicitato anche come argomento della funzione.

Per me non è un bug, almeno credo.

Grazie mille, sei stato prezioso.

saluti