Aggiornare attributo di uno shapefile che dipende dal nome dello stesso strato

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.

https://www.sardegnageoportale.it/index.php?xsl=2425&s=325563&v=2&c=14414&t=1&tb=14401

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ò essere PLGARC o PNT
  • 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 questo A01010195
  • se il nome dello shapefile si chiamasse ST01TE01CL01ARC il campo da aggiornare sarebbe questo A01010195
  • se il nome dello shapefile si chiamasse ST01TE01CL01PNT il campo da aggiornare sarebbe questo A01010195

dove:
XX = 01
YY = 01
ZZ = 01

  • se il nome dello shapefile si chiamasse ST11TE04CL14PNT il campo da aggiornare sarebbe questo A11041495

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

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


Se il blog post Ti è piaciuto cliccate su ‘Mi piace’, grazie!!!
if you liked the blog post click on ‘Like’, thank you !!!

SE IL POST/BLOG TI È STATO UTILE CONTRIBUISCI A MANTENERLO AGGIORNATO PAYPAL


Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.