• Non ci sono risultati.

Correzione degli elementi lineari in corrispondenza dei nodi di intersezione

5. Costruzione del grafo di riferimento

5.1. Grafo OpenStreetMap

5.1.4 La procedura di costruzione del grafo OSM

5.1.4.5 Correzione degli elementi lineari in corrispondenza dei nodi di intersezione

84

85 4. Per ottenere i punti traslati, che costituiranno la seconda estremità delle linee di taglio, sarà

sufficiente, a questo punto, eseguire i seguenti passaggi:

• aprire il file Nodi_Start-End_v1.dbf con Excel e salvare il contenuto del foglio di calcolo come Nodi_End_v1.csv;

• importare Nodi_End_v1.csv su Q-GIS selezionando, come coordinate, “Campo X” = Xf e

“Campo Y” = Yf;

• esportare il vettore Nodi_End_v1, appena ottenuto, sul file Nodi_Start-End_v1.shp selezionando l’opzione “Aggiungi al layer” presente nella finestra di dialogo che verrà mostrata, Figura 5-20.

Figura 5-20 Aggiunta di Nodi_End_v1 al layer Nodi_Start-End_v1

5. Utilizzando lo strumento “Da punti a percorso” sul layer Nodi_Start-End_v1, appena ottenuto, e selezionando GeoID come “Espressione del gruppo di percorso”, si otterranno, infine, le linee su cui eseguire lo split di EL_ERR_v1, Figura 5-21.

Figura 5-21 Generazione delle Linee_Split_v1 dalla congiunzione dei Nodi_Start-End_v1 con stesso GeoID

Le linee, così generate, possono essere esportate come Linee_Split_v1.shp.

86

Nella seguente Figura 5-22 si riporta un esempio dell’output ottenuto.

Figura 5-22 Esempio di output ottenuto a seguito della generazione delle linee di taglio

6. Come ulteriore accorgimento è consigliabile, infine, isolare gli elementi lineari da spezzare, così da evitare il troncamento inopportuno dei segmenti non interessati dalla correzione. I segmenti effettivamente da correggere sono esclusivamente quelli che hanno un vertice nel nodo ERR che non costituisce un’estremità.

Valutando, quindi, gli attributi “EL_ID” ed “Extr” del layer Nodi_ERR_v1, si introduce il nuovo campo

“EL_Split” in cui elencare gli osm_id degli elementi senza estremità, Tabella 5-13.

Tabella 5-13 Concatenamento degli osm_id senza estremità nei punti del vettore Nodi_ERR_v1

Nodi_ ERR_v1 – Calcolatore di Campi Nome campo EL_Split

Tipo campo String(40)

Formula

array_to_string( array_filter( array_foreach( generate_series( 0, array_length( string_to_array( "EL_ID", ','))-1), if(array_get(string_to_array( "Extr", ','), @element) = '', array_get(string_to_array( "EL_ID", ','), @element), '')), @element <> ''))

Successivamente si ripartiscono in n colonne distinte gli n osm_id precedentemente concatenati, Tabella 5-14.

Tabella 5-14 Ripartizione degli osm_id concatenati all’interno del campo EL_Split del vettore Nodi_ERR_v1

Nodi_ ERR_v1 – Calcolatore di Campi Nome campo EL_Split-n

Tipo campo String(10)

Formula array_get( string_to_array( "EL_Split" , ','), n-1)

Elementi da spezzare Nodo traslato

verso ovest

Linea di taglio ottenuta

Nodo ERR1

87 Questa operazione è chiaramente da ripetere n volte avendo cura di rimpiazzare la n con l’iterazione raggiunta. Nel caso in esame sarà sufficiente generare 3 nuove colonne: EL_Split-1, EL_Split-2, EL_Split-3.

7. Gli elementi stradali da troncare risultano, a questo punto, elencati negli n campi EL_Split del vettore Nodi_ERR_v1. Per selezionare tali elementi, occorre, dunque, effettuare n operazioni di join tra i layer StradeInterne e Nodi_ERR_v1, mantenendo fisso il “Campo destinazione” (osm_id) e cambiando ogni volta il “Campo unione” (EL_Split-n), Figura 5-23.

Figura 5-23 join di StradeInterne con Nodi_ERR_v1 attraverso l'osm_id

Per memorizzare l’esito del primo join si genera un nuovo campo “ERR”, in cui riportare “t” (true) se l’elemento è stato unito o, viceversa, f (false). Il successo del join può, ad esempio, essere valutato osservando il campo N_Class che sarà, infatti, nullo solo se l’unione non produce alcun risultato, Tabella 5-15.

Tabella 5-15 Individuazione degli elementi da correggere contenuti nel vettore StradeInterne (iterazione 1)

StradeInterne – Calcolatore di Campi Nome campo ERR

Tipo campo String(1)

Formula if( "Nodi_ERR_v1_N_Class" is null, 'f', 't')

Dal secondo join in poi il campo “ERR” sarà già stato definito e sarà, dunque, sufficiente aggiornarlo prestando, però, attenzione a non sovrascrivere i precedenti risultati favorevoli (t), Tabella 5-16.

Tabella 5-16 Individuazione degli elementi da correggere contenuti nel vettore StradeInterne (iterazione n)

StradeInterne – Calcolatore di Campi Aggiorna Campo ERR

Tipo campo String(1)

Formula if( "ERR" = 't', 't', if( "Nodi_ERR_v1_N_Class" is null, 'f', 't'))

88

8. A questo punto si potranno selezionare ed esportare su due differenti file gli elementi di StradeInterne che necessitano di essere spezzati e quelli già corretti:

