5. Costruzione del grafo di riferimento
5.3. Grafo risultante
5.3.1 Proiezione degli attributi BDTRE sul grafo OSM
5.3.1.5 Determinazione delle proprietà globali
166
167 Impostando le lunghezze dei campi in uscita a 254 caratteri verrà mostrato un messaggio di errore in caso di superamento del limite. Questo torna utile per stabilire quali campi dovranno essere ripartiti nel passaggio successivo. Le lunghezze mostrate in Figura 5-82 sono quelle necessarie affinché l’aggregazione della prima iterazione vada a buon fine.
Al termine dell’aggregazione, si suggerisce di non chiudere la finestra di comando, così da mantenere i settaggi già impostati per le iterazioni successive.
3. A seguito dell’aggregazione è necessario ripartire su due colonne tutti i campi del vettore Aggregato che superano la lunghezza limite di 254 caratteri. È noto, nel caso corrente, che i campi che potrebbero eccedere la lunghezza massima sono AGG_EL_ID1, AGG_L1 ed AGG_C1 e, perciò, si predispongono le formulazioni necessarie per la loro eventuale ripartizione, mostrate rispettivamente in Tabella 5-79, Tabella 5-80 e Tabella 5-81.
Tabella 5-79 Ripartizione del campo AGG_EL_ID1 in 2 colonne di lunghezza inferiore a 254 caratteri
Aggregato – Calcolatore di Campi Nome campo AGG_EL_ID2
Tipo campo String(254) Formula
if( length( "AGG_EL_ID1" ) <= 254, null , array_to_string( array_slice(
string_to_array( "AGG_EL_ID1", ','), floor( array_length(
string_to_array( "AGG_EL_ID1", ','))/2 + 1), -1) ) )
Aggregato – Calcolatore di Campi Aggiorna campo
esistente AGG_EL_ID1 Tipo campo String(254) Formula
if( length( "AGG_EL_ID1" ) <= 254, "AGG_EL_ID1", array_to_string(
array_slice( string_to_array( "AGG_EL_ID1", ','), 0, floor( array_length(
string_to_array( "AGG_EL_ID1", ','))/2) ) ) )
Tabella 5-80 Ripartizione del campo AGG_L1 in 2 colonne di lunghezza inferiore a 254 caratteri
Aggregato – Calcolatore di Campi Nome campo AGG_L2
Tipo campo String(254) Formula
if( length( "AGG_L1" ) <= 254, null , array_to_string( array_slice(
string_to_array( "AGG_L1", ','), floor( array_length( string_to_array(
"AGG_L1", ','))/2 + 1), -1) ) )
Aggregato – Calcolatore di Campi Aggiorna campo
esistente AGG_L1
Tipo campo String(254) Formula
if( length( "AGG_L1" ) <= 254, "AGG_L1", array_to_string( array_slice(
string_to_array( "AGG_L1", ','), 0, floor( array_length(
string_to_array( "AGG_L1", ','))/2) ) ) )
168
Tabella 5-81 Ripartizione del campo AGG_C1 in 2 colonne di lunghezza inferiore a 254 caratteri
Aggregato – Calcolatore di Campi Nome campo AGG_C2
Tipo campo String(254) Formula
if( length( "AGG_C1" ) <= 254, null , array_to_string( array_slice(
string_to_array( "AGG_C1", ','), floor( array_length( string_to_array(
"AGG_C1", ','))/2 + 1), -1) ) )
Aggregato – Calcolatore di Campi Aggiorna campo
esistente AGG_C1
Tipo campo String(254) Formula
if( length( "AGG_C1" ) <= 254, "AGG_C1", array_to_string(
array_slice( string_to_array( "AGG_C1", ','), 0, floor( array_length(
string_to_array( "AGG_C1", ','))/2) ) ) )
La prima aggregazione è quella che coinvolge il maggior numero di elementi e, quindi, vede ben 3 campi eccedere il limite dei 254 caratteri: AGG_EL_ID1, AGG_L1 ed AGG_C1.
Nelle iterazioni 2 e 3 saranno solo i campi AGG_EL_ID1 ed AGG_L1 a superare il limite, mentre la lunghezza di AGG_C1 potrà essere reimpostata a 254.
Dalla quarta iterazione in poi non è più necessario dividere le colonne e conviene impostare la lunghezza massima di tutti i campi in uscita a 254 caratteri, così che in caso di superamento dei limiti compaia un messaggio d’errore.
4. Si esporta il vettore Aggregato sul file Archi_BDTRE-OSM.shp scegliendo “Aggiungi al layer” per le iterazioni successive alla prima.
5. Si ripetono i 4 passaggi precedenti per tutte e 13 le colonne Arco_OSM, ricordando, in fase di aggregazione (punto 2), di sostituire i parametri, evidenziati in giallo in Figura 5-82, con quelli corrispondenti all’iterazione in corso (Arco_OSMn).
Al termine di questo processo iterativo si ottiene il vettore Archi_BDTRE-OSM contenente un numero di elementi pari al totale di archi OSM (7551). A ciascun elemento del vettore viene associato l’identificativo univoco Arco_OSM ed il concatenamento degli attributi di tutti gli elementi BDTRE aggregati insieme.
Si possono, a questo punto, determinare le proprietà globali di ciascun elemento del vettore Archi_BDTRE-OSM, analogamente a quanto visto nel corso del paragrafo 5.2.6.4:
• Per gli attributi TGM, Vf e V si possono utilizzare le stesse esatte formulazioni mostrate al paragrafo 5.2.6.4, rispettivamente al punto 1 ed al punto 3.
• Per quanto riguarda le capacità Cmin e Cmed, le formulazioni proposte al paragrafo 5.2.6.4, punto 2, vanno ricorrette per tener conto del fatto che l’attributo AGG_C è stato, in questo caso, ripartito nei due campi AGG_C1 ed AGG_C2.
169
Tabella 5-82 Implementazione in Q-GIS del calcolo di Cmin, stimata ipotizzando l’effetto “collo di bottiglia”
Archi_BDTRE-OSM – Calcolatore di Campi Nome campo Cmin
Tipo campo Integer(5)
Formula array_min( array_foreach( string_to_array( if("AGG_C2" is null,
"AGG_C1", concat("AGG_C1", ',', "AGG_C2")), ','), to_int(@element)) )
Tabella 5-83 Implementazione in Q-GIS del calcolo di Cmed, stimata secondo le ipotesi di Greenshields
Archi_BDTRE-OSM – Calcolatore di Campi Nome campo Cmed
Tipo campo Integer(5)
Formula
array_sum( array_foreach( generate_series( 0, array_length(
string_to_array( if("AGG_C2" is null, "AGG_C1", concat("AGG_C1", ',',
"AGG_C2")) ,',') )-1), array_get( string_to_array( if("AGG_C2" is null,
"AGG_C1", concat("AGG_C1", ',', "AGG_C2")) ,','), @element) * array_get( array_cat( string_to_array("AGG_L1", ','), if("AGG_L2" is null, array(), string_to_array("AGG_L2", ','))), @element) /1000 / array_get( string_to_array("AGG_Vf" ,','), @element) ) ) / array_sum( array_foreach( generate_series( 0, array_length(
string_to_array( if("AGG_C2" is null, "AGG_C1", concat("AGG_C1", ',',
"AGG_C2")) ,',') )-1), array_get( array_cat( string_to_array("AGG_L1", ','), if("AGG_L2" is null, array(), string_to_array("AGG_L2", ','))),
@element) /1000 / array_get( string_to_array( "AGG_Vf" ,','),
@element) ) )
A questo punto, tutti gli attributi globali ottenuti possono essere trasferiti al grafo OSM semplicemente eseguendo un join del vettore Archi con il layer Archi_BDTRE-OSM, attraverso l’identificativo Arco_OSM.
Con quest’ultima operazione la procedura di proiezione degli attributi BDTRE sugli archi del grafo OSM può dirsi conclusa. Le proprietà globali degli archi risultano distribuite in maniera del tutto analoga a quanto mostrato nel paragrafo 5.2.6.4, con differenze minime dovute alla differente numerosità degli elementi presenti sui due grafi, come mostrato in Tabella 5-84.
Tabella 5-84 Distribuzione degli attributi globali – Confronto tra grafo BDTRE e grafo OSM risultante
Attributo TGM Cmin Cmed Vf V
Grafo BDTRE OSM BDTRE OSM BDTRE OSM BDTRE OSM BDTRE OSM
Intervallo 1 20.0% 20.0% 11.1% 11.7% 9.4% 9.0% 29.3% 28.8% 31.9% 31.2%
Intervallo 2 20.0% 20.2% 40.6% 42.4% 33.9% 33.1% 35.1% 34.9% 35.5% 35.5%
Intervallo 3 20.2% 19.9% 15.5% 15.0% 19.4% 19.4% 15.9% 16.2% 16.0% 16.4%
Intervallo 4 19.9% 19.9% 15.7% 15.0% 17.5% 18.2% 11.5% 11.7% 9.7% 9.7%
Intervallo 5 19.9% 20.0% 17.1% 15.9% 19.8% 20.3% 8.1% 8.5% 6.8% 7.1%
Tot archi 7334 7551 7334 7551 7334 7551 7334 7551 7334 7551
Le proprietà globali, risultanti dal processo di “proiezione geometrica”, non si discostano, dunque, da quelle associate agli archi del grafo BDTRE e, pertanto, rimangono valide le stesse osservazioni riportate nel paragrafo 5.2.6.4 a pag. 152.
I risultati ottenuti sono mostrati nelle seguenti Figura 5-83, Figura 5-84, Figura 5-85, Figura 5-86 e Figura 5-87.
170
Figura 5-83 Rappresentazione del TGM ricavato per ciascun arco del grafo risultante [veicoli/giorno]
Figura 5-84 Rappresentazione di Cmin ricavata per ciascun arco del grafo risultante [veicoli/ora]
171
Figura 5-85 Rappresentazione di Cmed ricavata per ciascun arco del grafo risultante [veicoli/ora]
Figura 5-86 Rappresentazione della Vf ricavata per ciascun arco del grafo risultante [km/h]
172
Figura 5-87 Rappresentazione della V ricavata per ciascun arco del grafo risultante [km/h]