Espressioni regolari in PostgreSQL
Da Wikipedia, l'enciclopedia libera.
Situazione di partenza: abbiamo un file creato con AutoCAD dove è stato creato uno pseudo-GIS per rintracciare velocemente le unità stratigrafiche e le attività in cui sono raggruppate. Nel file originale ogni geometria è contenuta in un layer di AutoCAD dal nome "###_[#]# dove le prime 3 cifre sono il numero di US in formato 012 mentre, se presente, l'attività è indicata con il carattere "_" seguito da una o due cifre con la sintassi [1]0 (ossia i numeri da 1 a 9 sono indicati con una sola cifra).
Nell'esempio vengono presi in considerazione i record con due cifre nel numero di attività (solo perché all'inizio non mi ero accorto di questa duplicità).
Abbiamo importato il file di AutoCAD (DWG o DXF, non ricordo, ma era prima che Huidae Cho facesse il porting di v.in.dxf per GRASS 6) in uno Shapefile, uno per le linee e uno per i punti, usando OrbisCAD. Dallo Shapefile, usando l'interfaccia SPIT di QGIS abbiamo importato in maniera semplicissima dentro un database PostGIS appositamente preparato.
Ora vogliamo recuperare le informazioni riguardanti il numero di US e di attività, magari inserendole in un campo per conto loro che ci consenta di indicizzarle e sfruttare tutta la potenza di PostgreSQL. Il modo migliore per svolgere questa operazione è attraverso l'utilizzo delle espressioni regolari, largamente supportate da PG.
Vediamo dunque come procedere. Prima diamo un'occhiata alla tabella che abbiamo creato. Con questa query ottengo tutti i record in cui il contenuto del campo 'layer' finisce con una sequenza di '_##'
SELECT * FROM gortina_ WHERE layer ~ '_\\d{2}$'
Per aggiungere il numero di attività nel campo specifico ad ogni oggetto per cui era stata definita con la sintassi _## si può fare:
UPDATE gortina_ SET attivita = substring(layer from '..$') WHERE layer ~ '_\\d{2}$'
Ma non funziona perché il campo "attivita" è di tipo INTEGER e quindi non può ricevere dati di tipo STRING. Nessun problema però:
UPDATE gortina_ SET attivita = to_number(substring(layer from '..$'),99) WHERE layer ~ '_\\d{2}$'
cioè va a controllare quei record in cui il campo 'layer' finisce con _## (dove ## sono due cifre decimali), e aggiorna il campo attività con gli ultimi due caratteri (le due cifre) inserendoli.
Con la query
SELECT DISTINCT attivita FROM gortina_
verifichiamo quali geometrie sono già state assegnate ad una specifica attività, ottenendo un elenco delle attività già analizzate.
A questo punto abbiamo tutte le geometrie collegate ai riferimenti che ci sono necessari e possiamo senza problemi lavorare sui nostri dati con QGIS o MezoGIS. Possiamo anche utilizzare OrbisCAD (ancora in fase precoce di sviluppo) se vogliamo modificare le nostre geometrie.
La società Gis & Web S.r.l. ha sviluppato una macro VBA che permette ad AutoCAD Map di collegarsi ad un database PostgreSQL per leggerne e scriverne le geometrie. Il progetto deriva da un'idea sviluppata in PgArc. La versione corrente del progetto viene utilizzata solo per elaborazioni di dati interne all'azienda.

