Questa esercitazione illustra la realizzazione di buffer su entità vettoriali. Le operazioni effettuate sono:
> g.region -d
Questa esercitazione prevede la creazione di buffer attorno ai corsi d'acqua memorizzati nella mappa streams nella location PERMANENT, con la modifica della tabella associata. Poichè la mappa streams è nella location PERMANENT essa è in sola lettura e la sua tabella non può essere modificata: per questo motivo si copia prima la mappa streams nella mappa streams_new nel mapset corrente e si applicano poi le procedure di seguito a questa nuova mappa.
> g.remove vect=streams_new
> g.copy vect=streams,streams_new
> v.buffer input=streams_new output=streams_buffer_line type=line layer=1 buffer=200 scale=1.0 tolerance=0.01 --overwrite
e si visualizza con> d.erase
> d.vect map=streams_buffer_line color=red
> d.vect map=streams@PERMANENT
in grigio con contorno rosso le aree di buffer e in nero i corsi d'acqua, le croci rosse sono i centroidi delle aree di buffer, le tre piccole aree grigie con croci nere sono le aree dei laghi con i rispettivi centroidi.
La stessa procedura può essere utilizzata per creare buffer di larghezza 300 metri, indicata dal parametro buffer, attorno alle aree, creando la mappa streams_buffer_area, ora il parametro type vale area:
> v.buffer input=streams_new output=streams_buffer_area type=area layer=1 buffer=300 scale=1.0 tolerance=0.01 --overwrite
e si visualizza con> d.erase
> d.vect map=streams_buffer_area color=red
> d.vect map=streams@PERMANENT
Si vogliono creare buffer attorno alle linee con larghezza pari ad un valore memorizzato nella tabella associata alla mappa. La larghezza può essere diversa per ogni categoria nella mappa di partenza.
Poichè la tabella collegata alla mappa streams_new è vuota, essa viene cancellata, ricreata e riempita con valori di larghezza di buffer diversi per ogni categoria, nella colonna buffer. Prima di cancellare la tabella la si scollega dalla mappa:> v.db.connect -d layer=1 map=streams_new
si cancella il dbf prima di ricrearlo. Per scrivere il nome della location e del mapset corrente nella variabile di ambiente MAPSET si usa> eval `g.gisenv`
> : ${GISDBASE?} ${LOCATION_NAME?} ${MAPSET?}
> LOCATION="$GISDBASE/$LOCATION_NAME/$MAPSET"
in modo da cancellare il file streams_new.dbf nel mapset corrente:> rm -f $LOCATION/dbf/streams_new.dbf
Si crea una nuova table con una colonna "buffer" di tipo double e la si collega alla mappa (sul primo layer)> v.db.addtable map=streams_new columns="buffer double"
e si visualizza la nuova connessione tra vettoriale e tabella> v.db.connect -p map=streams_new
Si scrive la larghezza del buffer nella tabella, larghezza diversa per ogni categoria. Le categorie da 1 a 3 sono relative a corsi d'acqua> echo "UPDATE streams_new SET buffer=150 WHERE cat=1" | db.execute
> echo "UPDATE streams_new SET buffer=50 WHERE cat=2" | db.execute
> echo "UPDATE streams_new SET buffer=100 WHERE cat=3" | db.execute
la categoria 421 identifica i laghi> echo "UPDATE streams_new SET buffer=300 WHERE cat=421" | db.execute
Si visualizza la tabella con> echo "select * from streams_new"|db.select
che riportacat|buffer
1|150.000000
2|50.000000
3|100.000000
421|300.000000
> v.buffer input=streams_new output=streams_buffer_db_line type=line layer=1 bufcol=buffer scale=1.0 tolerance=0.01 --overwrite
e si visualizza> d.erase
> d.vect map=streams_new cat=1 color=black
> d.vect map=streams_new cat=2 color=red
> d.vect map=streams_new cat=3 color=green
> d.vect map=streams_new cat=421 color=yellow
> d.vect map=streams_buffer_db_line color=blue fcolor=none
I corsi d'acqua di categoria 1 sono riportati in nero, quelli di categoria 2 in rosso e quelli di categoria 3 (uno solo a nord-ovest) in verde; i laghi (categoria 421) sono in giallo. I confini dei buffer sono riportati in blu.
La stessa procedura vista per i corsi d'acqua si può applicare alle aree, creando un buffer attorno ai 3 laghi con larghezza (300 metri) letta dalla tabella in corrispondenza della categoria 421, nella colonna buffer:
> v.buffer input=streams_new output=streams_buffer_db_area type=area layer=1 bufcol=buffer scale=1.0 tolerance=0.01 --overwrite
e si visualizza> d.erase
> d.vect map=streams_new cat=1 color=black
> d.vect map=streams_new cat=2 color=red
> d.vect map=streams_new cat=3 color=green
> d.vect map=streams_new cat=421 color=yellow
> d.vect map=streams_buffer_db_area color=blue fcolor=none
Per creare buffer di larghezza diversa a destra e a sinistra rispetto al verso di percorrenza delle linee si deve ovviamente il verso di percorrenza delle linee lungo cui si crea il buffer, questo è dato dall'ordine dei vertici e si può facilmente visualizzare indicando l'opzione dir nel parametro display di d.vect:
> d.erase
> d.vect map=streams_new display=shape,dir
> v.parallel input=streams_new output=streams_right distance=100 --overwrite
e a sinistra con larghezza 300 metri (si noti il segno meno)> v.parallel input=streams_new output=streams_left distance=-300 --overwrite
e si visualizza, senza cancellare il monitor:> d.vect map=streams_right color=blue
> d.vect map=streams_left color=red
> v.to.db map=streams_new type=point,line,boundary,centroid layer=1 qlayer=1 option=length units=me column=lenght -p
che visualizzacat|length
-1|2426.08071449311
1|32614.5522076325
2|183157.29968834
3|3458.83045471837
421|0
> echo "ALTER TABLE streams_new ADD COLUMN lenght double" | db.execute
e si scrivono nella nuova colonna le lunghezze, il parametro option=length indica il tipo di valori da scrivere (le distanze), column=lenght indica in quale colonna scrivere i valori:> v.to.db map=streams_new type=point,line,boundary,centroid layer=1 qlayer=1 option=length units=me column=lenght
La tabella streams_new ora contiene:> echo "select * from streams_new"|db.select
cat|buffer|lenght
1|150.000000|32614.552208
2|50.000000|183157.299688
3|100.000000|3458.830455
421|300.000000|0.000000
Lo script che realizza queste operazioni è geoprocessing_spearfish_buffer.sh.