[Gfoss] VirtualKNN e max_distance

pigreco pigrecoinfinito a gmail.com
Sab 29 Maggio 2021 16:11:42 CEST


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/


Maggiori informazioni sulla lista Gfoss