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.

Software usati

Pagine di riferimento

Personal tools