[QGIS-it-user] Stile basato sulle relazioni 1-n

Buonasera a tutti,
mi piacerebbe conoscere un metodo per tematizzare le feature in un layer
(layer 1) basandosi sul valore assunto da un layer 2 ad esse collegato
tramite relazioni (1-n).
Ad esempio: se esiste una relazione tra feature del layer 1 ed una (o più)
feature dei layer 2 relazionato, la geometria assume bordi rossi, altrimenti
resta del colore standard.
Esempio n. 2: in base al valore assunto da un campo del layer 2
(relazionato) categorizza il layer 1...

Grazie mille!

--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html

virtusmankind wrote

mi piacerebbe conoscere un metodo per tematizzare le feature in un layer
(layer 1) basandosi sul valore assunto da un layer 2 ad esse collegato
tramite relazioni (1-n).

Ciao virtusmankind,
penso che la funzione relation_aggregate dovrebbe essere utile per il tuo
scopo
https://docs.qgis.org/3.16/en/docs/user_manual/working_with_vector/functions_list.html#expression-function-aggregates-relation-aggregate

A presto.

Andrea

--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html

virtusmankind wrote

Buonasera a tutti,
mi piacerebbe conoscere un metodo per tematizzare le feature in un layer
(layer 1) basandosi sul valore assunto da un layer 2 ad esse collegato
tramite relazioni (1-n).
Ad esempio: se esiste una relazione tra feature del layer 1 ed una (o più)
feature dei layer 2 relazionato, la geometria assume bordi rossi,
altrimenti
resta del colore standard.
Esempio n. 2: in base al valore assunto da un campo del layer 2
(relazionato) categorizza il layer 1...

Grazie mille!

Ciao,
il suggerimento di Andrea è ottimo.
Allego un video con una piccola dimostrazione su come usare la funzione e su
come tematizzare tramite relazioni 1:m
la espressione usata nel colore tratto è:

if(
relation_aggregate(
relation:='rel',
aggregate:='count',
expression:=$id)>4, 'red','black')

video demo
https://youtu.be/G74zUEMGtq0

saluti

-----
https://pigrecoinfinito.com/
--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html

Vi ringrazio infinitamente per la celerità ed il dettaglio delle
informazioni!! Ora è chiarissimo e funziona!

--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html

Ciao a tutti, avrei anche io bisogno di rappresentare oggetti con questa
funzione interessantissima
Nel mio caso però avrei bisogno di fare una sottrazione di due valori
nell'esatto ordine di tempo.
Per capirci meglio i valori fanno riferimento a 2 anni consecutivi (2018 e
2019).
Vorrei che la funzione calcolasse la sottrazione 2018-2019 sempre (con
risultato anche negativo eventualmente).
Nella tabella figlia i valori sono ordinati per anno crescente (infatti li
vedo correttamente)
Ho provato con range e mi pare che funzioni ma non sono sicuro che ciò
succeda sempre.
Alla fine quello che vi chiedo è se, prima di tutto, ho utilizzato la
funzione giusta per la sottrazione e, in seconda battuta, se la sottrazione
(con range) viene sempre fatta come l'ordinamento che ho impostato nella
visualizzazione dei dati (nel mio caso 2018 - 2019).
Spero di essere stato chiaro e vi ringrazio in anticipo per la risposta

--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html

Alberto Poggi wrote

Vorrei che la funzione calcolasse la sottrazione 2018-2019 sempre (con
risultato anche negativo eventualmente).

Ciao Alberto,
la funzione di aggregazione "range" non fa altro che, dato una certa serie
di valori presenti nel campo indicato, calcolarne il valore massimo,
calcolarne il valore minimo e poi restituire come risultato la differenza
tra il valore massimo e il valore minimo.
In questo modo otterresti sempre un valore positivo.
https://docs.qgis.org/3.16/en/docs/user_manual/working_with_vector/functions_list.html#range
Se non ho capito male, non dovrebbe essere quello che vuoi fare tu.

Hai fatto una prova? Ottieni anche valori negativi? Puoi fare un'esempio
della funzione che hai utilizzato?

A presto.

Andrea

--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html

Ciao, e grazie della risposta
Hai capito perfettamente il risultato che vorrei raggiungere
In pratica l'idea è, in ambito distribuzione acqua, evidenziare le tubazioni
che da un anno all'altro hanno erogato acqua in volumi significativamente
diversi in modo tale da evidenziare "al volo" le tubazioni che
potenzialmente hanno perdite consistenti.
Chiaramente le tubazioni che interessano sono quelle che hanno, nel secondo
anno preso in esame, erogato molta più acqua dell'anno precedente. Potrebbe
essere la prima discriminante per individuare le zone dove andare a fare
indagini più dettagliate
Se nel secondo anno l'acqua erogata è maggiore, ovviamente una sottrazione
deve dare un numero negativo.

