Quesito posto nel gruppo facebook GIS Italia:
Buongiorno a tutti e grazie per avermi accettato in questa community!
Avrei un quesito: è possibile estrarre contemporaneamente più dxf da un vettore in relazione ad un campo della tabella attributi? Es: ho un unico vettore con una colonna attributi riportante una descrizione (strada, edificio, verde pubblico, ecc…) e vorrei generare tanti dxf separati (strada.dxf, edificio. dxf, verde pubblico.dxf, ecc…) senza doverli splittare manualmente e salvarli uno ad uno.
Grazie in anticipo per l’aiuto!
Con QGIS è possibile splittare uno shapefile in funzione di un attributo e successivamente esportare il tutto in un unico file dxf, ma il quesito richiede un output di singoli file dxf.
Un modo rapido per ottenere il risultato è scrivere uno script:
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
#!/bin/bash | |
set -x | |
#creo cartella di output | |
mkdir ./nomecartelladxf | |
mkdir ./nomecartellashp | |
#trasformo in csv lo shapefile | |
ogr2ogr -f CSV sicilia.csv sicilia.shp; | |
# estraggo la colonna che mi serve e rimuovo l'intestazione | |
csvsql –query "select SIGLA from sicilia" sicilia.csv | tail -n +2 >./sigla.csv; | |
# ciclo per splittare lo shapefile | |
while read p; do | |
ogr2ogr -f "ESRI Shapefile" -where "SIGLA ='$p'" ./nomecartellashp/$p.shp sicilia.shp; | |
done <./sigla.csv; | |
#ciclo per convertire da shp in dxf | |
for i in ./nomecartellashp/*.shp; | |
do | |
#crei una variabile che usi per estrarre nome e estensione | |
filename=$(basename "$i") | |
#estrai estensione | |
extension="${filename##*.}" | |
#estrai nome file | |
filename="${filename%.*}" | |
ogr2ogr -f DXF ./nomecartelladxf/"$filename".dxf ./"$i"; | |
done |
copiarlo ed incollarlo nella shell bash ed in pochi secondi (dipende dal peso dello shapefile) si otterrà il risultato voluto: tutti gli shapefile i dxf saranno raccolti rispettivamente nelle cartelle nomecartellash, nomecartelladxf.
Osservazioni:
- lo script va lanciato nella cartella che contiene lo shapefile da splittare (io ho usato sicilia.shp (province), sostituite il nome del vostro shapefile);
- sigla.csv è il file che contiene gli attributi con cui splittare, cambiate il nome a piacere;
- nella creazione dei file dxf noterete degli avvisi di errore legati alla tabella attributi, è normale non preoccupatevi;
- è consigliabile che gli attributi, con cui splittate lo shapefile, non contengano spazi o caratteri speciali in quanto diventeranno i nomi degli shapefile;





affinchè lo script funzioni occorre che siano installate:
- librerie GDAL/OGR – fare riferimento a questo e questo;
- tool csvkit – fare riferimento a questo e a questo;
per chi usa windows 10, ecco una guida per installare la bash ubuntu.
NOTE FINALI: per chi fosse alle prime armi, con la riga di comando, sembrerebbe tutto difficile e macchinoso, ma vi assicuro che dopo qualche tempo di esercizio e con un po’ di buona volontà tutto diventa chiaro e semplice.
Lo script è migliorabile, ma credo sia un buon inizio e soprattutto molto didattico.
Un enorme grazie al mio amico Andrea Borruso per avermi trasmesso un po’ della sua passione.
video:
donate: