Importante
unireLa traduzione è uno sforzo comunitario you can join. 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
):
Fai clic sul pulsante Aggiungi nuova unione. Appare la finestra di dialogo Aggiungi Vettore da Unire.
Seleziona il Vettore di join che vuoi collegare con il layer vettoriale di destinazione
Specifica il Campo unione (dal
vettore di join
) e il Campo destinazione` (daltarget layer
). Questi sono i campi che vengono usati per trovare elementi corrispondenti in entrambi i layer, quindi devono avere valori in comune.Premi OK e un riassunto dei parametri selezionati viene aggiunto al pannello Join.
I passaggi sopra descritti creano un join in cui TUTTI gli attributi del primo elemento di corrispondenza nel layer di join vengono aggiunti all’elemento del layer 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:
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
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:
: 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 Layer di unione modificabile.
: il layer di join è ben configurato per essere modificabile, ma il suo stato attuale è in sola lettura.
: 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 Inserimento in modifica. Simmetricamente, l’opzione Elimina a cascata può essere attivata se vuoi eliminare automaticamente gli elementi di unione.
Campi uniti: invece di aggiungere tutti i campi del layer unito, puoi specificare un sottoinsieme.
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 Relazioni. Da qui puoi:
Aggiungi relazione il cui tipo può essere:
polymorphic relation che si può aggiungere o modificare con gli strumenti dedicati nel menu a discesa delle azioni.
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.
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.
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.
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 Relazioni e fai clic su Aggiungi relazione.
. Apri la schedaNome 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 chiamatofk_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 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…).
Dalla scheda Relazioni, puoi anche premere il pulsante 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.
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 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 serve a salvare tutte le modifiche nel livello figlio (airport).
Il pulsante 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 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 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 cancella definitivamente l’aeroporto o gli aeroporti selezionati.
Il simbolo 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 scollega l’aeroporto(i) selezionato(i) dalla regione corrente, lasciandolo effettivamente non assegnato (la chiave straniera è impostata a NULL).
Con il pulsante puoi ingrandire la mappa sulla geometria figlia selezionata.
I due pulsanti e 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.
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:
Seleziona il record che è stato aggiunto in precedenza all’interno del modulo per la geometria del layer selezionato.
Utilizza lo strumento di digitalizzazione 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 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.
Il widget Relation Reference ha anche un’opzione per incorporare il modulo del layer genitore all’interno di quello figlio. È disponibile nel menu 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.
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 se hai scelto l’opzione Consenti l'aggiunta di nuovi elementi
nel menu 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.
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 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
. In GeoPackage non ci sono schemi, quindi il prefisso localizzazione non è necessario.Chiavi esterne vincolanti nella tabella airports_airlines
non possono essere creati usando o pertanto devono essere creati usando . GeoPackage non supporta le istruzioni ADD CONSTRAINT quindi la tabella airports_airlines
dovrebbe essere creata in due fasi:
Imposta la tabella solo con il campo
id
usando .Usando
, 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 . 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.
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
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 airports
e airlines
. Per il primo si deve scegliere l’opzione airlines (id) e per il secondo l’opzione airports (id).
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
.
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 ( ) 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 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.
. Apri la schedaid 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 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 layerdecode_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
eanimals
. 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.
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)
);