QGIS RELAZIONI

Le ‘Relazioni’ in QGIS permettono di sviluppare dei casi molto interessanti attraverso il meccanismo classico delle ‘chiavi’. Le relazioni sono molto usate in QGIS, sia tra shapefile che tra semplici tabelle o shapefile e semplici tabelle o vettori PostGIS; vengono usate anche negli Atlas (Atlanti) nel compositore di stampe. Di seguito parleremo delle relazioni tra tabelle già esistenti.

Le ‘Relazioni’ vengono utilizzate ogniqualvolta nasce la necessità di dover mettere in relazione due tabelle, una con ‘n’ record e un’altra con ‘m’ record (con ‘n’ < ‘m’) cioè il classico esempio della relazione uno a molti, relazione ‘padre’ – ‘figlio’.

Per capire meglio di cosa si tratta facciamo un semplice esempio: lo shapefile regioni italiane è caratterizzato da una tabella degli attributi con #20 record (#20 feature) che rappresentano le venti regioni italiane e lo shapefile province italiane caratterizzato da #110 province (#110 feature) cioè la tabella degli attributi ha #110 righe. Lo shapefile regioni ha un campo univoco denominato ‘cod_reg’ (codice regione), tale campo lo ritroviamo anche nello shapefile province italiane, ma questa volta non è un campo univoco ma un semplice campo numerico che si ripete tante volte quante sono le province ricadenti all’interno di una regione; per esempio in Sicilia (cod_reg = 19) nella tabella delle province il campo ‘cod_reg = 19’ è ripetuto ben 9 volte, cioè il numero delle province siciliane.

Immagine 30
Tabella degli attributi regioni italiane
Immagine 31
Tabella degli attributi province italiane (filtrate per la Sicilia)

Questi due shapefile sono in relazione tra loro, una relazione tra ‘padre’ (regioni italiane) e ‘figlio’ (province italiane), relazione che tecnicamente è definita ‘uno a molti’ (una regione ha molte province; un record della tabella ‘padre’ ha molti record nella tabella ‘figlio’).

Per poter esplicare la relazione è necessario, come detto sopra, che la tabella padre sia caratterizzata da un campo con valori univoci (cod_reg, detta chiave primaria) e che la tabella figlia abbia un campo con valori ripetuti (cod_reg, detta chiave esterna) uguali alla tabella padre quindi un campo non univoco. Questi due campi sono fondamentali per definire la relazione in QGIS, entrambi vengono chiamati campi di riferimento, ma uno è relativo alla tabella padre (campo univoco) e l’altro alla tabella figlio (campo non univoco).

In QGIS le relazioni vengono definite a livello di progetto, quindi per definire una relazione tra tabelle occorre andare sul menù Progetto => Proprietà progetto… => relazioni

Immagine 32
screenshot proprietà progetto – Relazioni

cliccando sul bottone ‘Aggiungi relazione’ si aprirà la finestra:

Immagine 33
screenshot aggiungi relazione
  • Nome: inserire un nome che ricordi la relazione;
  • Layer di riferimento (figlio): selezionare lo shapefile delle province;
  • campo di riferimento: selezionare il campo ‘cod_reg’ (la chiave esterna);
  • Layer di riferimento (padre): selezionare lo shapefile regioni;
  • campo di riferimento: selezionare il campo ‘cod_reg’ (la chiave primaria);
  • OK.

A questo punto la relazione è definita e può essere visualizzata aprendo la tabella degli attributi dello shapefile regioni:

Immagine 34
screenshot tabella regione con relazione.

Osservazioni finali:

In generale le tabelle lato figlio sono delle semplici tabelle senza contenuto spaziale, delle classiche tabelle in formato CSV, in quanto il loro uso è limitato al solo arricchimento di dati, di conseguenza NON possono essere utilizzate per tematizzazioni o selezioni di feature lato padre. Un uso molto interessante è legato alla costruzione di atlanti.

Video dimostrativo.

