Con questo articolo rispondo al quesito posto su GIS Italia:
Buongiorno a tutti!
sono alle prese con il seguente dilemma:
Ho una serie di punti ed una serie di linee: voglio calcolare la distanza ortogonale tra ogni punto e la linea più’ vicina.
Un modo rapido per risolvere il problema all’interno di QGIS è attraverso l’uso dei virtual layer (occorre conoscere le basi del SQL e di SpatiaLite).
Prenderò come esempio gli assi stradali (layer: grafo_stradale) e dei punti della pubblica illuminazione (layer: punti):

dopo aver importati i due i layer in QGIS, aggiungere un virtual layer:

si aprirà una maschera, importare i due layer presenti nella TOC e scrivere il seguente script SQL (NB: occorre personalizzare ID, che nel caso specifico è pk_uid):
select p.pk_uid, ST_ShortestLine (l.geometry, p.geometry) as geometry ,st_length (ST_ShortestLine (l.geometry, p.geometry)) as lungh_m | |
from punti as p, grafo_stradale as l | |
group by p.pk_uid | |
having min ( st_length(shortestline (p.geometry, l.geometry))) |
la maschera:

fare una ‘Prova‘, se compare un messaggio ‘NO error‘ cliccare su OK; ‘magicamente’ QGIS creerà, per ogni punto, un segmento di minima distanza (in rosso) tra punto e linea più vicina:

nello script di sopra viene calcolata anche la lunghezza del segmento minimo (cosa superflua, in quanto QGIS lo fa anche etichettando) che comparirà nella tabella attributi del virtual layer:


video:
Note finali: il virtual layer è uno strumento molto utile ma necessita la conoscenza di SQL, dialetto Spatialite o PostGIS. Esso rappresenta quello che in un DBMS viene chiamato vista o view, cioè una tabella virtuale che risiede solo in memoria e non nel disco fisso: questo ha dei vantaggi e svantaggi: uno per tutti, è un vettore dinamico che si aggiorna automaticamente al cambiar della geometria dei layer che usa; svantaggio più evidente, è lento se le feature sono molte.
Buon lavoro.
conQGIStando!!!
L’ha ribloggato su Geosabere ha commentato:
Ligação de Ramais à Rede de Distribuição
"Mi piace""Mi piace"