Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Gestione di dati vettoriali in GRASS 6.4 Paolo Zatelli Dipartimento di Ingegneria Civile e Ambientale Università di Trento Paolo Zatelli | Università di Trento | 1/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 GRASS 6.4 Le principali caratteristiche della gestione di mappe vettoriali in GRASS 6.x sono: ● architettura vettoriale 3D, multi attributo e multi layer, indicizzazione spaziale; ● networking, shortest path; ● interfaccia display manager (gis.m) e nviz; ● integrazione con DBMS. Il codice dei moduli e delle librerie vettoriali è stato riscritto completamente rispetto alle versioni precedenti (5 e 4). Paolo Zatelli | Università di Trento | 2/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 GRASS 6.x Geometria: ● ● supporto per vettori 2D/3D (disegni CAD, TIN), visualizzazione con NVIZ; multiformato - “mappe virtuali” da sorgenti di dati esterni (SHAPE-file, PostGIS) senza conversione (con la libreria OGR con v.external); ● export/import a/da PostGIS; ● spatial index creato al volo - v.build velocizzato significativamente; ● category index per accelerare le query sugli attributi. Database Management Interface (attributi): ● ● ● gestione degli attirbuti in un DBMS (PostgreSQL, mySQL, ODBC, SQLite, dBase); multiattributo - attributi registrati in file dBase(default) o in DBMS esterni; multilayer – le features in un vettoriale possono rappresentare uno o più layer e possono essere collegati a uno o più tabelle; ● uso delle “forms library” per dialoghi user friendly per le query; ● supporto per linear reference systems. Paolo Zatelli | Università di Trento | 3/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 GRASS 6.x Applicazioni/Misc: ● query/selezioni/estrazioni SQL supportate dai moduli vettoriali; modifica interattiva degli attributi attraverso la “forms library” (d.what.vect permette la modifica degli attributi); ● analisi delle reti vettoriali: Shortest path, Traveling salesman (percorso chiuso), Allocation of sources (sottoreti), Minimum Steiner trees (connessioni a stella), e isodistances (da centri), (es. shortest path) - basato su DGLIB (Directed Graph Library), le funzioni di costo possono essere assegnate sia a nodi che ad archi (con verso); ● ● nuovo programma di digitalizzazione v.digit con interfaccia grafica; import e export di qualunque formato vettoriale supportato da OGR (Shapefile, TIGER, MapInfo, GML2, PostGIS e DGN); ● ● interfaccia grafica generata runtime e display manager; i18n: supporto per linguaggi multipli (al momento i messaggi sono parzialmente codificati e tradotti); ● ● sessioni multiple di GRASS: lo stesso utente può lanciare più di una sessione. Paolo Zatelli | Università di Trento | 4/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Geometria e attributi Nel modello vettoriale si deve gestire: ● geometria; ● topologia; ● attributi; e loro relazioni. Le relazioni tra geometria ed attributi possono avere cardinalità diversa da uno: è possibile cioè collegare più attributi alla stessa geometria e/o geometrie diverse alla stessa tabella di attributi. Paolo Zatelli | Università di Trento | 5/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Geometria e attributi fonte: GRASS wiki Paolo Zatelli | Università di Trento | 6/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Geometria La geometria del modello vettoriale in GRASS 6.x usa una rappresentazione arco-nodo (arco = linea orientata) definita da coppie [triplette] di coordinate (x,y[,z]). Le primitive geometriche sono: ●point; ●line; ●boundary; ●centroid; ●area (boundary+centroid); ●face (riservato per usi futuri, topologia 3D?). Paolo Zatelli | Università di Trento | 7/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Formati vettoriali GRASS è in grado di utilizzare dati vettoriali 3D: ● in formato nativo (importati o digitalizzati); ● da PostGIS e in formati nativi attraverso OGR (sola lettura, non topologico) con v.external. Il modello vettoriale di GRASS prevede due livelli: ● livello 1, solo geometria (memorizzata nel file coor); ● livello 2, livello 1 più topologia (memorizzata nel file topo). Le funzioni di GRASS possono aprire un file vettoriale a diversi livelli a seconda delle operazioni che devono eseguire (che usano o meno la topologia). Paolo Zatelli | Università di Trento | 8/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Formato nativo Nella directory $LOCATION_NAME/$MAPSET/vector esiste una cartella per ogni vettoriale (con il nome della mappa), contenente i file: cidx coor dbln head hist sidx topo file di indicizzazione delle categorie (binario); coordinate (binario); database link (lista delle tabelle associate, ASCII); header (ASCII); informazioni sul file (ASCII); file di indicizzazione spaziale (binario); topologia (binario). Paolo Zatelli | Università di Trento | 9/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Formato nativo header ORGANIZATION: USGS­NMD DLG DATA ­ CHARACTE DIGIT DATE: 1977, DIGIT NAME: youngs MAP NAME: Output from Vpatch MAP DATE: 1977, MAP SCALE: 100000 OTHER INFO: RC3.HYS03 **PRODUCED ZONE: 13 MAP THRESH: 76.200000 dbln 1 poi cat /home/paolo/grass/network_analysis/osnabrueck/user1/dbf/ dbf 2 poi2 cat /home/paolo/grass/network_analysis/osnabrueck/user1/dbf/ dbf hist COMMAND: v.in.ogr ­o dsn="/home/paolo/grass/network_analysis/frida­1.0.1­ shp/" output="poi" layer="poi" min_area=0.0001 snap=­1 GISDBASE: /home/paolo/grass/network_analysis LOCATION: osnabrueck MAPSET: user1 USER: paolo DATE: Thu Jun 9 13:07:15 200 Paolo Zatelli | Università di Trento | 10/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Formati esterni E' possibile utilizzare dati vettoriali esterni con v.external v.external dsn=/home/paolo/grass/trentino/dati/shp/ output=strade layer=strade i file sono solo in lettura. I formati supportati sono: ESRI Shapefile, MapInfo File, UK .NTF, SDTS, TIGER, S57, DGN, VRT, REC, Memory, BNA, CSV, GML,GPX, KML, GeoJSON, Interlis1, Interlis2, GMT, SQLite, ODBC, Pgeo, OGDI, PostgreSQL, MySQL e AVCBin . Paolo Zatelli | Università di Trento | 11/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Categorie Ad ogni entità di un file vettoriale è associata una categoria, che viene usata come campo chiave nel collegamento con gli attributi. Ogni vettoriale può appartenere ad uno o più layer (strati) ed ogni entità ha una categoria (uguale o diversa) per ogni layer. Ad ogni layer corrisponde una tabella del database. Ogni vettoriale (ad es. importato) ha di default un layer (con indice 1). Paolo Zatelli | Università di Trento | 12/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Categorie e DB - formato nativo Coor file Primitiva geom. layer cat linea 1 1 1 2 1 linea 2 1 2 2 23 punto 1 1 3 2 2 linea 3 1 1 2 23 Paolo Zatelli | Università di Trento | Tabella 1 campo chiave 1 2 3 4 ... attributo attributo 1 attributo 2 attributo 3 attributo 4 ... Tabella 2 campo chiave attributo 1 attributo 1 2 attributo 2 ... ... 23 attributo 23 ... ... layer 1 layer 2 13/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Categorie e DB - PostGIS layer 1 Geometry table Prim. geom. Feature ID linea 1 1 linea 2 2 punto 1 3 linea 3 4 Category file Feature ID layer cat 1 1 1 1 2 1 2 1 2 2 2 23 3 1 3 3 2 2 4 1 1 4 2 23 Tabella 1 campo chiave 1 2 3 4 ... attributo attributo 1 attributo 2 attributo 3 attributo 4 ... Tabella 2 campo chiave attributo 1 attributo 1 2 attributo 2 ... ... 23 attributo 23 ... ... layer 2 Paolo Zatelli | Università di Trento | 14/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Categorie La gestione del legame geometria – categorie è fatta con v.category. La sintassi è: v.category [-g] input=name [output=name] [option=string] [type=string[,string,...]] [layer=value[,value,...]] [ids=range] [cat=integer] [step=integer] [--overwrite] [-verbose] [--quiet] flags: -g output in stile shell script, -o sovrascrive la mappa di output (se esiste), -v verbose, -q quiet; input nome della mappa di input; output nome della mappa di output; option azione da compiere: add – aggiunge una nuovo layer, del – cancella un layer, lcopy – copia un layer, chlayer – cambia il numero di un layer, sum – aggiunge il valore cat ai valori di una categoria di un layer, report – visualizza i valori delle categorie in shell style (layer type count min max), print - visualizza i valori delle categorie, le categorie sono separate da '/'; type tipo di primitiva (point,linea,boundary,centroid,area); layer numero del layer (default 1); Ids categorie delle primitive nel file di input da processare (default: tutte); cat categoria (default 1); step incremento delle categorie (default 1); overwrite sovrascrive il file di output, se esiste già (equivalente a -o). Paolo Zatelli | Università di Trento | 15/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Categorie Esempi: aggiunge un secondo layer al vettoriale poi, con categoria=numero entità v.category input=poi output=poi_2f layer=2 op=add cat=1 step=1 mentre v.category input=poi_2f layer=1 op=report visualizza type count min max point 282 1 282 line 0 0 0 boundary 0 0 0 centroid 0 0 0 area 0 0 0 all 282 1 282 LAYER 2: type count min max point 282 1 282 line 0 0 0 boundary 0 0 0 centroid 0 0 0 area 0 0 0 all 282 1 282 Paolo Zatelli | Università di Trento | 16/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Topologia La costruzione della topologia è fatta con v.build, che gestisce i file di supporto per topologia e categorie. Normalmente non è necessario eseguire il modulo esplicitamente, tutti i moduli di importazione e modifica di mappe vettoriali eseguono v.build se necessario. La sintassi è: v.build map=name [error=name] [option=string[,string,...]] [--overwrite] [--verbose] [--quiet] map nome della mappa di input; error mappa in cui scrivere i vettori errati; option azione da compiere: build – costruisce la topologia, dump – visualizza la topologia sullo stdout, sdump – visualizza l'indice spaziale sullo stdout, cdump – visualizza le categorie sullo stdout; overwrite sovrascrive il file di output (error), se esiste già: verbose aumenta le informazioni a video; quiet diminuisce l'output a video. Paolo Zatelli | Università di Trento | 17/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Topologia Esempio: visualizzazione della topologia v.build map=h_network_clean option=dump ­­­­­­­­­­ TOPOLOGY DUMP ­­­­­­­­­­ N,S,E,W,T,B: 5800876.470000, 5787594.240000, 3444004.000000, 3427000.290000, 0.000000, 0.000000 Nodes (9061 nodes, alive + dead ): node = 1, n_lines = 2, xy = 3432560.200000, 5795535.790000 line = 1, type = 1, angle = ­9.000000 line = 10, type = 2, angle = 1.083750 node = 2, n_lines = 2, xy = 3432093.960000, 5795823.350000 line = 2, type = 1, angle = ­9.000000 line = 11, type = 2, angle = 0.822250 ... Paolo Zatelli | Università di Trento | 18/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Topologia Spesso le mappe vettoriali importate hanno errori topologici, non rispettano cioè i vincoli dello schema spaziale usato da GRASS (G1). I vincoli in particolare sono, per le primitive nella stessa mappa: le aree non si possono sovrapporre, le linee intersecandosi devono generare un nodo, punti diversi devono avere coordinate diverse. Alcuni formati di file vettoriali non contengono la topologia (es. Shape e dxf) e le primitive hanno geometra tale che è necessario “ripulirla” per costruire la topologia. Dopo avere importato la mappa in GRASS si usa v.clean Paolo Zatelli | Università di Trento | 19/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Topologia v.clean [-b] input=name output=name [type=string[,string,...]] [error=name] tool=string[,string,...] [thresh=float[,float,...]] [--overwrite] [--verbose] [--quiet] Flags: -b non costruisce la topologia sul file di output, -o sovrascrive, -v verbose, -q quiet. input mappa di input; output mappa di output; type tipo di primitiva (point,line,boundary,centroid,area, face, kernel - default: point,line,boundary,centroid,area); error mappa (vettoriale) in cui sono create le primitive errate; tool “strumento” da applicare : break, snap, rmdangle, chdangle, rmbridge, chbridge, rmdupl,rmdac, bpol, prune, rmarea, rmline, rmsa break: spezza le linee alle intersezioni snap: esegue uno snap dei vertici delle linee più vicini del threshold rmdangle: rimmuove i “dangles”, il threshold è ignorato se < 0 chdangle: cambia il tipo di primitiva da boundary a linea per i “dangle”, il threshold è ignorato se < 0, le primitivedi tipo line sono ignorate rmbridge: rimuove i “ponti” che connettono aree con isole o 2 isole Paolo Zatelli | Università di Trento | 20/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Topologia chbridge: cambia il tipo di primitiva da boundary a line per i “ponti” che connettono aree con isole o 2 isole rmdupl: rimuove le features duplicate (attenzione alle categorie) rmdac: rimuove i centroidi duplicati ('type' è ignorato) bpol: spezza (“aggiusta” topologicamente) i poligoni (ad es. importato da formati non topologici come ShapeFile). I boundaries sono spezzati ad ogni intersezione tra 2 o più poligoni prune: rimuove i vertici all'interno del threshold da lines e boundaries, un boundary è “potato” solo se la topologia non viene danneggiata (ad es. creando una nuova intersezione), il primo e l'ultimo segmento di un boundary non sono mai modificati. rmarea: rimuove piccole aree, il boundary più lungo è cancellato rmline: rimuove tutte le linee o boundary con lunghezza zero (ignora il threshold) rmsa: rimuove angoli piccoli tra linee nello stesso nodo thresh threshold (valore di soglia) Il threshold è dato in unità di mappa, un valore per ogni “strumento”, nello stesso ordine (default: 0.0[,0.0,...]). Paolo Zatelli | Università di Trento | 21/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Topologia Esempio: spezzare le linee alle intersezioni v.clean ­­overwrite ­­verbose input=roadsmajor output=roadsmajor_clean error=intersections tool=break Esempio: rimuovere i centroidi duplicati v.clean ­­overwrite ­­verbose input=census output=census_clean tool=rmdac Esempio: rimuovere i “dangles” e unire i punti più vicini di 10 (metri) v.clean ­­overwrite ­­verbose input=roads output=roads_clean tool=snap,rmdangle thresh=10 Paolo Zatelli | Università di Trento | 22/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Attributi Ogni layer può essere collegato ad una tabella, si deve indicare: ● il layer a cui collegare la tabella; ● la tabella da collegare; ● il campo (colonna) chiave della tabella a cui corrispondono le categorie delle primitive vettoriali. Queste informazioni vengono memorizzate nel file dbln per ogni vettoriale: 1 poi cat /home/paolo/grass/network_analysis/osnabrueck/user1/dbf/ dbf 2 poi2 cat /home/paolo/grass/network_analysis/osnabrueck/user1/dbf/ dbf Attenzione: è possibile collegare la stessa tabella a più vettoriali ma le operazioni su un vettoriale la modificano anche per gli altri, in particolare cancellando un vettoriale collegato la tabella viene cancellata (ma si può scollegare la tabella). Paolo Zatelli | Università di Trento | 23/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Collegamento degli attributi Il collegamento tra categorie su un layer e tabella di DB si imposta con v.db.connect. La sintassi è: v.db.connect [-pglcod] map=name [driver=name] [database=name] [table=name] [key=name] [layer=integer] [fs=character] [--verbose] [--quiet] flags: -p stampa i parametri della connessione attuale ed esce; -g stampa i parametri della connessione attuale in stile shell script ed esce; -l stampa solo informazioni relative al layer indicato -c stampa i nomi e tipi delle colonne del layer specificato; -o sovrascrive i parametri di una connessione esistente; -d elimina la connessione specificata (non la tabella); map nome della mappa di input; driver driver del DB (dbf, pg, ogr, sqlite – default dbf); database nome del database (directory per i file); table tabella; key nome del campo (colonna) chiave; layer numero del layer (default 1); fs separatore dei campi nella tabella. Paolo Zatelli | Università di Trento | 24/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 v.db.connect Esempi: collegare la tabella “strassen” (dbf) al primo layer del vettore “streets_schools” con campo chiave “cat” v.db.connect map=streets_schools driver=dbf database=$GISDBASE/ $LOCATION_NAME/$MAPSET/dbf/ table=strassen key=cat layer=1 collegare la tabella “schools” (dbf) al secondo layer del vettore “streets_schools” con campo chiave “cat” v.db.connect map=streets_schools driver=dbf database=$GISDBASE/ $LOCATION_NAME/$MAPSET/dbf/ table=schools key=cat layer=2 collegare la tabella “streets” (PostgreSQL) al terzo layer del vettore “streets_schools” con campo chiave “cat” v.db.connect map=streets_schools driver=pg database=”host=pgserver.ing.unitn.it,dbname=vectdb,user=paolo” table=streets key=id layer=3 Paolo Zatelli | Università di Trento | 25/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 db.connect E' possibile impostare parametri di default per la connessione a DB con db.connect, questi sono usati da v.db.connect senza bisogno di specificarli ogni volta. La sintassi è: db.connect [-pc] [driver=string] [database=string] [schema=string] [group=string] flags: -p visualizza i parametri della connessione corrente ed esce, -c controlla I parametri della connessione e li imposta; driver nome deldriver DB (dbf,pg,sqlite); database nome del database (directory per i file); schema tipo di schema usato dal server DB (vuoto per i DBMS che non usano uno schema); group utente di default del server DB. Es.: impostazione di default per driver e database per i dbf db.connect driver=dbf database=$GISDBASE/$LOCATION_NAME/$MAPSET/dbf/ Paolo Zatelli | Università di Trento | 26/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Esempi Visualizzazione di un vettoriale: d.vect strade_scuole col=black i punti (=scuole) in rosso, estraendo le etichette dalla colonna “tipo” della tabella collegata sul layer 2: d.vect strade_scuole type=point layer=2 llayer=2 col=red disp=attr attrcol=tipo Creazione del vettoriale “scuole” estraendo da “servizi” i punti con nome “scuola” nella colonna “tipo” v.extract input=servizi output=scuole type=point layer=1 new=­1 where=”tipo='Scuola'" Paolo Zatelli | Università di Trento | 27/28 Gestione Gestione di di dati dati vettoriali vettoriali in in GRASS GRASS 6.4 6.4 Licenza Questa presentazione è © 2014 Paolo Zatelli, disponibile come Paolo Zatelli | Università di Trento | 28/28