[Gfoss] VirtualKNN e max_distance

Maurizio Trevisani maurizio.trevisani a gmail.com
Sab 29 Maggio 2021 21:40:04 CEST


Devi scrivere sulla mailing list di spatialite.
Ciao,
Maurizio

Il sab 29 mag 2021, 16:11 pigreco <pigrecoinfinito a gmail.com> ha scritto:

> Buongiorno,
> non so se è il modo giusto e la ML corretta per chiedere, forse, una
> Feature
> Request per SpatiaLite,
> in caso negativo chiedo scusa per il runore.
>
> Ko studiato e usato le favolose VirtualKNN presenti in spatialite [0] per
> calcoli di distanze minime tra punti e linee su grandi dataset (milioni di
> righe) e ho notato che l'approccio classico dell'uso degli indici spaziali
> è
> enormemente più performante rispetto all'uso dei VirtualKNN (2 sec contro
> 100 secondi) questo è dovuto anche al fatto che non esiste, nelle
> virtualKNN, l'opzione max_distance e quindi calcola le distanze su tutte le
> righe.
>
> queste le due query a confronto, stessi dati in input e stessi output:
> - geo-tabella `route` linestring 32632 con 116674 feature
> - geo-tabella `scuole` point 32632 con 5529 feature
>
> uso VirtualKNN:
>
> CREATE TABLE t_scuole_100mKNN AS
> SELECT d.chiave_uni, d.fid as id_route, d.distance as distance,
>      ST_shortestline(d.geometry, s.geometry) as geom
> FROM
> (SELECT a.fid as fid, a.distance as distance, zz.chiave_uni as
> chiave_uni,zz.geometry
>     FROM knn as a
>     JOIN
>     scuole as zz
>     WHERE f_table_name = 'route'
>     AND f_geometry_column = 'geometry'
>     AND ref_geometry = zz.geometry
>     AND max_items = 1) d,
>     route s
> WHERE ST_Distance(s.geometry, d.geometry) <= 100 and id_route = s.ogc_fid
> ORDER BY d.chiave_uni;
> SELECT
> RecoverGeometryColumn('t_scuole_100mKNN','geom',32632,'LINESTRING','XY');
>
> output 1737 righe
> impiega circa 100 secondi
>
> uso spatialIndex classico
>
> CREATE TABLE t_scuole_100mMBR AS
> SELECT a.ogc_fid as id_route, Min(ST_Distance(a.geometry, zz.geometry)) AS
> distance,
>     zz.chiave_uni as chiave_uni, st_shortestline (a.geometry, zz.geometry)
> as geom
> FROM route as a, scuole as zz
> WHERE ST_Distance(a.geometry, zz.geometry) <= 100 AND a.ogc_fid IN (
>         SELECT rowid
>         FROM SpatialIndex
>         WHERE f_table_name = 'route'
>            AND search_frame = BuildCircleMbr(ST_X(zz.geometry),
> ST_Y(zz.geometry), 100))
> GROUP by zz.chiave_uni;
> SELECT
> RecoverGeometryColumn('t_scuole_100mMBR','geom',32632,'LINESTRING','XY');
>
> output 1737 righe
> impiega circa 2 secondi
>
> Forse le query non sono scritte in modo ottimale, ma secondo me un
> parametro
> max_distance nelle virtualKNN aiuterebbe molto
>
> grazie
>
> [0] https://www.gaia-gis.it/fossil/libspatialite/wiki?name=KNN
>
> -----
> https://pigrecoinfinito.wordpress.com/
> --
> Sent from:
> http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/
> _______________________________________________
> Gfoss a lists.gfoss.it
> http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
> Questa e' una lista di discussione pubblica aperta a tutti.
> I messaggi di questa lista non hanno relazione diretta con le posizioni
> dell'Associazione GFOSS.it.
> 764 iscritti al 23/08/2019


Maggiori informazioni sulla lista Gfoss