[Gfoss] spatialite e le virtualKNN
a.furieri a lqt.it
a.furieri a lqt.it
Lun 8 Gen 2018 21:56:36 CET
On Mon, 8 Jan 2018 18:44:55 +0100, Totò Fiandaca wrote:
> Salve a tutti,
> ho scoperto che QGIS supporta solo spatialite 4.3, credo sia l'ultima
> versione stabile.
>
> Sto studiando le virtualKNN, un modulo implementato nella spatialite
> 4.4,
> ed ho scoperto che possono cambiare le sorti di un geodatabase.
>
ciao Toto',
occhio che la prima implementazione della KNN che trovi nella 4.4.0
era affetta da diversi problemi anche gravi che sono stati risolti
in seguito.
ti consiglio caldamente di utilizzare i sorgenti trunk che trovi sul
repository Fossil (4.5.0-devel) se vuoi essere sicuro di avere un
KNN che funzioni correttamente.
> Ho scritto un articolo e vorrei sottoporlo all'attenzione di persone
> più esperte di me.
>
> Ho alcuni dubbi sui trigger che ho realizzato, soprattutto su quelli
> senza
> far uso delle virtualKNN.
>
ho testato il tuo trigger, e funziona correttamente.
ci trovo un unico difettuccio: utilizza ben tre UPDATE per
ciascuna INSERT, e ciascuna delle UPDATE lancia una subquery
KNN che e' un'operazione computazionalmente pesantuccia.
... non mi pare la via migliore per ottenere performances
di buon livello.
quindi ho provato a razionalizzare e semplificare, e sono
arrivato a produrre questo:
CREATE TRIGGER ins_punti AFTER INSERT ON punti
BEGIN
INSERT OR REPLACE INTO punti (fid, nome_strada, data_ins, distanza,
geom)
SELECT NEW.ROWID, s.nome_strada, DateTime('now'), k.distance,
NEW.geom
FROM knn AS k
LEFT JOIN strade AS s ON (k.fid = s.pk_1)
WHERE k.f_table_name = 'strade'
AND ref_geometry = NEW.geom
AND k.max_items = 1;
END
a questo punto e' ovvio che serve un secondo Trigger
che entri in azione quando un "punto" gia' inserito
viene spostato in una nuova posizione.
come vedi il secondo Trigger e' praticamente identico
al primo, tranne che per le dichiarazioni nella prima
riga.
CREATE TRIGGER upd_punti AFTER UPDATE OF geom ON punti
BEGIN
INSERT OR REPLACE INTO punti (fid, nome_strada, data_ins, distanza,
geom)
SELECT NEW.ROWID, s.nome_strada, DateTime('now'), k.distance,
NEW.geom
FROM knn AS k
LEFT JOIN strade AS s ON (k.fid = s.pk_1)
WHERE k.f_table_name = 'strade'
AND ref_geometry = NEW.geom
AND k.max_items = 1;
END
ciao Sandro
Maggiori informazioni sulla lista
Gfoss