• Gli elementi di StradeInterne con ERR = ‘t’ (1071 elementi) saranno salvati sul file EL_ERR_v1.shp;

• Gli elementi di StradeInterne con ERR = ‘f’ (8104 elementi) saranno salvati sul file EL_Corretti_v1.shp.

9. Si possono ora spezzare gli EL_ERR_v1 in corrispondenza delle Linee_Split_v1 con lo strumento SAGA “Split Lines with Lines”, Figura 5-24.

Figura 5-24 Troncamento di EL_ERR_v1 in corrispondenza di Linee_Split_v1

10. A seguito del troncamento sul vettore Intersection saranno presenti dei segmenti con lunghezza nulla che occorrerà rimuovere prima di salvare il risultato. Si può eseguire questa pulizia aggiungendo, tramite il calcolatore di campi, la colonna “L” contenente la lunghezza dei segmenti, Tabella 5-17, per poi selezionare ed eliminare gli elementi con lunghezza nulla.

Tabella 5-17 Individuazione dei segmenti con lunghezza nulla presenti sul vettore Intersection

Intersection – Calcolatore di Campi Nome campo L

Tipo campo Real(10, 3) Formula $length

Nel caso in esame il vettore Intersection conterrà, ora, solo i segmenti spezzati con lunghezza non nulla, per un totale di 3400 elementi.

89 11. Prima di procedere oltre è possibile eseguire un breve test per verificare che l’operazione di troncamento non abbia prodotto una frammentazione indesiderata, valutando che il numero di elementi generati sia quello effettivamente atteso.

Il numero di elementi che dovranno risultare a seguito del troncamento dovrà essere pari alla somma del numero di segmenti pre-troncamento, quelli contenuti sul layer EL_ERR_v1 (1071), più il numero di tagli da effettuare, pari al numero di osm_id che vengono elencati nelle colonne EL_Split-1, EL_Split-2 ed EL_Split-3 del vettore Nodi_ERR_v1. In altri termini se N nodi classificati come ERR appartengono all’elemento X senza che nessuno di questi costituisca un’estremità di tale elemento, allora l’elemento X dovrà essere tagliato in N punti risultando, infine, separato in N + 1 segmenti.

La verifica può essere condotta aprendo Nodi_ERR_v1.dbf in Excel ed, ipotizzando di ritrovare i campi EL_Split-1, EL_Split-2 ed EL_Split-3 rispettivamente nelle colonne U, V e W, inserendo la seguente Formula 5-1 nella prima cella vuota.

Formula 5-1 Verifica del numero di elementi troncati presenti sul file Nodi_ERR_v1.dbf

=CONTA.VALORI(U2:W1048576)+CONTA.VALORI(UNICI(FILTRO(DATI.ORDINA(

DATI.ORDINA(SE(U2:U1048576="";0;U2:U1048576);1;1)+SE(V2:V1048576="";0;V2:V1048576);1;1) +SE(W2:W1048576="";0;W2:W1048576);DATI.ORDINA(DATI.ORDINA(SE(U2:U1048576="";0;U2:U 1048576);1;1)+SE(V2:V1048576="";0;V2:V1048576);1;1)+SE(W2:W1048576="";0;W2:W1048576)<

>0)))

Il primo addendo fornisce il numero di troncamenti totale mentre il secondo il numero di elementi da troncare. Si propone una spiegazione ulteriore per il secondo addendo poiché di difficile interpretazione:

• le funzioni SE, così scritte, convertono ciascuna colonna in una matrice colonna di 1048575 elementi contenente nelle prime righe gli osm_id ed, a seguire, una serie di elementi nulli;

• con la funzione DATI.ORDINA più annidata si ordina la prima matrice in senso crescente, così da garantire che dalla somma con la seconda matrice gli osm_id vengano sempre sommati al valore 0;

• con la seconda funzione DATI.ORDINA si ordina in senso crescente la somma delle prime due matrici così da poterle sommare con la terza, per la stessa ragione vista prima;

• con la funzione FILTRO vengono, dunque, rimossi dalla somma delle tre matrici tutti gli elementi nulli;

• con la funzione UNICI vengono, infine, rimossi tutti gli elementi duplicati conservando esclusivamente gli osm_id univoci.

Se il valore risultante dalla formula corrisponde al numero di elementi contenuti nel layer Intersection allora la verifica è soddisfatta.

12. Si può, quindi, esportare il vettore Intersection sul layer EL_Corretti_v1 selezionando “Aggiungi al layer”.

13. A questo punto il numero di elementi presenti su EL_Corretti_v1 sarà superiore al numero di osm_id univoci. Occorre, dunque, generare una nuova colonna in cui elencare un nuovo set di identificativi univoci, Tabella 5-18.

90

Tabella 5-18 Attribuzione di un nuovo set di identificativi univoci per gli elementi del vettore EL_Corretti_v1

EL_Corretti_v1 – Calcolatore di Campi Nome campo EL_ID

Tipo campo String(10) Formula @row_number

14. È importante, infine, non trascurare l’aggiornamento dei campi GeoID_i e GeoID_f del layer EL_Corretti_v1.

Si fa presente che per reiterare la procedura descritta sino a questo punto sarà sufficiente ripercorrere i medesimi passi con l’accortezza di sostituire gli opportuni valori:

• utilizzare il nuovo EL_ID al posto di osm_id;

• sceglie il layer EL_Corretti_v1 invece di StradeInterne;

• salvare tutti i nuovi file terminando la denominazione con “_v2” e non più con “_v1”.