preparazione dati mediante geoprocessing File

Transcript

preparazione dati mediante geoprocessing File
Esercitazione
Preparazione dei dati per l'analisi di reti con GRASS
utilizzando comandi di gestione db e geoprocessing vettoriale
(Dati: parte del dataset North Carolina)
In collaborazione con
Prof. P. Zatelli
Dipartimento di Ingegneria Civile ed Ambientale
Università degli Studi di Trento
Cartografia numerica e GIS
Scopo dell'esercitazione di analisi di rete:
predisporre una cartografia di aiuto all'intervento di
squadre di spegnimento incendi sull'area del dataset North Carolina.
Dati:
strade – linee vettoriali
localizzazione di incendi e caserme dei pompieri – punti vettoriali
La rete delle strade è già presente nel dataset North Carolina come file vettoriale
streets nel mapset PERMANENT ma, poichè le operazioni per l'analisi di reti
possono essere onerose e la rete stradale è molto estesa, conviene estrarre un
sottoinsieme delle strade su una regione limitata per avere tempi di elaborazione
brevi.
Si imposta la regione sulla regione già esistente central_10m:
> g.region region=central_10m@PERMANENT
Si crea un area rettangolare region_central che si userà per ritagliare la parte di
rete stradale interna a questa regione:
> v.in.region --overwrite --verbose output=region_central
e si ritaglia la rete stradale, creando la mappa streets_central:
> v.overlay --overwrite --verbose ainput=streets@PERMANENT atype=line
binput=region_central output=streets_central operator=and
Analogo discorso vale per i punti che rappresentano le caserme dei pompieri,
contenuti nella mappa firestations nel mapset PERMANENT: si estraggono i
punti che ricadono nella regione centrale e tra questi si selezionano le caserme
della città di Raleigh che forniscono servizi di soccorso. Si estraggono i punti
della mappa firestations nella regione central_10m:
> v.select --overwrite --verbose ainput=firestations atype=point
binput=region_central btype=area output=firestations_central
creando la mappa firestations_central.
Tra queste si selezionano le stazioni della città di Raleigh (colonna della tabella
CITY='Raleigh') che forniscono servizi di soccorso (colonna RESCUE_SER>0):
> v.extract --overwrite --verbose input=firestations_central
output=firestations_raleigh where="CITY='Raleigh' and RESCUE_SER>0"
La nuova mappa firestations_raleigh contiene quattro punti, come si può
verificare con
> v.info firestations_raleigh
A questo punto è sufficente connettere i punti alla rete stradale con:
> v.net --overwrite --verbose input=streets_central
points=firestations_raleigh@user1 output=network operation=connect
thresh=500
L'opzione operation=connect indica di creare i collegamenti tra punti (stazioni dei
pompieri) e linee (strade) e di creare un unico vettoriale contenente punti, linee e
collegamenti. Il parametro thresh=500 indica di connettere alla rete stradale i
punti che distano da essa fino a 500 metri.
La nuova mappa ha due layer (1 e 2): le linee hanno categorie sul primo layer,
mentre i punti hanno categorie sul secondo layer, come si può verificare con
> v.category input=network option=report
Questa mappa ha collegata sul primo layer la tabella della mappa delle linee
(strade), cioè streets_central, mentre nessuna tabella è collegata sul secondo
layer:
> v.db.connect -p map=network
fornisce
Vector map network@user1 is connected by:
layer 1 table network in database
/home/paolo/misc/grass/nc_basic_spm/gisdemo_ncspm/user1/dbf/ through
driver dbf with key cat
E' possibile collegare tabella delle stazioni dei pompieri sul secondo layer,
ad esempio per poter visualizzare il nome della stazione ed i suoi attributi:
> v.db.connect -o --verbose map=network table=firestations_central layer=2
Questo è possibile perchè le categorie delle caserme dei pompieri sul secondo
layer della mappa streets_central sono le stesse delle caserme sul primo layer
della mappa firestations_central.
Costo di attraversamento
Associamo ai vari tratti di strada un costo di attraversamento dipendente
dalla distanza, con possibilità di “chiudere” alcune strade in uno o entrambi I
sensi di percorrenza. Per fare questo si assegnano i costi di percorrenza per
gli archi (strade) in una colonna della tabella associata.
Le strade a cui corrsiponde un costo uguale a -1 sono considerate
chiuse (in uno o entrambi i versi di percorrenza).
Per mantenere come costo la distanza (per le strade che non saranno chiuse)
si creano due nuove colonne, una per i costi in avanti (concordi con il verso
della linea) ed una per i costi indietro (discordi con il verso della linea), e vi si
scrive il valore della lunghezza del tratto di rete (linee) a cui corrispondono.
Successivamente si porranno alcuni valori a -1 per chiudere alcune strade.
Innanzitutto è necessario verificare che ogni linea abbia una categoria diversa, in
modo da non assegnare la stessa lunghezza a due tratti diversi (che avranno
quasi sicuramente lunghezze diverse):
> v.category input=network option=report
Layer/table:
type
point
line
boundary
centroid
area
all
Layer/table:
type
point
line
boundary
centroid
area
all
1/network
count
0
8827
0
0
0
8827
2/firestations_centr
al
count
4
0
0
0
0
4
min
0
1
0
0
0
1
max
0
8819
0
0
0
8819
min
21
0
0
0
0
21
max
52
0
0
0
0
52
Come si vede sopra le strade sono 8827 ma hanno 8819 categorie distinte sul primo
layer: ci sono 8 strade con la stessa categoria. Si aggiunge quindi un terzo layer per
le strade, su cui i tratti hanno categorie diverse, creando la mappa network_cat3:
> v.category --overwrite --verbose input=network output=network_cat3 type=line
layer=3 cat=1
Ora
> v.category input=network_cat3 option=report
Layer/table: 1/network_cat3_1
type
count
min
max
point
0
0
0
line
8827
1
8819
boundary 0
0
0
centroid
0
0
0
area
0
0
0
all
8827
1
8819
Layer: 3
type
count
point
0
line
8827
boundary 0
centroid
0
area
0
all
8827
min
0
1
0
0
0
1
max
0
8827
0
0
0
8827
Layer/table: 2/network_cat3_2
type
count min
max
point
4
21
52
line
0
0
0
boundary 0
0
0
centroid
0
0
0
area
0
0
0
all
4
21
52
Si devono ricollegare le tabelle per questa nuova mappa. Sul layer 1 si connette la
tabella delle strade:
> v.db.connect -o --verbose map=network_cat3@user1 table=network layer=1
Sul layer 2 si collega la tabella delle stazioni dei pompieri:
> v.db.connect -o --verbose map=network_cat3@user1 table=firestations_central
layer=2
NOTA: in certi casi si deve ricreare la tabella firestations_central, poiché v.net, a causa di un bug, la
cancella:
> v.select --overwrite --verbose ainput=firestations atype=point binput=region_central btype=area
output=firestations_central
Si aggiunge quindi una tabella alla mappa, collegata sul terzo layer (la tabella sarà
automaticamente chiamata network_cat3_3, per indicare che è la tabella del terzo
layer della mappa network_cat3), con due colonne lungh_a e lungh_i per i costi di
percorrenza in avanti ed indietro:
> v.db.addtable --verbose map=network_cat3@user1 layer=3 columns="cat integer,
lungh_a double, lungh_i double"
Si scrivono le lunghezze nella nuova tabella, con costo avanti = costo indietro =
lunghezza tratto. Sul terzo layer ogni tratto ha una categoria diversa quindi le due
colonne contengono la lunghezza di ogni singolo tratto:
> v.to.db --verbose map=network_cat3 type=line,boundary layer=3 qlayer=3
option=length columns=lungh_a
> v.to.db --verbose map=network_cat3 type=line,boundary layer=3 qlayer=3
option=length columns=lungh_i
Fine preparazione dati!
Questa presentazione è © 2012 Bianca Federici e Domenico Sguerso, disponibile come
http://www.creativecommons.it/Licenze