Importante

La traduzione è uno sforzo comunitario a cui puoi unirti. Questa pagina è attualmente tradotta al 100.00%.

16.4. Collegamento e Gestione Dati Tra Layer

La capacità di collegare dati di layer diversi è uno dei compiti di un software GIS. Tale connessione può essere basata sulla relazione spaziale tra gli elementi o su loro attributi condivisi. QGIS fornisce strumenti per gestire tutte queste associazioni, come ad esempio:

  • Algoritmi di processing che possono creare un nuovo layer come risultato della connessione, ovvero Unisci attributi per posizione, Unisci attributi dal vettore più vicino, Unisci attributi secondo il valore del campo, …

  • Query SQL per creare un nuovo layer dal DB Manager o come virtual layer.

  • Joins properties o relations settings che estendono temporaneamente gli attributi degli elementi di un dato layer, con quelli degli elementi di un altro layer in base a uno o più attributi corrispondenti.

    I join e le relazioni sono concetti tecnici presi in prestito dai database per ottenere il meglio dai dati memorizzati nelle tabelle, combinando i loro contenuti. L’idea è che gli elementi (righe) di diversi layer (tabelle) possano essere associati l’uno all’altro. Il numero di righe corrispondenti può essere di qualsiasi valore (zero, uno, molti).

16.4.1. Unire elementi tra due layer

I Join in QGIS ti permettono di associare gli elementi del layer corrente agli elementi di un altro layer vettoriale caricato. Non importa se sono elementi spaziali e il tipo di geometria. Il join si basa su un attributo condiviso dai layer, in una relazione uno-a-uno.

