[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