QGIS, RELAZIONI, MODULI, WIDGET E REPORT

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.

shp_punti_luce
definizione dello shapefile punti luce

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.

tab_manutenzione
definizione tabella manutenzione.dbf

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).
def_relaz
definizione relazione

A relazione definita, questa apparirà nella finestra di dialogo:

def_relaz_2

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.

relaz_2

La tabella della manutenzioni sarà visibile in un widget del modulo del punto luce, e sopra questa saranno visibili sei pulsanti:

  1. la matita, per attivare la modifica della tabella delle manutenzioni;
  2. il “+” per aggiungere un nuovo record alla tabella, che di default verrà associato all’elemento attivo del layer “punti_luce”;
  3. il ‘floppy‘, per salvare le modifiche;
  4. il tasto “x” per cancellare il record selezionato della tabella “manutenzioni”;
  5. il tasto “catenella” che aprirà una nuova finestra di dialogo con il quale associare qualsiasi manutenzione presente alla strada corrente;
  6. il tasto “rompi catenella” che rimuoverà l’associazione tra la manutenzione selezionata e la strada corrente;
  7. 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.

manut_2
screenshot proprietà layer manutenzioni

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’):

attiva_modulo
screenshot proprietà widget manutenzioni

Una volta scelto questo speciale widget, sarà possibile leggere la relazione tra i due layer anche nel modulo delle manutenzioni:

manut_3

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.

CANVAS
screenshot con #4 punti luce

segue creazione dell’atlante:

atlas
screenshot 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.


27 pensieri su “QGIS, RELAZIONI, MODULI, WIDGET E REPORT

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

    Piace a 1 persona

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

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

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

    Piace a 1 persona

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

    Piace a 1 persona

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

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

    Piace a 1 persona

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

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

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

    Piace a 1 persona

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

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

        Piace a 1 persona

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

    Piace a 1 persona

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

        Piace a 1 persona

Lascia un commento

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