Per creare un join su un layer (identificato di seguito come target layer):

  1. Vai alla scheda del layer :menuselection: Proprietà –> join Join

  2. Fai clic sul pulsante symbologyAdd Aggiungi nuova unione. Appare la finestra di dialogo Aggiungi Vettore da Unire.

  3. Seleziona il Vettore di join che vuoi collegare con il layer vettoriale di destinazione

  4. Specifica il Campo unione (dal vettore di join) e il Campo destinazione` (dal target layer). Questi sono i campi che vengono usati per trovare elementi corrispondenti in entrambi i layer, quindi devono avere valori in comune.

  5. Premi OK e un riassunto dei parametri selezionati viene aggiunto al pannello Join.

../../../_images/join_attributes.png

Fig. 16.101 Unisci una tabella di attributi ad un layer vettoriale

I passaggi sopra descritti creano un join in cui TUTTI gli attributi del primo elemento di corrispondenza nel livello di join vengono aggiunti all’elemento del livello di destinazione. La logica seguente viene utilizzata per accoppiare elementi durante un processo di unione:

  • Vengono restituite tutti gli elementi del layer di destinazione, indipendentemente dal fatto che abbiano una corrispondenza.

  • Se il campo di destinazione contiene valori duplicati, a questi elementi viene assegnato la stesso elemento proveniente dal layer di unione.

  • Se il campo di unione contiene valori di corrispondenza duplicati, viene selezionato solo il primo elemento individuato.

Nota

I join in QGIS si basano sulla corrispondenza di un singolo campo, quindi nella maggior parte dei casi è necessario assicurarsi che i valori dei campi corrispondenti siano univoci.

QGIS fornisce altre opzioni per regolare il join:

  • checkbox Cache unione layer in memoria: permette di mettere in cache in memoria i valori (senza geometrie) del layer unito per velocizzare le ricerche.

  • ||unchecked| Crea un indice nel campo unito per velocizzare le ricerche

  • unchecked Modulo Dinamico: ti aiuta a sincronizzare i campi di unione al volo, secondo il Campo destinazione. In questo modo, anche i vincoli per i campi di unione sono aggiornati correttamente. Si noti che è disattivato per impostazione predefinita perché può richiedere molto tempo se si hanno molte funzioni o una miriade di join.

  • Se il layer di destinazione è modificabile, allora alcune icone saranno visualizzate nella tabella degli attributi accanto ai campi, per informare sul loro stato:

    • joinNotEditable: il layer di join non è configurato per essere modificabile. Se vuoi essere in grado di modificare le geometrie in join dalla tabella degli attributi di destinazione, allora devi spuntare l’opzione checkbox Layer di unione modificabile.

    • joinedLayerNotEditable: il layer di join è ben configurato per essere modificabile, ma il suo stato attuale è in sola lettura.

    • joinHasNotUpsertOnEdit: il layer di join è modificabile, ma i meccanismi di sincronizzazione non sono attivati. Se vuoi aggiungere automaticamente un elemento nel layer di unione quando viene creato un elemento nel layer di destinazione, devi selezionare l’opzione checkbox Inserimento in modifica. Simmetricamente, l’opzione checkbox Elimina a cascata può essere attivata se vuoi eliminare automaticamente gli elementi di unione.

  • unchecked Campi uniti: invece di aggiungere tutti i campi del layer unito, puoi specificare un sottoinsieme.

  • unchecked Prefisso del nome del campo personalizzato per i campi uniti, per evitare la collisione dei nomi

16.4.2. Impostazione relazioni tra più layer

A differenza delle unioni, che definiscono un collegamento uno-a-uno tra elementi di due layer, le relazioni ti permettono di creare interconnessioni tra più elementi di due o più layer. Le relazioni sono impostazioni a livello di progetto e si impostano nella scheda Progetto ► Proprietà ► relations Relazioni. Da qui puoi:

  • symbologyAdd Aggiungi relazione il cui tipo può essere:

    Nota

    Non esiste ancora un modo semplice per modificare una relazione non polimorfa una volta creata. Solo il nome può essere modificato con un doppio clic. Per tutti gli altri parametri di tale relazione è necessario rimuoverla e ricrearla.

  • symbologyAdd Scopri Relazioni: QGIS è in grado di scoprire le relazioni esistenti dai formati di database supportati (PostgreSQL, GeoPackage, ESRI File Geodatabase, …). Questo può essere un buon modo per facilitare la definizione delle relazioni.

  • symbologyRemove Rimuovi Relazione

../../../_images/project_relations.png

Fig. 16.102 Scheda Relazioni

16.4.2.1. Relazioni uno a molti (1-N)

Ad esempio, abbiamo un layer con tutte le regioni dell’Alaska (poligono) che fornisce alcuni attributi sul nome e sul tipo di regione e un id univoco (che funge da chiave primaria).

Poi hai caricato un altro layer di punti o una tabella con informazioni sugli aeroporti che si trovano nelle regioni e desideri anche tenere traccia di questi. Se vuoi aggiungerli al layer regioni, devi creare rapporti uno a molti utilizzando chiavi esterne, in quanto in molte regioni esistono più aeroporti.

../../../_images/regions_with_airports.png

Fig. 16.103 Regione dell’Alaska con areoporti

Layer e chiavi

QGIS non fa differenza tra una tabella e un layer vettoriale. In pratica, un layer vettoriale è una tabella con una geometria. Quindi puoi aggiungere la tua tabella nello steeso modo in cuiaggiungi un layer vettoriale. Per mostrare la relazione 1-n, puoi caricare i layer regions e airports contenuti nel dataset di esempio. In pratica, ogni aeroporto appartiene esattamente a una regione, mentre ogni regione può avere un numero qualsiasi di aeroporti (una tipica relazione uno a molti).

che ha un campo chiave esterna (fk_region) per il layer regions.

Oltre agli attributi che descrivono gli aeroporti, il layer aiporti ha un altro campo fk_region che agisce come chiave esterna (se si dispone di un database, probabilmente si vorrà definire un vincolo su di esso). Questo campo fk_region conterrà sempre un id di una regione. Può essere visto come un puntatore alla regione a cui appartiene.

Tutto ciò che devi fare è indicare a QGIS la relazione tra i layer in modo da poter progettare un modulo di modifica personalizzato per l’editing e QGIS si occupa della configurazione. Funziona con diversi fonti dati (quindi lo puoi utilizzare anche con file shape e csv).

Definire relazioni 1-N

La prima cosa da fare è far definire in QGIS le relazioni tra i livelli. Questo lo puoi fare con Progetto->Proprietà…. Apri la scheda Relazioni e fai clic su symbologyAdd Aggiungi relazione.

  • Nome sarà usato come titolo. Dovrebbe essere una stringa comprensibile che descriva a cosa serve la relazione. In questo caso la chiameremo airport_relation.

  • Layer di riferimento (genitore) considerato anche come layer genitore, è quello con la chiave primaria, quindi qui è il layer regions. Devi definire la chiave primaria del layer di riferimento, ch in questo caso è ID.

  • Il layer referente, considerato come layer figlio è quello con il campo chiave che punta sul layer padre. In questo caso il layer airports e dovrai aggiungere un campo di referimento chiamato fk_region.

    Nota

    A volte hai bisogno di avere più di un singolo campo per identificare in modo univoco gli elementi di un layer. La creazione di una relazione con un layer di questo tipo richiede una chiave composita, cioè più di una singola coppia di campi corrispondenti. Usa il pulsante symbologyAdd Aggiungi una nuova coppia di campi come parte di una chiave esterna composita per aggiungere tutte le coppie necessarie.

  • id sarà utilizzato per scopi interni e deve essere univoco. Ti potrebbe essere necessario per creare custom forms. Se lo lasci vuoto, verrà generato automaticamente per te, ma puoi assegnare un nome per avere una più chiara modalità di gestione.

  • Forza della relazione imposta la forza della relazione tra il livello genitore e il livello figlio. Il tipo predefinito Associazione significa che il livello genitore è semplicemente collegato a quello figlio, mentre il tipo Composizione consente di duplicare anche gli elementi figli quando si duplicano quelli genitori e quando si cancella un elemento vengono cancellati anche i figli, con conseguente cascata su tutti i livelli (significa che vengono cancellati anche i figli dei figli di…).

../../../_images/regions_airports_mapping.png

Fig. 16.104 Aggiungi una relazione tra i layer regions e airports

Dalla scheda Relazioni, puoi anche premere il pulsante symbologyAdd Scopri Relazioni per recuperare le relazioni disponibili dai provider dei layer caricati. Questo è possibile per i layer memorizzati in provider di dati come PostgreSQL o SpatiaLite.

Moduli per relazioni 1-N

Ora che QGIS conosce la relazione, la utilizzerà per migliorare i moduli che genera. Poiché non abbiamo modificato il metodo di formulazione predefinito (autogenerato), verrà semplicemente aggiunto un nuovo widget nel nostro modulo. Selezioniamo quindi la regione del layer nella legenda e utilizziamo lo strumento di identificazione. A seconda delle impostazioni, il modulo potrebbe aprirsi direttamente o si dovrà scegliere di aprirlo nella finestra di dialogo dell’identificazione, alla voce azioni.

../../../_images/airport_relation_dataview.png

Fig. 16.105 Finestra di dialogo identificazione relazione regioni con aeroporti

Come puoi vedere, gli aeroporti assegnati a questa particolare regione vengono tutti mostrati in una tabella. E ci sono anche alcuni pulsanti disponibili. Guardiamoli brevemente

  • Il pulsante toggleEditing serve per attivare la modalità di modifica. Tieni presente che imposta la modalità di modifica per il layer airports, anche se siamo nel modulo di un elemento del layer regions. Ma la tabella rappresenta le geometrie del layer airports.

  • Il pulsante saveEdits serve a salvare tutte le modifiche nel livello figlio (airport).

  • Il pulsante capturePoint consente di digitalizzare la geometria dell’aeroporto nella area di disegno della mappa e assegna il nuovo elemento alla regione corrente per impostazione predefinita. L’icona cambia a seconda del tipo di geometria.

  • Il pulsante newTableRow aggiunge un nuovo record alla tabella degli attributi del layer airport e assegna il nuovo elemento alla regione corrente per impostazione predefinita. La geometria può essere disegnata successivamente con lo strumento di digitalizzazione Aggiungi parte.

  • Il pulsante duplicateFeature consente di copiare e incollare una o più elementi figli all’interno del livello figlio. Queste possono essere successivamente assegnate a un altro elemento genitore o modificarne gli attributi.

  • Il pulsante deleteSelectedFeatures cancella definitivamente l’aeroporto o gli aeroporti selezionati.

  • Il simbolo link apre una nuova finestra di dialogo in cui puoi selezionare un aeroporto esistente che verrà assegnato alla regione corrente. Questo può essere utile se si è creato per sbaglio un aeroporto nella regione sbagliata.

  • Il simbolo unlink scollega l’aeroporto(i) selezionato(i) dalla regione corrente, lasciandolo effettivamente non assegnato (la chiave straniera è impostata a NULL).

  • Con il pulsante zoomToSelected puoi ingrandire la mappa sulla geometria figlia selezionata.

  • I due pulsanti formView e openTable a destra permettono di scegliere tra la table view and form view <attribute_table_view>` delle relative funzioni figlio.

