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: https://drive.google.com/file/d/14keUcBO6IdcVh3N7dx1HL35OynTLq5zc/view?usp=sharing -- *Ing. Salvatore Fiandaca* *mobile*.:+39 327.493.8955 *m*: *[hidden email] <[hidden email]>* *C.F*.: FNDSVT71E29Z103G *P.IVA*: 06597870820 *membro QGIS Italia - http://qgis.it/ <http://qgis.it/>* *socio GFOSS.it - *http://gfoss.it/ *blog:* * https://pigrecoinfinito.com/ <https://pigrecoinfinito.com/> FB: Co-admin - https://www.facebook.com/qgis.it/ <https://www.facebook.com/qgis.it/>** <https://www.facebook.com/qgis.it/> * *TW: <http://goog_95411464>**https://twitter.com/totofiandaca <https://twitter.com/totofiandaca>* 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. _______________________________________________ [hidden email] 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 |
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 _______________________________________________ [hidden email] 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 |
In reply to this post by pigreco
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 _______________________________________________ [hidden email] 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 |
Free forum by Nabble | Edit this page |