ho fatto una prova poco fa e il risultato è sempre un numero positivo
Come hai scritto tu la funzione "range" fa sempre la sottrazione tra massimo
e minimo nonostante l'ordine dei campi.
I problemi sono due:
1) fare la sottrazione
2) assicurarsi che la sottrazione avvenga tra i due valori ordinati per anno
crescente

qui sotto la funzione che ho provato

if(relation_aggregate(relation:='erogazione',aggregate:='range',expression:="consumo")<-1000,
'red','ciano')

--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html

Alberto Poggi wrote

qui sotto la funzione che ho provato

if(relation_aggregate(relation:='erogazione',aggregate:='range',expression:="consumo")<-1000,
'red','ciano')

Ciao Alberto,
quello che mi viene in mente è di usare l'aggregatore array_agg che genera
una lista dei valori di consumo di acqua, e ordinarli in base al campo
numerico con l'anno a cui si riferisce il consumo

relation_aggregate(relation:='erogazione',aggregate:='array_agg',expression:="consumo",order_by:="anno")

questo genera la lista [1000, 2500] se nel 2018 il consumo è stato 1000 e
nel 2019 è stato 2500 e se ad ogni feature del layer "genitore" sono
associati solo due record della tabella con i consumi

a questo punto si possono ottenere il primo valore e il secondo valore della
lista con relation_aggregate(...)[0] e relation_aggregate(...)[1]

per evitare di far calcolare inutilmente due volte la lista si può usare la
funzione with_variable, che permette di assegnare il risultato di un
espressione ad una variabile (che quindi conterrà la lista di valori) e poi
usare la variabile per calcolare la differenza e da usare nella condizione
if

per esempio così:

with_variable(
'consumi',
relation_aggregate(relation:='erogazione',aggregate:='array_agg',expression:="consumo",order_by:="anno"),
if((@consumi[0]-@consumi[1])<-1000,'red','cyan'))

Potrebbe esserci un'espressione più elegante o concisa da usare...

A presto.

Andrea

--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html

Andrea Giudiceandrea wrote

per esempio così:

with_variable(
'consumi',
relation_aggregate(relation:='erogazione',aggregate:='array_agg',expression:="consumo",order_by:="anno"),
if((@consumi[0]-@consumi[1])<-1000,'red','cyan'))

Chiaramente potresti creare un campo virtuale o reale nel layer genitore
popolandolo con l'espressione

with_variable(
'consumi',
relation_aggregate(relation:='erogazione',aggregate:='array_agg',expression:="consumo",order_by:="anno"),
@consumi[0]-@consumi[1])

e poi usare tale campo per categorizzare la simbologia a tuo piacimento

--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html

Ciao Andrea, il tuo suggerimento è ottimo e funziona bene
L'unica mofìdifica che ho apportato è che il campo array, avendo i dati in
postgresql, l'ho aggiunto alla tabella genitore e poi ho fatto due
popolamenti successivi per anno (prima 2018, poi 2019) direttamente da sql
sul db perchè ovviamente lato server è tutto più veloce (ho circa 18000
record da aggiornare)
Utilizzando il tuo suggerimento del calcolo della sottrazione dei valori
dell'array adesso posso ovviamente gestire come voglio.
Qgis è impostato per la colorazione delle tubazioni con un if in questo modo
if(erog[0]-erog[1]<-500, 'red','ciano')
Inoltre al prossimo update (anno 2020) posso anche tenere una specie di
"storico" con qgis facendo una seconda colorazione per gli anni successivi
impostando la colorazione progreessivamente con
if(erog[1]-erog[2]<-500, 'red','ciano')

grazie mille!

--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html

Alberto Poggi wrote

Ciao Andrea, il tuo suggerimento è ottimo e funziona bene
L'unica mofìdifica che ho apportato è che il campo array, avendo i dati in
postgresql, l'ho aggiunto alla tabella genitore e poi ho fatto due
popolamenti successivi per anno (prima 2018, poi 2019) direttamente da sql
sul db perchè ovviamente lato server è tutto più veloce (ho circa 18000
record da aggiornare)

Non sapevo che stessi usanto postgresql. Hai fatto benissimo a demandare
l'operazione al server.

A presto.

Andrea

--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html