Se utilizzi il Drag and Drop Designer per l’elemento regions, puoi selezionare gli strumenti disponibili. Puoi anche decidere se aprire un nuovo modulo quando viene aggiunta un nuovo elemento, usando l’opzione Forza occultamento del modulo quando si aggiunge un elemento. Tieni presente che questa opzione implica che gli attributi non nulli devono assumere un valore predefinito valido per funzionare correttamente.

../../../_images/airport_relation_formproperties.png

Fig. 16.106 Drag and Drop Designer per configurare gli strumenti di relazione regions-airports

Nell’esempio precedente il layer ha delle geometrie (quindi non è solo una tabella alfanumerica) quindi i passi precedenti creeranno una voce nella tabella degli attributi del layer che non ha alcuna caratteristica geometrica corrispondente. Per aggiungere la geometria:

  1. Scegli openTable Apri tabella attributi per il layer.

  2. Seleziona il record che è stato aggiunto in precedenza all’interno del modulo per la geometria del layer selezionato.

  3. Utilizza lo strumento di digitalizzazione addPart Aggiungi Parte per collegare una geometria al record della tabella degli attributi selezionata.

Se lavori sulla tabella dell’aeroporto, il widget Relation Reference viene automaticamente impostato per il campo fk_region (quello usato per creare la relazione), vedi Relation Reference widget.

