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
_______________________________________________
[email protected]
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

Rispondere a