Le relazioni in QGIS consentono di sviluppare dei casi d’uso applicativi molto interessanti; una delle ragioni di questo articolo è quella di contribuire alla diffusione della conoscenza del tema.
Il caso d’uso: la pubblica illuminazione (PI) e la loro manutenzione
Immaginate di essere i gestori della PI della vostra città e di volere utilizzare QGIS (insieme ad altri strumenti) per farlo. Avete quindi un layer con tutti i punti luce (e i relativi attributi) e la necessità di associare a questo il dataset delle manutenzioni che vengono realizzate nei vari elementi della PI (per esempio tener traccia della sostituzione delle lampade) ed infine stampare un report (atlante).
A seguire vedremo come gestire la cosa con QGIS Lyon, le relazioni e con il comodo supporto delle maschere di input personalizzabili.
Chiavi e relazione
Per mettere in relazione il dataset delle manutenzioni con quello dei punti luce, potrete usare il meccanismo classico delle chiavi.
Il layer dei punti luce sarà caratterizzato da un campo con un codice identificativo numerico univoco per ogni punto luce – la chiave primaria – denominato nell’esempio di questo post “id_pi”.
Il database delle manutenzioni – che è una semplice tabella senza alcun attributo spaziale (preferibilmente una tabella .dbf) – è composto dai campi “id_m”, “data_m”, “ditta”, “lampada”, “potenza”, “note”; aggiungeremo un campo che contenga il codice identificativo del punto luce a cui la manutenzione è riferita. Questo campo farà da chiave esterna e si chiamerà “ce_id_pi”.
Il nostro modello prevede, per semplicità, che ad ogni punto luce (una sola lampada) sia possibile associare una o più manutenzioni; una classica relazione 1:N (uno a molti) impostata sulle due chiavi numeriche di cui sopra.
Layer
Il layer dei punti luce ha la struttura sottostante, in cui sono stati introdotti dei campi per raccogliere i dati.

Quello delle manutenzioni conterrà un codice identificativo numerico univoco per ogni elemento, un campo in cui inserire la data dell’intervento di manutenzione, il nome della ditta incaricata, il tipo di lampada sostituita e la potenza, un campo per le note.

Definire la relazione
La relazione tra i due dataset si definisce a livello di “Proprietà di progetto”. Aperto il tab Relazioni si farà click su “Aggiungi relazione” e si imposteranno i seguenti parametri (vedi articolo QGIS RELAZIONI):
- Nome, per dare un nome alla relazione;
- Layer di riferimento (figlio), per il nome del layer che contiene la chiave esterna;
- Campo di riferimento, per il nome della chiave esterna;
- Layer di riferimento (Padre), per il nome del layer che contiene la chiave primaria;
- Campo di riferimento, per il nome della chiave primaria;
- Id, che viene usato internamente da QGIS, deve essere univoco e fa da indice della tabella di relazione tra chiave primaria e chiave esterna (può essere lascio vuoto).

A relazione definita, questa apparirà nella finestra di dialogo:
Moduli
Una volta definita la relazione, se ne avrà evidenza anche nel modulo di inserimento/modifica degli attributi del dataset del layer punti luce. La visualizzazione a moduli in QGIS è molto utile per alcuni task di verifica ed inserimento dei dati, ed è molto personalizzabile.
La tabella della manutenzioni sarà visibile in un widget del modulo del punto luce, e sopra questa saranno visibili sei pulsanti:
- la matita, per attivare la modifica della tabella delle manutenzioni;
- il “+” per aggiungere un nuovo record alla tabella, che di default verrà associato all’elemento attivo del layer “punti_luce”;
- il ‘floppy‘, per salvare le modifiche;
- il tasto “x” per cancellare il record selezionato della tabella “manutenzioni”;
- il tasto “catenella” che aprirà una nuova finestra di dialogo con il quale associare qualsiasi manutenzione presente alla strada corrente;
- il tasto “rompi catenella” che rimuoverà l’associazione tra la manutenzione selezionata e la strada corrente;
- ed infine, a destra, ci sono due pulsanti per passare dalla vista “tabella” a quella modulo.
Anche per il dataset delle manutenzioni è possibile attivare il modulo di inserimento/modifica degli attributi, in modo che dia conto visivamente della relazione con il layer della PI.
A partire dalle proprietà del layer manutenzioni, bisognerà modificare il widget del campo che fa da chiave esterna.

E scegliere come tipo di widget “Riferimento della relazione”, utilizzando i parametri visibili nella figura sottostante (in condizioni normali i parametri sono presenti già di default, bisogna solo attivare ‘mostra modulo incorporato’):

Una volta scelto questo speciale widget, sarà possibile leggere la relazione tra i due layer anche nel modulo delle manutenzioni:
Report delle manutenzioni con un atlante
La cosa diventa parecchio interessante nel momento in cui si vuole generare un report della manutenzione, soprattutto dopo mesi o anni di lavoro.
La prima cosa da definire è il ‘vettore di copertura’ perchè da questo dipende il numero di pagine dell’atlante. Nel nostro caso (molto semplificato) è spontaneo definire come ‘vettore di copertura’ il layer punti luce.

segue creazione dell’atlante:

nel compositore di stampe è possibile inserire la tabella degli attributi sia del vettore di copertura (layer punti luce) sia la tabella manutenzione messa in relazione (per maggiori dettagli su come creare un atlante vedasi articolo ‘QGIS: COME CREARE UN ATLAS‘).
Note finali (riferimenti, file esempio e video demo)
Questo articolo è una copia riadattata e ampliata di questo di Andrea Borruso. Il suo articolo è del 2014 e realizzato con QGIS 2.2, ma la sostanza è la stessa. Il post di Andrea mi è sembrato una grande perla e ho creduto utile clonarlo e aggiungere la parte dei report.
Da qui potrete scaricare un file di progetto d’esempio basato su QGIS 2.12.1 e come formato dati :shapefile puntuale, tabella manutenzione dbf. Qui un piccolo video dimostrativo.
Nota finale: il caso d’uso descritto è molto semplificato e non tiene conto di tutte i requisiti di un’applicazione complessa come la gestione di una PI comunale. Questo esempio è stato sviluppato utilizzando un semplice shapefile puntuale e una tabella (.dbf), entrambi i layer sono i meno indicati per la gestione di tale problematica.
Ciao Totò, il tuo blog è sempre una miniera di informazioni e consigli su QGis e dintorni! Grazie mille per la tua eccellente capacità e volontà di condivisione.
Questo post mi è stato molto utile però volendo impostare un progetto sfruttando al meglio relazioni e widget ma utilizzando Spatialite sono un po’ in difficoltà. Sicuramente anche perchè con Spatialite sto facendo i primi passi ora. Che tu sappia ci sono mica risorse web anche in inglese che mi possano aiutare? Io non ne ho trovate…
grazie ancora
luca
"Mi piace"Piace a 1 persona
Cioa e grazie per il commento, ti allego una valida risorsa scritta direttamente dal papà di SPatiaLite:
Fai clic per accedere a SpatiaLite-Cookbook_ITA.pdf
"Mi piace""Mi piace"
Per farla breve, il punto cui non riesco a trovare risposta, e che non è trattato nel cookbook, è come modificare le tabelle di attributi che sono in relazione con un layer direttamente da qgis sfruttando le relazioni, le maschere di inserimento. Ovviamente utilizzando oggetti di un db spatialite
"Mi piace""Mi piace"
un esempio potrebbe farmi capire meglio il tuo problema. 😉
"Mi piace""Mi piace"
Ciao, premetto che trovo molto utile tutto ciò che fai, quello che ti volevo chiedere è possibile mettere in relazione due campi?
Esempio
campo id – mappa valori = a,b,c,d
campo x – se id = a allora mappa valori e,f,g / se id = b allora mappa valori h,i,l
Grazie un saluto
Marco
"Mi piace""Mi piace"
Le relazioni sono tra tabelle e usano i campi con uguali valori.
"Mi piace""Mi piace"
Ottimo. Chiarissimo. Utilissimo (particolarmente l’Atlante con le tabelle padre e figlia che mutano al mutare della pagina, …sbalorditivo per semplicità d’uso e risultato). P.S. il link al file di progetto non è più attivo …ma non fa nulla …questo tutorial è comunque chiarissimo.
"Mi piace"Piace a 1 persona
Grazie Marco.
"Mi piace""Mi piace"
Ciao! Richiesta suggerimento…non riesco a collegare foto velocemente a punti di rilievo. Mi spiego: ho dei punti di rilievo a cui devo associare 3 foto ciascuno. Devo farlo per un rilievo di circa 700 punti, quindi per un totale di circa 2000 foto….esiste un modo veloce per collegare ad ogni punto le sue 3 foto senza selezionarle una ad una? Esiste un modo tipo fare una selezione multipla o “trascinarle” da qualche parte all’interno del punto di rilievo interessato? Ho iniziato selezionandole e caricandole una ad una ma ci metto ore solo per fare 30 foto! Ti ringrazio in anticipo. Buon lavoro! Luca
"Mi piace"Piace a 1 persona
Ciao Luca,
in che relazione sono i punti e le foto??
nel path della foto hai un riferimento al punto??
"Mi piace""Mi piace"
Facciamo un passo indietro perché non sono molto “ferrato”….ho un rilievo di 800 pt a cui devo associare 3/4 foto a punto. Come posso fare velocemente? Ho visto il tuo tutorial “maschera inserimento dati (foto)”, ma su quel video non trovo risposta al mio quesito perché le foto sono già inserite. Non vorrei doverne clikkare una ad una, ma vorrei magari selezionarle a gruppi, “smanettando” il meno possibile ogni volta. In pratica è la fase di inserimento che mi risulta “lenta”!. Grazie
"Mi piace""Mi piace"
Ciao, ho un dubbio. Quando lavoro con i moduli, ad esempio con valori predefiniti utilizzando “mappa valori”, queste informazioni dove vengono salvate? Nello shape o nel progetto? Mi è capitato di importare lo shapefile in altri progetti e perdere tutte le visualizzazioni di maschera e di inserimento “predefinito”. Grazie mille.
Federico
"Mi piace"Piace a 1 persona
Ciao Federico,
relazioni e widget (mappa valori) vengono memorizzate nel progetto.
🙂
"Mi piace""Mi piace"
Buongiorno,
sonno un neofita di qgis; ho nstallato la versione 3.x ma non riesco a trovre il modo di modificare il widget che non mi comprae nei campi del layer? Dove sbagko? grazie
"Mi piace""Mi piace"
Ciao Antonio,
l’articolo è di 4 anni fa, le interfacce sono leggermente diverse ma il concetto di base è lo stesso.
LE indicazioni che mi hai dato non sono sufficienti per poterti dare altre indicazioni.
"Mi piace""Mi piace"
Ciao Totò, grazie per i tuoi esempi!. Trovo le tue indicazioni sempre molto utili e mi danno anche spunti di riflessione. Pensavo, nella fattispecie, se invece volessi fare in modo di compilare i campi dello shape padre leggendo le info dai campi del file figlio (medesimo nome campi in file CSV)? Ovvero la tabella figlio contiene i valori mentre lo shape padre ha i campi vuoti. Legandoli attraverso la chiave primaria, selezionabile sullo shape padre, sarebbe possibile autocompilare i campi. Spero di essermi espresso correttamente.
"Mi piace"Piace a 1 persona
Ciao,
sei stato chiarissimo.
Osservazione, essendo la relazione 1:m, quale degli m valori vorresti prendere per popolare il campo nel lato padre?? oppure vorresti concatenarli??
"Mi piace""Mi piace"
Forse è proprio la relazione 1:m il problema. Io ad ogni nodo dello shape padre devo associare una combinazione di valori già stabilita che si trova nella tabella CSV figlio sotto lo stesso Pkey. Esempio: Nello shape padre ho un campo Pkey e 3 campi rappresentanti gli strati di terreno vuoti. Nella tabella csv ho la chiave Pkey e i 3 campi compilati (argilla, sabbia, ghiaia; ghiaia, sabbia, argilla; etc) per diverse combinazioni. Ad ogni combinazione corrisponde una pkey differente. La mia idea era quella di operare sullo shape dei nodi inserendo il valore della combinazione preferita (pkey) ed avere automaticamente ricopiati i valori in ognuno dei campi per quel nodo…..E procedere cosi con altri nodi assegnando combinazioni diverse ma già precompilate nel CSV figlio. Grazie per l’interesse dimostrato.
"Mi piace"Piace a 1 persona
P.S. in realtà l’ho già fatto con un semplice join…… ma la tendenza è quella di complicarmi le cose… o di impararne di nuove (meglio)
"Mi piace"Piace a 1 persona
Buongiorno Totò, utilizzo spesso delle maschere di inserimento applicate su .gpkg per gestire delle tabelle di punti ma non sono mai riuscito a capire bene un aspetto che mi piacerebbe condividere con te.
Questi punti sono dei punti dove scelgo di andare a fare delle misure, temporanee o fisse. in maschera utilizzo la casella di controllo (0,1) per inserire la spunta sulla MIS_TEMP o MIS_FISSA. Per le due tipologie di misura ho dei campi dove indico i misuratori e altre caratteristiche. Vorrei che modificando la spunta, passando da 1 a 0 i campi che dipendono da effettuare o meno questa misura si cancellino.
Cioè vorrei che i campi dove ho le caratteristiche dei misuratori temporanei si cancellino (compaia NULL ) quando levo la spunta in maschera.
Ho provato nel menù predefiniti ad impostare la relazione
CASE
WHEN MIS_FISSA = ‘0’ THEN ‘NULL’
END
(Applica valore predefinito all’aggiornamento)
ma anche se ho la spunta inserita al salvataggio il campo viene cancellato comunque.
Sapresti indicarmi se è possibile compiere questa azione e come.
Ti ringrazio per la risposta e per tutti i tuoi post
"Mi piace"Piace a 1 persona
Ciao Francesco,
purtroppo non riesco a capire quello che vuoi fare.
Vienimi a trovare nel mio canale Telegram
https://t.me/pigrecoinfinito
"Mi piace""Mi piace"
RISOLTO:
Campo AT_MIS_F popolato con 0 oppure 1 (intero)
Campo MF_GRAND popolato attraverso mappa valori contenente anche il valore NULL
L’obiettivo era quello di cancellare il contenuto del campo MF_GRAND una volta che AT_MIS_F assumeva il valore di 0 (e non più 1), indipendentemente dal suo contenuto (assegnato con mappa valori)
Questo è stato possibile attraverso l’istruzione suggerita da Totò
CASE
WHEN AT_MIS_F = ‘0’ THEN NULL
ELSE MF_GRAND
END
Inserita su predefiniti e mettendo la spunta su “Applica valore predefinito all’aggiornamento”
Grazie per la tempestività della risposta e complimenti!
"Mi piace"Piace a 1 persona
Grazie e buon lavoro
"Mi piace""Mi piace"
Buongiorno,
voleva sapere se era possibile stampare l’intera tabella attributi come report multipagina
"Mi piace"Piace a 1 persona
Ciao,
non ho mai provato, ma secondo me si può fare. 😉
"Mi piace""Mi piace"