Nel modulo aeroporto vedrai il pulsante formView sul lato destro del campo fk_region: se clicchi sul pulsante si aprirà il modulo del layer regione. Questo widget ti permette di aprire facilmente e rapidamente i moduli delle geometrie padri collegate.

../../../_images/airport_attributes.png

Fig. 16.107 Finestra di dialogo identificazione aeroporti in relazione con regioni

Il widget Relation Reference ha anche un’opzione per incorporare il modulo del layer genitore all’interno di quello figlio. È disponibile nel menu Proprietà ► Attributi Modulo del layer airport: seleziona il campo fk_region e attiva l’opzione Mostra modulo incorporato.

Se ora guardi la finestra di dialogo degli elementi, vedrai che il modulo della regione è incorporato nel modulo degli aeroporti e avrà anche una casella combinata che consente di assegnare l’aeroporto corrente a un’altra regione.

../../../_images/airport_attributes_expanded.png

Inoltre se attivi la modalità di modifica del layer airport, il campo fk_region ha anche una funzione di autocompletamento: mentre scrivi vedrai tutti i valori del campo id del layer region. Qui è possibile digitalizzare un poligono per il layer region usando il pulsante symbologyAdd se hai scelto l’opzione Consenti l'aggiunta di nuovi elementi nel menu Proprietà ► Modulo attributi del layer airport.

Il layer figlio può anche essere usato nello strumento Seleziona Elementi per Valore per selezionare gli elementi del layer padre in base agli attributi dei loro figli.

In Fig. 16.108, vengono selezionate tutte le regioni nelle quali l’altitudine media degli aeroporti è superiore a 500 metri sul livello del mare.

Scoprirai che nel modulo sono disponibili molte funzioni di aggregazione diverse.

../../../_images/relation_select_by_value.png

Fig. 16.108 Selezionare elementi genitori con i valori dei figli

16.4.2.2. Relazioni molti-a-molti (N-M)

Le relazioni N-M sono relazioni molti a molti rapporti tra due tabelle. Ad esempio, i layer airports e airlines: un aeroporto serve compagnie aeree e una compagnia aerea opera in diversi aeroporti.

