Realizzazione di buffer su entità vettoriali

Questa esercitazione illustra la realizzazione di buffer su entità vettoriali. Le operazioni effettuate sono:

Si imposta innanzitutto la regione su quella di default con

> 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

Creazione di buffer a larghezza data attorno a linee e aree

Questa procedura crea un buffer di larghezza 200 metri, indicata dal parametro buffer, attorno alle linee (type=line) contenute nella mappa streams_new, indipendentemente dalla loro categoria, nella mappa streams_buffer_line:

> 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


Buffer attorno ai corsi d'acqua

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


Buffer attorno ai laghi

Creazione di buffer attorno a linee con larghezza dipendente dalla categoria delle linee stesse

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 riporta

cat|buffer
1|150.000000
2|50.000000
3|100.000000
421|300.000000

si usa qundi una larghezza di buffer di 150 metri per i corsi d'acqua di categoria 1, 50 metri per quelli di categoria 2, 150 metri per la categoria 3 e 300 metri per la categoria 421 che individua i laghi.
Dapprima si creano buffer solo attorno alle linee, non attorno alle aree (laghi), usando il parametro type=line

> 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


Buffering dipendente dal valore degli attributi

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.

Creazione di buffer attorno ad aree con larghezza dipendente dalla categoria delle aree stesse

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


Buffering attorno ai laghi
NB poichè tutte le aree hanno la stessa categoria il risultato sarebbe stato lo stesso usando direttamente un unico valore, indicato dal parametro bufffer, senza leggere il valore dalla tabella.

Creazione di buffer di larghezza diversa a destra e a sinistra rispetto al verso di percorrenza delle linee

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


Verso di percorrenza dell'acqua
Si usa il modulo v.parallel indicando larghezze di buffer positive per il buffer a destra e negative per il buffer a sinistra. A destra quindi, con larghezza 100 metri

> 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


Uso di v.parallel
Si noti che in realtà sono state create linee parallele alle linee contenute nella mappa streams_new e non aree come quando si usa v.buffer, tranne che per i laghi che sono rappresentati da aree nella mappa di partenza.

Calcolo della lunghezza delle linee di ogni categoria e memorizzazione nella tabella associata

E' possibile visualizzare la lunghezza delle linee di ogni categoria e associarle ad ogni categria nella tabella della mappa. Il modulo utilizzato è v.to.db. Nel primo esempio si visualizza sul terminale le lunghezze, senza aggiungerle alla tabella, usando l'opzione -p

> v.to.db map=streams_new type=point,line,boundary,centroid layer=1 qlayer=1 option=length units=me column=lenght -p

che visualizza

cat|length
-1|2426.08071449311
1|32614.5522076325
2|183157.29968834
3|3458.83045471837
421|0

Senza l'opzione -p si scrive la lunghezza nella tabella: si deve prima creare una colonna in cui memorizzare i valori. Si crea la colonna "lenght" nella tabella streams_new associata alla mappa (sul primo layer):

> 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.