31 pensieri su “QGIS RELAZIONI

  1. volevo chiederti cortesemente, se è possibile creare una relazione con più di 2 tabelle in cascata (esempio banale: regione, provincia, comune, zone….)

    "Mi piace"

  2. Salve, installata la versione 3.0 ho notato che il form della “relazione” nella tabella attributi in visualizzazione modulo viene mostrato “collassato”: è visibile soltanto il nome della relazione. Hai riscontrato questo comportamento anche tu?
    Grazie e ancora complimenti

    Piace a 1 persona

  3. Ciao, ho creato una tabella padre con le informazioni spaziali e due tabelle figlio collegate senza info spaziali. Posso fare una query sulla tabella figlio e far accendere le geometrie? ho visto il plugin python che avete creato ma non riesco a sfruttarlo, sembra che sia solo per selezione manuale.. Scusa se non mi sono spiegata bene..

    "Mi piace"

  4. Ciao,
    per quale versione di QGIS è stato svilupatto il plugin “selectbyrelationship” di cui si discute sopra?
    quali sono le sue funzioni principali??
    Grazie! grandissimo Totò!

    Cristiano

    Piace a 1 persona

  5. Grazie Totò,
    davvero gentile e celere. Ho istallato e sperimentato un pò. Plugin buono e funzionale! Tuttavia non riesco a capire se è possibile (e come fare) per selezionare elementi presenti in tabelle relazionate partendo dal “lato padre” ossia selezionare automaticamente tutti “i figli”, a partire dalla selezione di una riga presente nella tabella “padre”. Grazie !
    Cr

    Piace a 1 persona

    1. Buongiorno,
      entrambe le versioni (per QGIS 2.x e 3.x) il plugin è ancora in fase sperimentale.
      Nella versione 2.x, diversamanete dell 3.x, non è possibile configurare il plugin che è impostato – di default – nella selezione figlio e seleziona il padre (oppure al contrario, non ricordo – perdonami)

      Nella versione 3 trovi maggiorni spiegazioni qui https://github.com/pyarchinit/selectbyrelationship_repo

      che versioni di QGIS stai usando?

      "Mi piace"

  6. Salve, sto utilizzando la versione 2.18.22, sulla quale ho installato il plugin sperimentale “select by relationship”. Stando alle mie prove effettuate, mettendo in relazione due shape puntuali (o anche uno puntulale ed uno lineare) che hanno una chiave (campo/colonna) in comune, attualmente il plugin permette una selezione automatica dell’elemento “padre” partendo dalla selezione di un elemento “figlio”, ma non il viceversa, ossia non permette di selezionare automaticamente tutti i “figli” cliccando sull’elemento “padre”. I video da te consigliati (pre-V3) sembrano confermare quanto ho constatato.
    Mi chiedevo se fosse possibile farlo tramite lo stesso plugin o tramite altri modi. Ritengo che in molti casi possa essere utile farlo.
    Ho sperimentato per un breve periodo la versione Qgis 3.2, ma ho per il momento preferito fare un passo indietro, ritenendolo per me un passo troppo azzardato…

    grazie per l’interesse e per le dritte!
    cr

    Piace a 1 persona

    1. Ciao,
      le tue osservazioni sono corrette.
      Il plugin è ancora in fase sperimentale e l’opzione attivata di default è quella che permette di selezionare il padre partendo da figlio.
      Il plugin permette anche il contrario ma l’opzione non è attiva in quanto occorre creare una finestra delle opzioni.
      Se ti interessa fammelo sapere che ti spiego come attivare le altre opzioni.

      "Mi piace"

  7. te ne sarei grato, credo che possa interessare a molti. Sperando che non sia troppo complesso per te spiegarlo o per per recepirlo. Tuttavia, come ben sai, nella versione 2.18, il plugin (per ora) non prevede alcuna drop-down list, ma semplicemente una attivazione/disattivazione della funzione.
    a presto!
    cr

    Piace a 1 persona

    1. La procedure è semplice:
      1. apri con un editor di testo (es: Notepad++) il file ‘select_by_relationship_plugin.py’;
      2. le opzioni si trovano dalla riga 200 alla 203, dovrebbero essere commentate, cioè con un #;
      3. cancella il cancelletto nelle righe che ti interessano: es: nella 200,201 e 202;
      4. salva il file e riavvia QGIS.

      PS: il file si trova nella cartella c:\Users\nomeutente\.qgis2\python\plugin\SelectByRelationShip

      "Mi piace"

  8. totòp !!
    ho provato, ci sono riuscito! grazie mille! Spesso mi comunica alcuni errori di phyton e l’originale selezione da “figlio a padre” non funziona con continuità. Credo siano effetti giustificabili nella fase di sperimentazione. Per adesso però, per quello che mi interessava, l’obiettivo è raggiunto! Grazie ancora e a presto!
    cr

    Piace a 1 persona

  9. Ciao Totò,
    sono ancora alle prese con le relazioni tra tabelle…

    ho 2 tabelle (A e B) di elementi vettoriali diversi.
    volevo chiedere se fosse possibile creare una azione di apertura della B, cliccando su un attributo (precedentemente definito) nella tabella A.
    ossia in poche parole creare un link che apra, non un file esterno es. jpg/pdf, ma direttamente le info degli attributi di un elemento contenuto in un’altra tabella.
    Grazie
    cr

    Piace a 1 persona

    1. Ciao,
      se definisci una relazione di progetto tra le tabelle A e B vedrai subito – in tabella attributi in modalità modulo – quello che chiedi.
      Se poi utilizzi l’icona con la ‘i’ (informazioni) al clic sugli elementi aprirà la tabella attributi con le info che vuoi.

      "Mi piace"

  10. buongiorno, ho un problema probabilmente molto scemo. Sto lavorando a un progetto che necessita di relazioni uno a molti tra SHP e tabella CSV. Cosa che ho fatto in passato (su questo stesso progetto) senza alcuna difficoltà (e con molta soddisfazione). Ma adesso non ci riesco più. Ho installato l’ultima release di QGIS. Io carico come layer a testo delimitato (codifica UTF8) la mia tabella CSV e poi dalle proprietà del progetto creo la relazione usando come padre lo SHP e figlio il CSV. La relazione si crea, ma sembra finta, cioè non vedo in nessun modo le tabelle unite sullo SHP nel quale compare solo nella sezione Attributes form tra i widgets disponibili in Relazioni il nome della mia tabella CSV. Prima invece sono sicura che comparivano tutti i campi della tabella, e io potevo costruire un modulo di inserimento congiunto. Immagino che la soluzione sia banale … ma io non ne vengo a capo
    Grazie
    Ada

    Piace a 1 persona

  11. grazie Totò, anche a me funzionavano benissimo e avevo imparato a usare le relazioni uno a molti proprio dalle tue spiegazioni. Per questo non capisco cosa sia successo. È come se a livello di progetto non volesse salvare la relazione. Se io poi apro “Scopri relazioni” non ne vedo nessuna (ma invece su Proprietà progetto – relazioni c’è. Può essere qualcosa che ha a che vedere con il CSV?

    Piace a 1 persona

    1. Lo Scopri relazione funziona con i database (spatialite o postgis). Per potere risponderti dovrei poter utilizzare i tuoi dati; se puoi zippali e allegali al messaggio.

      "Mi piace"

      1. ti mando un estratto del progetto in cui credo ci sia tutto quello che serve. Nelle proprietà del progetto ci sono già le due relazioni uno-a-molti di cui avrei bisogno. E esattamente come le vedi … funzionavano. Poi ho aggiornato alla versione 3.4, ho modificato un po’ di nomi … insomma ho fatto delle operazioni che mi sembravano di puro maquillage e invece … non funziona più. Sono certa di aver fatto qualche scemenza, ma davvero non ne vengo a capo

        grazie

        "Mi piace"

  12. Buongiorno, ho creato una relazione uno a molti tra due shapefile (puntuale – padre e poligonale – figlio) e vorrei sapere se è possibile esportare tutto in CSV oppure se è una semplice relazione virtuale utilizzabile solo in QGis. Grazie anticipatamente per la risposta.

    Piace a 1 persona

    1. Buongiorno,
      no, non è possibile esportarla.
      La relazione è definita a livello di progetto e attualmente da QGIS non è possibile esportare le due tabelle messe in relazione.

      "Mi piace"

  13. Buongiorno, prima di tutto grazie per quello che fai e complimenti per gli articoli sempre interessanti. Ti scrivo per questo, ho creato una relazione uno a molti tra due shapefile (puntuale – padre e lineare – figlio) poi ho creato un atlante nella quale mi compare la tabella lato figlio in funzione di un valore assunta dal lato padre, ora vorrei sapere se è possibile relazionare un’immagine ( freccia) alla tabella di relazione. Mi spiego un po meglio è possibile attivare o disattivare una freccia quando la tabella in relazione assume determinati valori? Grazie anticipatamente per la risposta

    Piace a 1 persona

    1. Ciao Marco e grazie per i complimenti.
      Purtroppo non ho capito bene: dove vuoi attivare la freccia?? tabella assume determinati valori??
      Se puoi, allega dati e progetto e un video spiegazione.

      "Mi piace"

  14. Buongiorno Totò, ho un problema che non riesco a risolvere con questo plugin.
    Installato il plugin, sia quando creo una relazione sia quando provo ad accendere e spegnere il plugin mi esce questo errore:

    An error has occurred while executing Python code:
    RuntimeError: wrapped C/C++ object of type CheckableComboBox has been deleted
    Traceback (most recent call last):
    File “C:/Users/paolo/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins\SelectByRelationship\select_by_relationship_plugin.py”, line 200, in populateComboRelations
    self.comboRelations.clear()
    RuntimeError: wrapped C/C++ object of type CheckableComboBox has been deleted

    Python version: 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)]
    QGIS version: 3.16.3-Hannover Hannover, 94ac9f21b8

    Python Path:
    C:/Users/paolo/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins\leastcostpath
    C:/PROGRA~1/QGIS3~1.16/apps/qgis/./python
    C:/Users/paolo/AppData/Roaming/QGIS/QGIS3\profiles\default/python
    C:/Users/paolo/AppData/Roaming/QGIS/QGIS3\profiles\default/python/plugins
    C:/PROGRA~1/QGIS3~1.16/apps/qgis/./python/plugins
    C:\PROGRA~1\QGIS3~1.16\apps\Python37
    C:\PROGRA~1\QGIS3~1.16\apps\Python37\Scripts
    C:\Program Files\QGIS 3.16\bin\python37.zip
    C:\PROGRA~1\QGIS3~1.16\apps\Python37\DLLs
    C:\PROGRA~1\QGIS3~1.16\apps\Python37\lib
    C:\Program Files\QGIS 3.16\bin
    C:\PROGRA~1\QGIS3~1.16\apps\Python37\lib\site-packages
    C:\PROGRA~1\QGIS3~1.16\apps\Python37\lib\site-packages\win32
    C:\PROGRA~1\QGIS3~1.16\apps\Python37\lib\site-packages\win32\lib
    C:\PROGRA~1\QGIS3~1.16\apps\Python37\lib\site-packages\Pythonwin
    C:/Users/paolo/AppData/Roaming/QGIS/QGIS3\profiles\default/python
    C:\Users\paolo\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins\mmqgis/forms

    e, in sintesi, il plugin non mi funziona! attivo il plugin, seleziono la relazione, ma quando vado a selezionare i record nella tabella figlio i corrispettivi nella tabella padre non si selezionano.

    Come posso risolvere?
    Grazie infinite
    Paolo

    Piace a 1 persona

  15. Buongiorno,
    Ho creato una relazione uno a molti tra uno shapefile (padre) e una tabella excel (figlio). Volevo chiedere se esiste un modo per far comparire le informazioni contenute nei moduli del layer padre anche all’interno della finestra popup della web map creata con qgis2web. Attualmente quando esporto una mappa web e clicco su un poligono mi mostra solo le info della tabella attributi ma non quella dei moduli. Grazie mille per la disponibilità

    "Mi piace"

Lascia un commento

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