Spatialite e i trigger per il calcolo automatico della lunghezza di una strada

I triggers sono un meccanismo universale, ci puoi fare qualsiasi cosa che ti viene in mente (o quasi …) l’unico limite e’ la tua capacita’ creativa di saperti “inventare” un buon modello dati; naturalmente serve anche una base molto solida di conoscenza teorica su SQL con tutte le sue estensioni Spatial, cosi’ come e’ indispensabile quella certa “praticaccia spicciola” che si acquisisce solo a forza di lavorare sul campo imparando piu’ che altro dai propri errori. – by Alessandro Furieri – [thread]

Segue un piccolo esempio:

Creeremo un semplice database Spatialite per digitalizzare delle strade ed automatizzeremo il calcolo delle lunghezze stradali utilizzando degli automatismi chiamati trigger, cioè dei grilletti che scatteranno ogniqualvolta si verificherà un evento, nel nostro caso: inserimento linea o modifica della stessa.

Avviamo spatialite_gui e creiamo un database vuoto:

N7
spatialite_gui – crea nuovo database vuoto

e lo chiamiamo db_stradario.sqlite, salvandolo per esempio sul desktop:

N8
db_stradario vuoto

siamo pronti per creare una tabella e i trigger, basti copiare ed incollare il seguente script SQL in spatialite_gui in tre fasi distinte:

  1. dalla riga 1 alla 7 – crea tabella e aggiunge colonna geometrica;
  2. dalla 9 alla 15 – crea trigger per calcolo lunghezza dopo inserimento geometria;
  3. dalla 17 alla23 – crea trigger per calcolo lunghezza dopo aggiornamento geometria;


CREATE TABLE stradario
(pk INTEGER PRIMARY KEY autoincrement NOT NULL,
nome TEXT,
lunghezza DOUBLE,
note TEXT);
SELECT AddGeometryColumn('stradario','geom',32632,'LINESTRING',2);
CREATE TRIGGER insert_calc_length AFTER INSERT ON stradario calcola lunghezza dopo inserimento strada
BEGIN
UPDATE stradario
SET
lunghezza= ST_LENGTH(geom)
WHERE ROWID=NEW.ROWID;
END
CREATE TRIGGER update_calc_length AFTER UPDATE OF geom ON stradario aggiorna lunghezza dopo modifica strada
BEGIN
UPDATE stradario
SET
lunghezza= ST_LENGTH(geom)
WHERE ROWID=NEW.ROWID;
END

N10
spatialite_gui

dopo aver cliccato su (1), ritroverete il database con la tabella stradario (vuota) e pronta per essere popolata:

N11
tabella e trigger creati

per popolare la tabella abbiamo bisogno di un gis desktop, avviamo QGIS e importiamo il database: ricordo che la tabella è stata definita con EPSG 32632 (WGS 84 / UTM zone 32N) – per esempio Lucca (utilizzando come sfondo OpenStreeMap):

N12
QGIS – OpenStreeMap

NB: attivare OTF (riproiezione al volo) con EPSG corrente la 32632; attivare la modifica del database (icona con matita) ed iniziate a digitalizzare le strade:

N16
QGIS – stradario

magicamente la tabella attributi si popolerà – in autonomia – con le lunghezze dei tratti stradali digitalizzati.


Note finali: questo è un semplice esempio per far capire la potenza dei database e dei trigger. I trigger sono utilizzati per l’esecuzione, sulla tabella madre, di codice SQL per gli eventi di INSERT, UPDATE e DELETE, per maggiori dettagli leggere qui.


fonti:

https://www.sqlite.org/lang.html

https://www.tutorialspoint.com/sqlite/sqlite_triggers.htm

http://www.gaia-gis.it/gaia-sins/windows-bin-x86-test/

https://www.sqlite.org/lang_createtrigger.html

Video dimostrativo:

Dati e progetto.

Buon lavoro e Buone Feste!!!

Pubblicità

3 pensieri su “Spatialite e i trigger per il calcolo automatico della lunghezza di una strada

    1. NO, non è possibile realizzare dei trigger negli shapefile ma grazie a QGIS è possibile fare una cosa simile: utilizzando i campi virtuali.
      NB: i campi virtuali sono memorizzati nel file di progetto di QGIS quindi funzionano solo con il progetto.

      "Mi piace"

Rispondi a Alberto Cancella risposta

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

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