Per compiere un'analisi di una rete si deve disporre di:
La rete delle strade è già presente nel dataset Spearfish come file vettoriale roads ma, poichè sarà necessario modificarne la tabella, si deve copiare il vettoriale roads dal mapset PERMANENT (in sola lettura) nella mappa roads_fire nel mapset corrente (user1) con:
> g.copy vect=roads,roads_fire
Per quanto riguarda i punti, qui è possibile scaricare il file network_fire_points.tar.gz contenente un vettoriale in formato ESRI Shapefile con 4 punti relativi alle caserme dei pompieri e 3 punti relativi ad incendi (i dati sono fittizi e sono stati creati per questa esercitazione).
Dopo aver scaricato il file e averlo decompresso (tar xzvf network_fire_points.tar.gz), si imposta la regione su quella di default con> g.region -d
si importa il file shape con> v.in.ogr dsn=/directory/in/cui/si/scompatta/lo/shape/ output=fires layer=fires min_area=0.0001 snap=-1 -o
e si visualizza con> d.mon start=x0 select=x0
> d.vect map=fires type=point,line,boundary,centroid,area,face display=shape,attr attrcol=type where="type='Wildfire'" icon=basic/x size=8 layer=1 color=red fcolor=gray llayer=1 lcolor=red bgcolor=none bcolor=none lsize=8 font=romans xref=left yref=center
> d.vect map=fires type=point,line,boundary,centroid,area,face display=shape,attr attrcol=type where="type='Fire station'" icon=basic/x size=8 layer=1 color=blue fcolor=gray llayer=1 lcolor=blue bgcolor=none bcolor=none lsize=8 font=romans xref=left yref=center
Si puó interrogare la mappa con il comando d.what.vect. Il comando v.in.ogr, invece, resetta le categorie, la tabella fires originale (nello shape) è :
| cat,N,11,0 | type,C,80 | label,C,80 |
|---|---|---|
| 1001 | Wildfire | Natural |
| 1002 | Wildfire | Human |
| 1003 | Wildfire | Natural |
| 1004 | Fire station | HeadQ |
| 1005 | Fire station | North Brig |
| 1006 | Fire station | East Brig |
| 1007 | Fire station | South Brig |
mentre la tabella dbf fires importata (nella directory dbf del mapset in uso) diventa:
| cat,N,11,0 | cat_,N,11,0 | type,C,80 | label,C,80 |
|---|---|---|---|
| 1 | 1001 | Wildfire | Natural |
| 2 | 1002 | Wildfire | Human |
| 3 | 1003 | Wildfire | Natural |
| 4 | 1004 | Fire station | HeadQ |
| 5 | 1005 | Fire station | North Brig |
| 6 | 1006 | Fire station | East Brig |
| 7 | 1007 | Fire station | South Brig |
lo stesso succede con le categorie associate ai punti, nel file originale vanno da 1001 a 1007, in quello importato da 1 a 7.
La mappa vettoriale roads contiene 5 categorie ed è necessario distinguere le categorie delle linee da quelle dei punti. Si possono ripristinare le categorie originali in due passi: modificando le categorie dei punti nella mappa vettoriale fires e modificando la tabella fires. Si vogliono avere categorie da 1 a 5 per le strade (come è già per il file roads_fire) e categorie da 1001 a 1007 per gli incendi e le caserme. Si cambiano quindi le categorie della mappa fires in modo che unendola a roads_fires abbiano categoria univoca, cioè 1 ->1001, 2 ->1002 ecc. fino a 7 ->1007 creando il vettoriale fires_1:
> v.category input=fires output=fires_1 type=point,line,boundary,centroid,area option=sum cat=1000 layer=1 step=1 --overwrite
Si può controllare il risultato con:
> v.info map=fires_1
> v.out.ascii input=fires_1 format=standard
Si cambiano le categorie nella tabella fires_1 con
> echo "UPDATE fires_1 SET cat=1001 WHERE cat=1" | db.execute
> echo "UPDATE fires_1 SET cat=1002 WHERE cat=2" | db.execute
> echo "UPDATE fires_1 SET cat=1003 WHERE cat=3" | db.execute
> echo "UPDATE fires_1 SET cat=1004 WHERE cat=4" | db.execute
> echo "UPDATE fires_1 SET cat=1005 WHERE cat=5" | db.execute
> echo "UPDATE fires_1 SET cat=1006 WHERE cat=6" | db.execute
> echo "UPDATE fires_1 SET cat=1007 WHERE cat=7" | db.execute
Le linee nel file roads_fire sono sul layer 1, i punti si devono quindi mettere sul layer 2 con:
> v.category input=fires_1 output=fires type=point,line,boundary,centroid,area option=chlayer cat=1 layer=1,2 step=1 --overwrite
Si può controllare il risultato con:
> v.info map=fires
> v.out.ascii input=fires format=standard
Si deve scollegare la tabella fires sul layer 1 e ricollegarla sul layer 2. Per identificare GISDBASE, LOCATION_NAME e MAPSET si deve eseguire:
> eval `g.gisenv`
e quindi> v.db.connect map=fires driver=dbf database=$GISDBASE/$LOCATION_NAME/$MAPSET/dbf/ table=fires key=cat layer=1 -d
> v.db.connect map=fires driver=dbf database=$GISDBASE/$LOCATION_NAME/$MAPSET/dbf/ table=fires key=cat layer=2
Si può visualizzare il risultato con:
> d.erase
> d.vect map=fires type=point,line,boundary,centroid,area,face display=shape,attr attrcol=type where="type='Wildfire'" icon=basic/x size=8 layer=2 color=red fcolor=gray llayer=2 lcolor=red bgcolor=none bcolor=none lsize=8 font=romans xref=left yref=center
> d.vect map=fires type=point,line,boundary,centroid,area,face display=shape,attr attrcol=type where="type='Fire station'" icon=basic/x size=8 layer=2 color=blue fcolor=gray llayer=2 lcolor=blue bgcolor=none bcolor=none lsize=8 font=romans xref=left yref=center
E interrogare con
> d.what.vect
Si devono collegare i punti alla rete delle strade: i collegamenti si possono generare automaticamente con il comandi v.distance, la flag -p indica di non aggiungere il valore della distanza alla tabella. I vettori che realizzano i collegamenti sono salvati nel vettoriale fires_connect.
> v.distance from=fires to=roads_fire from_type=point to_type=point,line,area from_layer=2 to_layer=1 output=fires_connect dmax=-1 upload=dist column=dist -p
v.distance non assegna alcuna categoria al vettoriale generato (fires_connect), la si deve aggiungere con v.category. Si assegna la categoria 5 sul layer 1 come per roads_fire (unimproved road) cioè quella più lenta
> v.category input=fires_connect output=fires_connect_cats type=point,line,boundary,centroid,area option=add cat=5 layer=1 step=0
Si possono visualizzare i collegamenti (in nero) con
> d.erase
incendi in rosso> d.vect map=fires type=point,line,boundary,centroid,area,face display=shape,attr attrcol=type where="type='Wildfire'" icon=basic/x size=8 layer=2 color=red fcolor=gray llayer=2 lcolor=red bgcolor=none bcolor=none lsize=8 font=romans xref=left yref=center
caserme dei pompieri in blu> d.vect map=fires type=point,line,boundary,centroid,area,face display=shape,attr attrcol=type where="type='Fire station'" icon=basic/x size=8 layer=2 color=blue fcolor=gray llayer=2 lcolor=blue bgcolor=none bcolor=none lsize=8 font=romans xref=left yref=center
collegamenti in nero> d.vect map=fires_connect_cats type=point,line,boundary,centroid,area,face display=shape attrcol=label icon=basic/x size=8 layer=1 color=black fcolor=gray llayer=1 lcolor=red bgcolor=none bcolor=none lsize=8 font=romans xref=left yref=center
Si devono quindi unire le tre mappe di strade (roads_fire), collegamenti (fires_connect_cats)e incendi e caserme dei pompieri (fires) con v.patch. Questo modulo sovrascrive la mappa di output cancellandola prima di ricrearla, cancellando quindi eventuali tabelle collegate. Se la mappa fire_net esiste è prudente scollegare le tabelle con
> v.db.connect map=fire_net driver=dbf database=$GISDBASE/$LOCATION_NAME/$MAPSET/dbf/ table=roads_fire key=cat layer=1 -d
> v.db.connect map=fire_net driver=dbf database=$GISDBASE/$LOCATION_NAME/$MAPSET/dbf/ table=fires key=cat layer=2 -d
Le tre mappe si uniscono quindi con
> v.patch in=roads_fire,fires_connect_cats,fires out=fire_net --overwrite
E' necessario spezzare le strade alle intersezioni coi collegamenti creati con v.distance:
> v.clean in=fire_net out=fire_net_clean tool=snap,break thresh=1 --overwrite
La mappa fire_net_clean viene poi rinominata fire_net per semplicità (si cancella prima la mappa fire_net, dato che anche g.rename non sovrascrive mappe esistenti):
> g.remove vect=fire_net
> g.rename vect=fire_net_clean,fire_net
La mappa vettoriale fire_net non ha alcuna tabella associata, come si può verificare (Number of dblinks è 0) con
> v.info map=fire_net
La situazione dei layer è:
Layer | Contenuto | Categorie |
| 1 | roads_fire + fires_connect_cats | 1-5 |
| 2 | fires | 1001-1007 |
Si collega la mappa fire_net alle due tabelle con
> v.db.connect map=fire_net driver=dbf database=$GISDBASE/$LOCATION_NAME/$MAPSET/dbf/ table=roads_fire key=cat layer=1
> v.db.connect map=fire_net driver=dbf database=$GISDBASE/$LOCATION_NAME/$MAPSET/dbf/ table=fires_1 key=cat layer=2