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:

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

siamo pronti per creare una tabella e i trigger, basti copiare ed incollare il seguente script SQL in spatialite_gui in tre fasi distinte:
- dalla riga 1 alla 7 – crea tabella e aggiunge colonna geometrica;
- dalla 9 alla 15 – crea trigger per calcolo lunghezza dopo inserimento geometria;
- dalla 17 alla23 – crea trigger per calcolo lunghezza dopo aggiornamento geometria;
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |

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

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

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:

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:
Buon lavoro e Buone Feste!!!
È possibile inserire trigger simili anche utilizzando file shape?
"Mi piace""Mi piace"
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""Mi piace"
Grandioso!! 🙂
in teoria si può ancora aggiungere ulteriore codice per popolare altri campi in un solo paragrafo di insert o update.
"Mi piace""Mi piace"