Questo codice SQL crea le tre tabelle necessarie per una relazione N-M in uno schema PostgreSQL/PostGIS chiamato locations. Puoi eseguire il codice utilizzando il menu Database ► DB Manager… per PostGIS o strumenti esterni come pgAdmin. La tabella aeroporti contiene il layer airports e la tabella compagnie aeree contiene il layer airlines. In entrambe le tabelle vengono utilizzati pochi campi per chiarezza. La parte più complicata è la tabella airports_airlines. Serve per elencare tutte le compagnie aeree per tutti gli aeroporti (o viceversa). Questo tipo di tabella è noto come tabella pivot. I * vincoli* di questa tabella impongono che un aeroporto possa essere associato a una compagnia aerea solo se entrambi esistono già nei rispettivi layer.

CREATE SCHEMA locations;

CREATE TABLE locations.airports
(
   id serial NOT NULL,
   geom geometry(Point, 4326) NOT NULL,
   airport_name text NOT NULL,
   CONSTRAINT airports_pkey PRIMARY KEY (id)
);

CREATE INDEX airports_geom_idx ON locations.airports USING gist (geom);

CREATE TABLE locations.airlines
(
   id serial NOT NULL,
   geom geometry(Point, 4326) NOT NULL,
   airline_name text NOT NULL,
   CONSTRAINT airlines_pkey PRIMARY KEY (id)
);

CREATE INDEX airlines_geom_idx ON locations.airlines USING gist (geom);

CREATE TABLE locations.airports_airlines
(
   id serial NOT NULL,
   airport_fk integer NOT NULL,
   airline_fk integer NOT NULL,
   CONSTRAINT airports_airlines_pkey PRIMARY KEY (id),
   CONSTRAINT airports_airlines_airport_fk_fkey FOREIGN KEY (airport_fk)
      REFERENCES locations.airports (id)
      ON DELETE CASCADE
      ON UPDATE CASCADE
      DEFERRABLE INITIALLY DEFERRED,
   CONSTRAINT airports_airlines_airline_fk_fkey FOREIGN KEY (airline_fk)
      REFERENCES locations.airlines (id)
      ON DELETE CASCADE
      ON UPDATE CASCADE
      DEFERRABLE INITIALLY DEFERRED
 );

Al posto di PostgreSQL puoi anche utilizzare GeoPackage. In questo caso, le tre tabelle possono essere create manualmente utilizzando il menu Database ► DB Manager…. In GeoPackage non ci sono schemi, quindi il prefisso localizzazione non è necessario.

Chiavi esterne vincolanti nella tabella airports_airlines non possono essere creati usando Table ► Create Table…. o Table ► Edit Table…. pertanto devono essere creati usando Database ► SQL Window….. GeoPackage non supporta le istruzioni ADD CONSTRAINT quindi la tabella airports_airlines dovrebbe essere creata in due fasi:

  1. Imposta la tabella solo con il campo id usando Table ► Create Table…..

  2. Usando Database ► Finestra SQL…., digita ed esegui questo codice SQL:

    ALTER TABLE airports_airlines
       ADD COLUMN airport_fk INTEGER
       REFERENCES airports (id)
       ON DELETE CASCADE
       ON UPDATE CASCADE
       DEFERRABLE INITIALLY DEFERRED;
    
    ALTER TABLE airports_airlines
       ADD COLUMN airline_fk INTEGER
       REFERENCES airlines (id)
       ON DELETE CASCADE
       ON UPDATE CASCADE
       DEFERRABLE INITIALLY DEFERRED;
    

Poi, in QGIS, dovresti impostare due relazioni one-to-many relations come sopra spiegato:

  • una relazione tra la tabella airlines e la tabella pivot;

  • e una seconda tra la tabella airports e la tabella pivot.

Un modo più semplice per farlo (solo per PostgreSQL) è quello di utilizzare il comando Scopri relazioni in Progetto ► Proprietà ► Relazioni. QGIS leggerà automaticamente tutte le relazioni nel tuo database e devi solo selezionare le due che ti servono. Ricordati di caricare prima le tre tabelle del progetto QGIS.

