GRASS logo

NOME

v.net.steiner - Crea un albero di Steiner per la rete e i punti scelti. Da notare che il problema 'Minimum Steiner Tree' è NP-hard e in questo modulo viene utilizzato un algoritmo euristico, per cui il risultato può essere sub-ottimale

PAROLE CHIAVE

vettore, rete, albero di steiner

SINOSSI

v.net.steiner
v.net.steiner help
v.net.steiner [-g] input=nome output=nome [type=string[,string,...]] [alayer=integer] [nlayer=integer] [acolumn=string] tcats=range [nsp=integer] [--overwrite] [--verbose] [--quiet]

Flag:

-g
Usa il calcolo geodetico per le location longitudine-latitudine
--overwrite
Sovrascrive i file esistenti
--verbose
Output verboso del modulo
--quiet
Output quieto del modulo

Parametri:

input=nome
Nome della mappa vettoriale di input
output=nome
Nome della mappa vettoriale di output
type=string[,string,...]
Tipo di arco
Opzioni: line,boundary
Predefinito: line,boundary
alayer=integer
Numero del layer
Layer degli archi
Predefinito: 1
nlayer=integer
Numero del layer
Layer dei nodi (usato per i punti terminali)
Predefinito: 2
acolumn=string
Colonna dei costi per gli archi (per entrambe le direzioni)
tcats=range
Valori delle categorie
Categorie dei punti sui punti terminali (il layer è specificato da nlayer)
nsp=integer
Numero di punti di steiner (-1 per tutti quelli possibili)
Predefinito: -1

DESCRIZIONE

v.net.steiner calcola la connesione ottimale di nodi su una rete in formato vettoriale.

Un albero di Steiner viene usato per calcolare la rete vettoriale di minimo costo che connette un certo numero di nodi finali in una struttura a rete. Per esempio, può essere usato per trovare il percorso, lungo un sistema di strade, che minimizza la quantità di cablaggi di fibre ottiche necessari per connettere una serie di uffici satelliti.

I costi possono rappresentare la lunghezza delle linee oppure attributi salvati in una tabella di database. I valori di questi attributi sono considerati come costi dell'intero segmento, e non come costi per attraversare un'unità di lunghezza (p.es. metri) del segmento. Per esempio, se il limite di velocità è 100 Km/h, il costo per attraversare un segmento lungo 10 Km dev'essere calcolato come lungh/vel = 10 Km/(100 Km/h) = 0.1 h. Sono possibili assegnazioni di costo sia per gli archi che per i nodi, e anche costi diversi per le due direzioni di una linea vettoriale. Per le aree i costi vengono calcolati lungo i bordi.

I punti che rappresentano i nodi devono stare esattamente sui nodi della rete,e il vettoriale in ingresso dev'essere preparato con v.net operation=connect.

ESEMPIO

Albero di Steiner per 6 nodi digitalizzati (Spearfish):

Percorso più breve, su strade dissestate:

v.net.steiner example using distance

Percorso più breve, su autostrade:

v.net.steiner example using time

# Spearfish

g.copy vect=roads,myroads

# si devono ottimizzare 6 siti
echo "1|601653.5|4922869.2|a
2|608284|4923776.6|b
3|601845|4914981.9|c
4|596270|4917456.3|d
5|593330.8|4924096.6|e
6|598005.5|4921439.2|f" | v.in.ascii in=- cat=1 x=2 y=3 out=centers col="cat integer, \
                         east double precision, north double precision, label varchar(43)"

v.db.select centers
v.category centers op=report
# type       count        min        max
# point          6          1          6

#creare una mappa di linee che connettono i punti alla rete (sul layer 2)
v.net myroads points=centers out=myroads_net op=connect thresh=500

# definire i costi come tempo di percorrenza

# creare una categoria diversa per ogni strada nel layer 3
v.category in=myroads_net out=myroads_net_time opt=add cat=1 layer=3 type=line

# aggiungere una nuova tabella per il layer 3
v.db.addtable myroads_net_time layer=3 col="cat integer,label varchar(43),length double precision,speed double precision,cost double precision"

# copiare il tipo di strada sul layer 3
v.to.db myroads_net_time layer=3 qlayer=1 opt=query qcolumn=label columns=label

# inserire la lunghezza delle strade in miglia
v.to.db myroads_net_time layer=3 type=line option=length col=length unit=miles

# definire i limiti di velocità in miglia/ora
v.db.update myroads_net_time layer=3 col=speed val="5.0"
v.db.update myroads_net_time layer=3 col=speed val="75.0" where="label='interstate'"
v.db.update myroads_net_time layer=3 col=speed val="75.0" where="label='primary highway, hard surface'"
v.db.update myroads_net_time layer=3 col=speed val="50.0" where="label='secondary highway, hard surface'"
v.db.update myroads_net_time layer=3 col=speed val="25.0" where="label='light-duty road, improved surface'"
v.db.update myroads_net_time layer=3 col=speed val="5.0" where="label='unimproved road'"

# definire i costi di viaggio come tempo di percorrenza in minuti:
v.db.update myroads_net_time layer=3 col=cost val="length / speed * 60"

# Percorso più breve
v.net.steiner myroads_net_time alayer=3 nlayer=2 tcats=1-6 out=mysteiner_distance

# Percorso più veloce
v.net.steiner myroads_net_time alayer=3 nlayer=2 acol=cost tcats=1-6 out=mysteiner_time
Per vedere il risultato eseguire, per esempio:
# vedere i risultati
g.region vect=myroads_net

# Percorso più breve
d.mon x0
d.vect myroads_net
d.vect -c centers icon=basic/triangle
d.font Vera
d.vect centers col=red disp=attr attrcol=label lsize=12
d.vect mysteiner_distance col=blue width=2

# Percorso più veloce
d.mon x1
d.vect myroads_net
d.vect -c centers icon=basic/triangle
d.font Vera
d.vect centers col=red disp=attr attrcol=label lsize=12
d.vect mysteiner_time col=blue width=2

VEDI ANCHE

d.path, v.net, v.net.alloc, v.net.iso, v.net.path, v.net.salesman

AUTORE

Radim Blazek, ITC-Irst, Trento, Italy
Documentation: Markus Neteler, Markus Metz

Last changed: $Date: 2011-11-08 10:42:51 +0100(mar, 08 nov 2011) $


Main index - vector index - Full index

© 2003-2011 GRASS Development Team