[Gfoss] VirtualKNN in SpatiaLite 5

a.furieri a lqt.it a.furieri a lqt.it
Lun 19 Apr 2021 22:24:33 CEST


On Mon, 19 Apr 2021 12:37:29 -0700 (MST), pigreco wrote:
> Altra sorpresona,
> anche da me รจ velocissimo ma genera dati senza senso.
>

hai ragione, c'era una falla logica in qualle query;
occorre definire un buffer che "gonfi" il punto-incrocio,
altrimenti il filtro sullo spatial index prende in
considerazione solo quelle strade che casualmente
intersecano il BBOX del punto.

eccoti qua la versione riveduta e corretta:

CREATE TABLE wow AS
SELECT a.pk as fid, Min(ST_Distance(a.geom, zz.geom)) AS distance,
    zz.pk as pk_punti, st_shortestline (a.geom, zz.geom) as geom
FROM strade_palermo as a, inc2k18Palermo as zz
WHERE a.pk IN (
        SELECT rowid
        FROM SpatialIndex
        WHERE f_table_name = 'strade_palermo'
           AND search_frame = ST_Buffer(zz.geom, 0.01))
GROUP by zz.pk;

------------------

abbiamo cosi' introdotto due perditempo:
- la ST_ShortestLine
- la ST_Buffer
e comunque stiamo sempre sui 6-7 secondi.

N.B. il raggio del buffer e' fissato "a occhio"
(circa 1km), che almeno in questo caso pare
rappresentare un buon compromesso tra efficienza
e precisione dei risultati.

ecco dove sta il principale vantaggio dal KNN;
che non ti costringe mai a fare assunzioni piu'
o meno arbitrarie sui raggi di probabile distanza.

ciao Sandro.


Maggiori informazioni sulla lista Gfoss