In questo blog post rispondo a questo quesito:
Ho una serie di poligoni (sezioni di censimento) con associata, in una relazione 1:M, una tabella dove più righe corrispondono ad una sezione. Come posso tematizzare la mappa secondo i dati presenti nella tabella associata? ad esempio voglio in rosso tutti i poligoni nella cui tabella associata sia presente nel campo un determinato valore.
Peppe (un utente di questo blog)
La logica da usare e quindi la funzione da utilizzare è descritta in questo mio blog post del 2016, dove utilizzo tabelle in relazione 1:m per etichettare le regioni italiane (in relazione con le province).
Utilizzando gli stessi strati (regioni e province ISTAT) e creando una relazione tra loro (1:m) proviamo a tematizzare le regioni in funzione di attributi presenti nella tabelle province:
tematizzazione (categorizzata) ed etichettatura utilizzando il campo ‘SIGLA’ presente nel layer in relazione:
- per tematizzare (categorizzato) ed etichettare uso l’espressione:
relation_aggregate( ‘rel’,’concatenate’,”SIGLA”,’,’)
ecco un altro caso banale: supponiamo di voler tematizzare tutte le regioni che hanno, nella sigla delle provincia, la lettera A:
- per tematizzare (categorizzato) uso l’espressione:
relation_aggregate( ‘rel’,’concatenate’,”SIGLA”,’,’) ILIKE ‘%A%’
- per etichettare uso l’espressione:
array_to_string(array_filter(string_to_array( relation_aggregate( ‘rel’,’concatenate’,”SIGLA”,’,’)) , @element ILIKE ‘%A%’),’,’)
secondo caso: tematizzare ed etichettare le regioni in funzione del valore area delle province:
- per tematizzare (categorizzato) uso l’espressione:
relation_aggregate( ‘rel’,’max’,$area) <5000000000
- per etichettare uso l’espressione:
format_number( array_to_string( array_filter( string_to_array( relation_aggregate( ‘rel’,’max’,$area,’,’)) , @element <5000000000),’,’)/1000000,0) || ‘ kmq’
per maggiori dettagli sulle funzioni usate consultare la mia guida HfcQGIS.
Buon lavoro con QGIS
Versione di QGIS utilizzata: 3.4.4
Se questo blog post vi è stato utile donate PayPal
Eccezzionale, davvero. Grazie Totó!
"Mi piace"Piace a 2 people
grazie a te,
hai messo un like??
"Mi piace""Mi piace"
Certo! non si vede?
"Mi piace"Piace a 1 persona
si si,
grazie!!!
"Mi piace"Piace a 1 persona
potenzialità incredibili di queste funzioni, grazie
"Mi piace"Piace a 1 persona
Grazie a te Peppe.
"Mi piace""Mi piace"
Grazie Totò. Molto interessante. E se volessi tematizzare in base alla relazione e solo se contiene la geometria dell’atlas? È possibile?
"Mi piace"Piace a 1 persona
Ciao, credo di sì, non ho mai provato ma potresti farlo usando una tematizzazione con regola.
"Mi piace""Mi piace"
Ok ho provato e funziona categorizzando tramite regole e inserendo questa funzione: intersect($geometry,@atlas_geometry)
"Mi piace"Piace a 1 persona
Grazie per la condivisione.
"Mi piace"Piace a 1 persona
Grazie Totò. Molto interessante. E se volessi tematizzare in base alla relazione e solo se la geometria contiene un elemento dell’Atlas? Nel caso sopra mettiamo che l’Atlas è basato sulle provincie ed io volessi colorare solo la regione che contiene la provincia. È possibile?
"Mi piace"Piace a 1 persona
Ma sei sempre la stessa Silvia???
tio ho risposto sopra
"Mi piace"Piace a 1 persona
Grazie Totò. Molto interessante. E se volessi tematizzare in base alla relazione e solo se la geometria contiene un elemento dell’Atlas? Nel caso sopra mettiamo che l’Atlas è basato sulle provincie ed io volessi colorare solo la regione che contiene la provincia. È possibile?
"Mi piace"Piace a 1 persona
Ma sei sempre la stessa Silvia???
tio ho risposto sopra
"Mi piace""Mi piace"
Si scusa ma non capivo se ero riuscita a inviarti il messaggio
"Mi piace"Piace a 1 persona
Grazie Totò, davvero spunti significativi, per uno strumento potentissimo.
Mi chiedevo se oltre alla visualizzazione del risultato “VERO/FALSO” vi fosse la possibilità di visualizzare nel Layer Panel l’intera lista degli (m) presenti nella tabella relazionata a 1 nella geometria.
Per tentare di spiegarmi meglio:
nel tuo esempio : seleziona / discrimina tutte le regioni che contengono “provincie che iniziano con la lettera A”, mi chiedo se fosse possibile avere nel Layer Panel (e quindi tematizzare) l’elenco di tutte le iniziali (possibili) delle province e non solo “A” versus “tutti gli altri”.
In altre parole, poter discriminare (raggruppare /selezionare/ tematizzare) regioni con attributi comuni presenti in province diverse.
spero di essermi spiegato e grazie ancora
"Mi piace"Piace a 1 persona
Ciao,
per quanto riguarda l’esempio riportato basterebbe usare questa espressione per ottenere la lista dei valori anche nel panel layer:
array_to_string(array_filter(string_to_array( relation_aggregate( ‘rel’,’concatenate’,”SIGLA”,’,’)) , @element ILIKE ‘%A%’),’,’)
sperando di aver capito la richiesta.
"Mi piace"Piace a 1 persona
Salve, video utile e molto apprezzato. Domanda: nel caso della etichettatura con il nome delle Province, posso aggiungere un ulteriore filtro che riguarda un campo presente nella tabella figlio, diverso dal campo scelto per etichettare? esempio mostra in etichetta solo l’elenco delle province che hanno il mare (assumendo che “presenza/assenza” di mare sia un attributo delle singole province). Grazie
"Mi piace"Piace a 2 people
Bella domanda.
devo rifletterci un po’ ma sicuramente un modo esiste.
PS: se non ti rispondo entro pochi giorni, per favore ricordamelo. 🙂
"Mi piace"Piace a 1 persona
te lo ricordo…grazie
"Mi piace"Piace a 1 persona
Ciao,
scusa il ritardo.
Un primo approccio potrebbe essere il seguente:
Concatenare i due campi, il primo serve per l’etichetta il secondo per il filtro.
Ecco esempio:
regexp_replace(
array_to_string(
array_filter(
string_to_array(
relation_aggregate(
relation:=’rel_reg_prov’,
aggregate:=’concatenate’,
expression:=”SIGLA”||’-‘||”cod_rip”, — concateno i campi
concatenator:=’,’
)) , @element Ilike ‘%3%’ ) )
,'(.+?)(-[^-, ]+)’,’\\1′) — regex: per estrarre solo il valore del primo campo
sembra funzionare.
Fammi sapere!
qui gist: https://gist.github.com/pigreco/dc7e370ff36c35d0bc5f2ee1e2954025
"Mi piace""Mi piace"