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:

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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