Quesito posto sul gruppo Facebook GIS Italia:
Ciao a tutti. Chiedo il vostro aiuto. Ho uno shp di linee che rappresentano una rete di condotte gas metano, quindi la tabella attributi riporta record come materiale, tipo (bassa o media pressione) e lunghezza. C’è anche il campo che riporta l’informazione “in ispezione” che é un campo numerico dove 1 vuol dire tratto ispezionato e 0 non ispezionato. Ho tematizzato con colori differenti la rete ispezionata e quella non ispezionata a seconda della bassa e della media pressione. Adesso vorrei includere (quindi far avere lo stesso colore) ai tratti di rete più vicini spazialmente (ndr: hanno almeno un punto in comune) a quelli non ispezionati, perché devo raggiungere una percentuale sul totale delle lunghezze da far ispezionare. C’è un modo senza che io lo faccia con la selezione a mano?avete idee?grazie mille a chi mi risponderà.
Il quesito è molto interessante e allo stesso tempo non di rapida risoluzione con i normali strumenti messi a disposizione da un GIS desktop e per questo motivo consiglio sempre di utilizzare database, in particolare spatialite.
Non avendo a disposizione dei dati devo crearli da zero, seguendo il testo del quesito, ecco il risultato:

l’obiettivo è quello di selezionare i tratti di condotta che hanno un punto in comune (quindi spazialmente più vicini) con i tratti ispezionati (cioè valore in tabella attributi):
per risolvere il quesito, tutto all’interno di QGIS, utilizzo i virtual layer e creo il seguente strato:

select distinct l2.id,l2.geometry, l1.ispezione | |
from | |
(select * from rete_gas_tratti where ispezione =1) l1, | |
(select * from rete_gas_tratti where ispezione =0) l2 | |
where st_touches (l1.geometry, l2.geometry) =1 |
ottengo un altro layer cosi fatto:

i tratti visualizzati nel nuovo layer rappresentano i tratti di condotta NON ispezionati ma spazialmente vicini (un vertice in comune) ai tratti ispezionati.
ora non ci resta che fare un semplice join tra il vettore iniziale (rete_gas_tratti) e il virtual layer, utilizzando il campo ID come campo unione e poi popolare il campo ispezione, del primo layer, con un valore (per esempio 2) in funzione del join; cosi facendo il campo ispezione risulta popolato da 1 = ispezionato e da 2= da ispezionare perché spazialmente vicino; ecco il risultato:

Non faccio tutti i passaggi cosi un mio caro amico resta contento.
NOTE FINALI: tutti questi passaggi sono ottimizzati per utilizzare solo QGIS, una alternativa sarebbe quella di importare i dati in un database, per esempio spatialite, e rendere il tutto più veloce.
Buon lavoro