../../../_images/airports_airlines_relation.png

Fig. 16.109 Relazioni e automatismi

Se vuoi rimuovere un airport o una airline, QGIS non rimuoverà i record associati nella tabella airports_airlines. Questo compito sarà fatto dal database se specifichiamo i corretti vincoli nella creazione della tabella pivot come nell’esempio corrente.

Nota

Combinare la relazione N-M con il gruppo di transazioni automatiche

Dovresti abilitare la modalità Crea automaticamente la transizione dei gruppi quando possibile in Project Proprietà ► Sorgente dei dati ► se stai lavorando in tale contesto. QGIS dovrebbe essere in grado di aggiungere o aggiornare le righe in tutte le tabelle (compagnie aeree, aeroporti e tabelle pivot).

Infine, dobbiamo selezionare la giusta cardinalità nel Proprietà… ► Modulo Attributi per i layer airports e airlines. Per il primo si deve scegliere l’opzione airlines (id) e per il secondo l’opzione airports (id).

../../../_images/airports_airlines_relation_formproperties.png

Fig. 16.110 Impostare il rapporto di cardinalità

Ora puoi associare un aeroporto con una compagnia aerea (o una compagnia aerea con un aeroporto) usando Add child feature o Link existing child feature nei sottomoduli. Un record verrà automaticamente inserito nella tabella airports_airlines.

../../../_images/add_airport_airline.png

Fig. 16.111 Relazioni N-M tra aeroporti e linee aeree

Nota

Utilizzo cardinalità Relazione molti ad uno

A volte nascondere la tabella pivot in una relazione N-M non è auspicabile. Soprattutto perché nella relazione ci sono attributi che possono avere un valore solo quando la relazione è stabilita. Se le tue tabelle hanno un campo geometrico, potrebbe essere interessante attivare l’opzione Individuazione sulla mappa (Proprietà del layer ► Modulo Attributi ► Widget disponibili ► Campi) per i campi chiave esterna della tabella pivot.

Nota

Chiave primaria tabella pivot

Evitare di utilizzare più campi nella chiave primaria di una tabella pivot. QGIS presuppone una sola chiave primaria, quindi un vincolo come constraint airports_airlines_pkey primary key (airport_fk, airline_fk) non funzionerà.

16.4.2.3. Relazioni Polimorfiche

L’obiettivo

Le relazioni polimorfiche sono un caso speciale di relazioni 1-N, in cui un singolo layer di riferimento (documento) contiene gli elementi di più layer referenziati. Ciò differisce dalle relazioni normali, che richiedono un layer di riferimento diverso per ogni layer referenziato. Un singolo layer di riferimento (documento) si ottiene aggiungendo una colonna aggiuntiva ``campo_layer”” nel layer di riferimento (documento) che memorizza le informazioni per identificare il layer di riferimento. Nella sua forma più semplice, il layer di riferimento (documento) inserirà semplicemente il nome del layer di riferimento in questo campo.

Per essere più precisi, una relazione polimorfa è un insieme di relazioni normali che hanno lo stesso layer di riferimento, ma con il layer di riferimento definito dinamicamente. L’impostazione polimorfica del layer viene risolta utilizzando un’espressione che deve corrispondere ad alcune proprietà del layer di riferimento, come il nome della tabella, l’id del layer, il nome del layer.

Immaginiamo di andare al parco e di voler fotografare le diverse specie di piante'' e ``animali'' che vediamo lì. Ogni pianta o animale ha più immagini associate, quindi se usassimo le normali relazioni 1:N per memorizzare le immagini, avremmo bisogno di due tabelle separate, ``immagini_animali e immagini_piante. Questo potrebbe non essere un problema per due tabelle, ma immaginiamo di voler fare immagini separate per funghi, uccelli, ecc.

Le relazioni polimorfiche risolvono questo problema, poiché tutte gli elementi di riferimento sono memorizzati nella stessa tabella documents. Per ogni elemento, il layer di riferimento è memorizzato nel campo referenced_layer e l’id dell’elemento di riferimento nel campo referenced_fk.

Definizione relazioni polimorfiche

