Avevo già scritto in questo blog post come aggiornare un attributo di uno shapefile usando la shell di OSGeo4W con ogrinfo, in questo blog post risolviamo un caso più complesso ma reale.
I dati utilizzati per questo esempio sono quelli del Geoportale della Sardegna e in particolare quelli del Comune di Cabras in provincia di Oristano.
Gli shapefile sono circa 150:
La struttura della tabella attributi è:
La difficoltà di questo esempio sta nel nome del campo da aggiornare che non è sempre lo stesso, ma cambia al cambiare del nome dello shapefile: il legame tra nome shapefile e attributo è il seguente:
Nome strato/shapefile: (senza spazi):
ST XX TE YY CL ZZ ABC
ABC
può esserePLG
,ARC
oPNT
- esempio: ST01TE01CL01PLG
- XX varia in 01, 02, 03…. 10,11…
- YY varia in 01,02,03….
- ZZ varia in 01,02,03…
nome attributo da aggiornare: (senza spazi):
A XX YY ZZ 95
- esempio: A01010195
- XX varia in 01, 02, 03…. 10,11…
- YY varia in 01,02,03….
- ZZ varia in 01,02,03…

Valore da aggiornare
il valore del campo da aggiornare è sempre 2011
e va aggiornato a 2021
esempio applicativo
- se il nome dello shapefile si chiamasse
ST01TE01CL01PLG
il campo da aggiornare sarebbe questoA01010195
- se il nome dello shapefile si chiamasse
ST01TE01CL01ARC
il campo da aggiornare sarebbe questoA01010195
- se il nome dello shapefile si chiamasse
ST01TE01CL01PNT
il campo da aggiornare sarebbe questoA01010195
dove:
XX = 01
YY = 01
ZZ = 01
- se il nome dello shapefile si chiamasse
ST11TE04CL14PNT
il campo da aggiornare sarebbe questoA11041495
dove:
XX = 11
YY = 04
ZZ = 14
Soluzioni
Usando la riga di comando e ogrinfo
#!/bin/bash
set -x
# crea un file con i percorsi relativi dello shapefile
find . -name *.shp >pathSHP.csv
for file in $(cat pathSHP.csv)
do
# crea variabile ed estrae solo il nome dello shapefile
nomeSHP=`echo $file | sed -E 's/^.\/.+\/(.+).shp$/\1/'`
# crea variabile ed estrae il nome dell attributo da aggiornare
campo=`echo $file | sed 's/ST/A/' | sed 's/TE//' | sed 's/CL//' | sed 's/...\.shp/95/' | sed -E 's/^.+\/(.+)$/\1/'`
# aggiorna gli shapefile
ogrinfo -dialect SQLite -sql "UPDATE ${nomeSHP} SET $campo='2021' WHERE $campo='2011'" $file
done
Usando QGIS e il Calcolatore campi in Processing
per maggiori dettagli metto sotto un video nel mio canale youtube:
NOTE FINALI: La riga di comando e il relativo script bash è molto potente e flessibile mentre con QGIS e il calcolatore campi da Processing non aggiorna ma sovrascrive il campo, ma per questo caso specifico otteniamo gli stessi risultati desiderati.
RIFERIMENTI
- GDAL/OGR : https://gdal.org/programs/ogrinfo.html
- QGIS : https://www.qgis.org/it/site/https://www.qgis.org/it/site/
- GeoPortale Sardegna : https://www.sardegnageoportale.it/index.php?xsl=2425&s=325563&v=2&c=14414&t=1&tb=14401
RINGRAZIAMENTI
- Antonio Demarcus
Alcuni file del dataset scaricato non hanno alcun elemento, per individuarli eseguire questo script bash:
#!/bin/bash
# cancella file
rm toto.csv
for file in *.shp
do
# crea variabile e estrae la riga con Layer name e restituisce solo il numero
a=`ogrinfo -so -al $file | grep "Layer name" | sed -E 's/^.+ (.+)/\1/'`
# crea variabile e estrae la riga con Feature Count e restituisce solo il numero
b=`ogrinfo -so -al $file | grep "Feature Count"| sed -E 's/^.+ (.+)/\1/'`
# concatena le due variabili
c=$a,$b
# salva la concatenatione in un file
echo $c >>toto.csv
done;
# aggiunge intestazione
sed -i '1i Layer name,Feature Count' ./toto.csv
I MIEI CANALI – ISCRIVITI
- Telegram : https://t.me/pigrecoinfinito
- YouTube : https://www.youtube.com/c/TotòFiandaca
Se il blog post Ti è piaciuto cliccate su ‘Mi piace’, grazie!!!
if you liked the blog post click on ‘Like’, thank you !!!