[Gfoss] [spatialite] spatialIndex e punti

Ho il classico problema di determinare, a partire da punti e linee, quale
sia la distanza minima tra punti e linee.

Per velocizzare la query uso lo spatialIndex e la query è la seguente

SELECT a.pk_uid as fid, Min(ST_Distance(a.geom, zz.geom)) AS distance,
    zz.pk_uid as pk_uid_punti, st_shortestline (a.geom, zz.geom) as geom
FROM strade as a, punti as zz
WHERE a.pk_uid IN (
        SELECT rowid
        FROM SpatialIndex
        WHERE f_table_name = 'strade'
           AND search_frame = ST_Buffer(zz.geom, 100))
GROUP by zz.pk_uid
order by 2 desc;

nel search_frame uso un buffer di 100 m sul punto, cosi facendo mi aspetto
che determini le distanze solo per punti entro 100 m, invece ci sono punti
anche oltre i 100m (fino a 163 m);

non riesco a capire il perché.
allego database per test:

--
*Ing. Salvatore Fiandaca*
*mobile*.:+39 327.493.8955
*m*: *pigrecoinfinito@gmail.com <pigrecoinfinito@gmail.com>*
*C.F*.: FNDSVT71E29Z103G
*P.IVA*: 06597870820
*membro QGIS Italia - http://qgis.it/*
*socio GFOSS.it - *http://gfoss.it/
*blog:*
* https://pigrecoinfinito.com/ FB: Co-admin
- QGIS Italia**
<https://www.facebook.com/qgis.it/&gt; *
*TW: <http://goog_95411464>**https://twitter.com/totofiandaca
<https://twitter.com/totofiandaca&gt;\*

43°51'0.54"N 10°34'27.62"E - EPSG:4326

“Se la conoscenza deve essere aperta a tutti,
perchè mai limitarne l’accesso?”
R. Stallman

Questo documento, allegati inclusi, contiene informazioni di proprietà di
FIANDACA SALVATORE e deve essere utilizzato esclusivamente dal destinatario
in relazione alle finalità per le quali è stato ricevuto. E' vietata
qualsiasi forma di riproduzione o divulgazione senza l'esplicito consenso
di FIANDACA SALVATORE. Qualora fosse stato ricevuto per errore si prega di
informare tempestivamente il mittente e distruggere la copia in proprio
possesso.

On Wed, 26 May 2021 22:28:42 +0200, Totò Fiandaca wrote:

Ho il classico problema di determinare, a partire da punti e linee, quale
sia la distanza minima tra punti e linee.

Per velocizzare la query uso lo spatialIndex e la query è la seguente

SELECT a.pk_uid as fid, Min(ST_Distance(a.geom, zz.geom)) AS distance,
    zz.pk_uid as pk_uid_punti, st_shortestline (a.geom, zz.geom) as geom
FROM strade as a, punti as zz
WHERE a.pk_uid IN (
        SELECT rowid
        FROM SpatialIndex
        WHERE f_table_name = 'strade'
           AND search_frame = ST_Buffer(zz.geom, 100))
GROUP by zz.pk_uid
order by 2 desc;

nel search_frame uso un buffer di 100 m sul punto, cosi facendo mi aspetto
che determini le distanze solo per punti entro 100 m, invece ci sono punti
anche oltre i 100m (fino a 163 m);

non riesco a capire il perché.

Toto',

una semplicissima figurina ti aiutera' sicuramente a capire meglio.

1) la spezzata rappresenta un ipotetico Linestring (la tua strada)
    quello evidenziato in rosso e' il BBOX corrispondente.

2) in blu vedi un Point, anzi per la precisione vedi il Buffer
    allargato costruito attorno al punto, che e' un cerchio.
    sempre in blu vedi il BBOX corrispondente al Buffer.

3) come vedi i due BBOX (quello rosso e quello blu) presentano
    un'intersezione; e di conseguenza lo Spatial Index, che e'
    semplicemente basato sulla valutazione speditiva dei BBOX,
    ti lascia passare la coppia Linestring-Point per ulteriori
    valutazioni piu' raffinate (*).

4) infine abbiamo il tratto violetto che indica la minima
    distanza; che come vedi in questo esempio supera di gran
    lunga il raggio del Buffer costruito attorno al Point.

(*) eccoci arrivati alla valutazione piu' raffinata che devi
     fare. lo SpatialIndex e' semplicemente un filtro spaziale
     molto rapido che ti consente di scartare a priori tutte
     le coppie "impossibili", ma che non ti assicura affatto
     la valutazione precisa della relazione spaziale tra le
     due geometrie. quella la deve fare la tua query nella
     sua clausola WHERE

....
FROM strade as a, punti as zz
WHERE ST_Distance (a.geom, zz.geom) <= 100.0 AND a.pk_uid IN (
....

ciao Sandro

a.furieri wrote

Toto',

una semplicissima figurina ti aiutera' sicuramente a capire meglio.

1) la spezzata rappresenta un ipotetico Linestring (la tua strada)
    quello evidenziato in rosso e' il BBOX corrispondente.

2) in blu vedi un Point, anzi per la precisione vedi il Buffer
    allargato costruito attorno al punto, che e' un cerchio.
    sempre in blu vedi il BBOX corrispondente al Buffer.

3) come vedi i due BBOX (quello rosso e quello blu) presentano
    un'intersezione; e di conseguenza lo Spatial Index, che e'
    semplicemente basato sulla valutazione speditiva dei BBOX,
    ti lascia passare la coppia Linestring-Point per ulteriori
    valutazioni piu' raffinate (*).

4) infine abbiamo il tratto violetto che indica la minima
    distanza; che come vedi in questo esempio supera di gran
    lunga il raggio del Buffer costruito attorno al Point.

(*) eccoci arrivati alla valutazione piu' raffinata che devi
     fare. lo SpatialIndex e' semplicemente un filtro spaziale
     molto rapido che ti consente di scartare a priori tutte
     le coppie "impossibili", ma che non ti assicura affatto
     la valutazione precisa della relazione spaziale tra le
     due geometrie. quella la deve fare la tua query nella
     sua clausola WHERE

Buongiorno,
grazie per il tempo dedicatomi,
grazie per la chiarezza espositiva,
grazie per darmi sempre più fiducia in questo straordinario DBMS,
grazie per tutto

da un grande sostenitore di spatialite

saluti

allego immagine:
https://drive.google.com/file/d/18bQstHVw2GHBI79wcLxqgQfGApEybaEH/view?usp=sharing

-----
https://pigrecoinfinito.wordpress.com/
--
Sent from: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/

On Wed, 26 May 2021 22:28:42 +0200, Totò Fiandaca wrote:

Ho il classico problema di determinare, a partire da punti e linee, quale
sia la distanza minima tra punti e linee.

Per velocizzare la query uso lo spatialIndex e la query è la seguente

SELECT a.pk_uid as fid, Min(ST_Distance(a.geom, zz.geom)) AS distance,
    zz.pk_uid as pk_uid_punti, st_shortestline (a.geom, zz.geom) as geom
FROM strade as a, punti as zz
WHERE a.pk_uid IN (
        SELECT rowid
        FROM SpatialIndex
        WHERE f_table_name = 'strade'
           AND search_frame = ST_Buffer(zz.geom, 100))
GROUP by zz.pk_uid
order by 2 desc;

nel search_frame uso un buffer di 100 m sul punto, cosi facendo mi aspetto
che determini le distanze solo per punti entro 100 m, invece ci sono punti
anche oltre i 100m (fino a 163 m);

non riesco a capire il perché.

Toto',

giusto una considerazione finale che mi era sfuggita nella mia
risposta precedente.

non c'e' nessun bisogno di costruire un Buffer attorno al punto se
almeno una delle due geometrie e' sicuramente un (multi)Linestring
oppure un (multi)Polygon.
bastano abbondantemente i BBOX cosi' come sono.

costruire un Buffer e' invece strettamente indispensabile per
riuscire a far funzionare lo SpatialIndex quando entrambe le
geometrie sono Point, perche' altrimenti il filtro ti lascera'
passare solo i punti esattamente sovrapposti, una circostanza
decisamente improbabile.

considerando che l'operazione di costruzione di un Buffer
richiede comunque un certo carico computazionale, e' meglio
evitare di effetturarla quando non e' strettamente
indispensabile perche' finisce per rallentare la query.

ciao Sandro

a.furieri wrote

non c'e' nessun bisogno di costruire un Buffer attorno al punto se
almeno una delle due geometrie e' sicuramente un (multi)Linestring
oppure un (multi)Polygon.
bastano abbondantemente i BBOX cosi' come sono.

costruire un Buffer e' invece strettamente indispensabile per
riuscire a far funzionare lo SpatialIndex quando entrambe le
geometrie sono Point, perche' altrimenti il filtro ti lascera'
passare solo i punti esattamente sovrapposti, una circostanza
decisamente improbabile.

Buonasera,
queste ultime due affermazioni non riesco a capirle, forse perché non ho ben
chiaro cosa sia un BBOX di un punto.

Un punto non ha dimensioni e quindi come fa ad avere un BBOX?
Perché se lavorassi con MultiPolygon o MultiLinestring non occorre il buffer
?
dove posso approfondire questi concetti?

Per adesso devo fare analisi su database con milioni di punti e questi
concetti risultano fondamentali.

grazie

-----
https://pigrecoinfinito.wordpress.com/
--
Sent from: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/