Per prima cosa, si deve far conoscere a QGIS le relazioni polimorfiche tra i layer. Questo si fa in Progetto ► Proprietà…. Apri la scheda Relazioni e fai clic sulla piccola freccia rivolta verso il basso accanto al pulsante Aggiungi relazione, in modo da poter selezionare l’opzione Aggiungi relazione polimorfica dal menu a tendina appena apparso.

../../../_images/polymorphic_relation_properties.png

Fig. 16.112 Aggiungere una relazione polimorfa che utilizza il layer documents come riferimento e i layer animals e plants come riferimento.

  • id sarà utilizzato per scopi interni e deve essere univoco. Ti potrebbe essere necessario per creare custom forms. Se lo lasci vuoto, verrà generato automaticamente per te, ma puoi assegnare un nome per avere una più chiara modalità di gestione.

  • Il Layer di riferimento (figlio), considerato anche come layer figlio, è quello che contiene il campo chiave esterna. Nel nostro caso, si tratta del layer documents. Per questo layer è necessario aggiungere un campo di riferimento che punti all’altro layer, quindi questo è referenced_fk.

    Nota

    A volte hai bisogno di avere più di un singolo campo per identificare in modo univoco gli elementi di un layer. La creazione di una relazione con un layer di questo tipo richiede una chiave composita, cioè più di una singola coppia di campi corrispondenti. Usa il pulsante symbologyAdd Aggiungi una nuova coppia di campi come parte di una chiave esterna composita per aggiungere tutte le coppie necessarie.

  • Il Campo layer è il campo della tabella di riferimento che memorizza il risultato dell’espressione del layer valutato, che è la tabella di riferimento a cui appartiene questo elemento. Nel nostro esempio, si tratta del campo referenced_layer.

  • L”Espressione Layer valuta un identificatore univoco del layer. Può essere il nome del layer @layer_name, l’id del layer @layer_id, il nome della tabella del layer decode_uri(@layer, 'table') o qualsiasi cosa che possa identificare univocamente un layer.

  • Forza Associazione significa che il layer genitore e il layer figlio sono legati da una relazione di forza. Il tipo predefinito Associazione significa che il layer genitore è semplicemente collegato a quello figlio, mentre il tipo Composizione consente di duplicare anche gli elementi figli quando si duplicano quelli genitori e quando si cancella un elemento vengono cancellati anche i figli, con conseguente cascata su tutti i layer (significa che vengono cancellati anche i figli dei figli di…).

  • I Layer di riferimento, considerati anche come layer padre, sono quelli con la chiave primaria puntata, quindi in questo caso sono i layer plants e animals. Devi definire la chiave primaria dei layer referenziati dall’elenco a discesa, quindi è fid. Si noti che la definizione di una chiave primaria valida richiede che tutti i layer di riferimento abbiano un campo con quel nome. Se non esiste tale campo, non è possibile salvare una relazione polimorfa.

Una volta aggiunta, la relazione polimorfa può essere modificata tramite la voce di menu Modifica relazione polimorfa.

../../../_images/polymorphic_relations.png

Fig. 16.113 Anteprima della relazione polimorfa appena creata e delle sue relazioni figlie per animali e piante.

L’esempio precedente utilizza il seguente schema di database:

CREATE SCHEMA park;

CREATE TABLE park.animals
(
   fid serial NOT NULL,
   geom geometry(Point, 4326) NOT NULL,
   animal_species text NOT NULL,
   CONSTRAINT animals_pkey PRIMARY KEY (fid)
);

CREATE INDEX animals_geom_idx ON park.animals USING gist (geom);

CREATE TABLE park.plants
(
   fid serial NOT NULL,
   geom geometry(Point, 4326) NOT NULL,
   plant_species text NOT NULL,
   CONSTRAINT plants_pkey PRIMARY KEY (fid)
);

CREATE INDEX plants_geom_idx ON park.plants USING gist (geom);

CREATE TABLE park.documents
(
   fid serial NOT NULL,
   referenced_layer text NOT NULL,
   referenced_fk integer NOT NULL,
   image_filename text NOT NULL,
   CONSTRAINT documents_pkey PRIMARY KEY (fid)
);