QGIS: Tematizzare usando tabelle in relazione 1:m

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:

Regioni e province in relazione 1:M
  • 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:

etichetto e tematizzo quelle regioni che hanno province con sigla contenente la 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:

valore $area < 5000 kmq
  • 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

21 pensieri su “QGIS: Tematizzare usando tabelle in relazione 1:m

  1. 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?

    Piace a 1 persona

  2. 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?

    Piace a 1 persona

  3. 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

    Piace a 1 persona

    1. 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.

      Piace a 1 persona

  4. 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

    Piace a 2 people

    1. 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"

Lascia un commento

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.