• Non ci sono risultati.

Individuazione 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.4 Individuazione dei nodi di intersezione

Come spiegato al paragrafo 5.1.3, gli elementi lineari che si intersecano alla stessa quota, originando così un’intersezione a raso, detengono sempre un nodo in comune.

Da una valutazione preliminare si è riscontrato che, tuttavia, il nodo in comune non è sempre posto all’estremità degli elementi lineari, ovvero, le strade non sempre si interrompono in corrispondenza delle intersezioni. Si possono, infatti, distinguere due casistiche di errore:

1. N elementi lineari hanno un nodo in comune ma nessuno degli N segmenti ha estremità in corrispondenza di tale intersezione, esempio in Figura 5-14.

Gli asterischi blu indicano le intersezioni in cui tutti i segmenti hanno un’estremità, mentre il pallino rosso, al contrario, quelle in cui nessun elemento ha estremità.

Il punto rosso, in questo caso, è un’intersezione a 4 bracci nella quale dovrebbero, dunque, convergere 4 elementi distinti. L’intersezione è stata, invece, rappresentata con 2 segmenti continui che si intersecano in un punto intermedio.

Figura 5-14 Prima tipologia di errore di rappresentazione dell'intersezione

79 2. N elementi lineari hanno un nodo in comune ma solo alcuni di questi hanno estremità in tale

intersezione, esempio in Figura 5-15.

Figura 5-15 Seconda tipologia di errore di rappresentazione dell’intersezione

In questo secondo caso, Figura 5-15, il segmento arancione si innesta in un nodo intermedio del percorso verde. Il pallino arancione rappresenta un’intersezione a 3 bracci che è stata, però, rappresentata con solo due elementi lineari.

La procedura corrente è, dunque, stata ideata principalmente per individuare e correggere questa tipologia di errore. Nel seguito si mostrano i passaggi da svolgere per classificare i nodi di intersezione:

1. Partendo dal layer StradeInterne, definito e ripulito nei precedenti paragrafi 5.1.4.2 e 5.1.4.3, è consigliabile, innanzitutto, eseguire il comando “Ripara geometrie”. È, infatti, frequente la presenza di vertici duplicati all’interno delle geometrie lineari, che, se non rimossi dal principio, possono alterare il buon esito della procedura o, quantomeno, renderla più complessa.

2. Occorre assegnare alle estremità degli elementi di Geometrie riparate un identificativo univoco basato sulla posizione, che verrà denominato GeoID. Questa operazione può essere effettuata attraverso il calcolatore di campi, come illustrato schematicamente in Tabella 5-6 e Tabella 5-7.

Tabella 5-6 Assegnazione del GeoID al nodo iniziale del vettore lineare Geometrie riparate

Geometrie riparate – Calcolatore di Campi Nome campo GeoID_i

Tipo campo Real(13, 10)

Formula ($x_at(0) + $y_at(0)) * $x_at(0)

Tabella 5-7 Assegnazione del GeoID al nodo finale del vettore lineare Geometrie riparate

Geometrie riparate – Calcolatore di Campi Nome campo GeoID_f

Tipo campo Real(13, 10)

Formula ($x_at(-1) + $y_at(-1)) * $x_at(-1)

80

3. Successivamente occorre estrarre i vertici dal vettore Geometrie riparate attraverso il comando

“Estrai vertici”.

4. Occorre, dunque, assegnare l’identificativo GeoID anche al layer Vertici appena estratto, Tabella 5-8.

Tabella 5-8 Assegnazione del GeoID ai nodi del vettore puntuale Vertici

Vertici – Calcolatore di Campi Nome campo GeoID

Tipo campo Real(13, 10) Formula ($x + $y) * $x

5. Si eliminano i nodi coincidenti, quindi con stesso GeoID, che appartengono allo stesso elemento stradale (osm_id).

È questo il caso di elementi lineari che formano un anello come, ad esempio, le rotatorie che spesso sono rappresentate come un loop chiuso su sé stesso. L’esempio della rotatoria merita un ulteriore commento che può essere d’aiuto per comprendere la procedura stessa:

Per semplicità si può dire che si è in presenza di un’intersezione quando in un punto convergono almeno 3 segmenti. Ragionando sui vertici estratti si può dire, invece, che l’intersezione si ha dove si sovrappongono almeno 3 punti.

La rotatoria in Figura 5-16 è costituita da un unico elemento chiuso ad anello e, dunque, ha estremo iniziale e finale sovrapposti (punto verde).

Sopprimendo i nodi duplicati dello stesso elemento lineare si va, dunque, ad eliminare un’estremità della rotatoria.

Figura 5-16 Rotatoria d’esempio

Così facendo sul punto verde si conteranno solo due vertici e, conseguentemente, l’intersezione non verrà individuata.

In un secondo momento, tuttavia, la rotatoria verrà spezzata in corrispondenza dei punti blu e risulterà costituita da 4 archi di cerchio distinti. Sul punto verde, questa volta, convergeranno 3 elementi diversi e, quindi, la presenza di 3 vertici sovrapposti permetterà l’individuazione dell’intersezione.

In definitiva un’estremità della rotatoria andrà inizialmente rimossa, poiché non c’è modo di valutare le auto-intersezioni e non fornirebbe alcuna informazione utile, ma ripetendo la procedura una seconda volta l’errore verrà automaticamente corretto.

81 L’eliminazione dei vertici coincidenti appartenenti allo stesso segmento può essere effettuata con il comando “Elimina duplicati per attributo” selezionando i campi osm_id e GeoID, come mostrato in Figura 5-17.

Figura 5-17 Eliminazione dei vertici duplicati appartenenti allo stesso segmento

6. A questo punto è possibile determinare se i vertici del layer Filtrato (nessun duplicato) costituiscono un’estremità per i segmenti osm_id da cui sono stati estratti. Questa verifica viene condotta valutando se il GeoID dei nodi coincide con il GeoID_i o con il GeoID_f, identificativi delle estremità degli elementi lineari, come mostrato in Tabella 5-9.

Tabella 5-9 Valutazione delle estremità convergenti nei vertici del layer Filtrato (nessun duplicato)

Filtrato (nessun duplicato) – Calcolatore di Campi Nome campo Extr

Tipo campo String(1)

Formula If("GeoID" = "GeoID_i", 'i', If("GeoID" = "GeoID_f", 'f', null ) )

7. Si aggregano, successivamente, i vertici del vettore Filtrato (nessun duplicato) con stesso GeoID, avendo cura di introdurre due nuovi campi:

• EL_Count che indicherà quanti elementi hanno un vertice nel nodo considerato;

• Extr_Count che indicherà il numero di elementi che hanno un vertice di estremità nel nodo considerato;

È possibile, inoltre, tenere traccia degli osm_id e delle estremità aggregate concatenando i relativi campi in una stringa, così da permetterne la supervisione anche in momenti successivi.

Questa fase può essere svolta ricorrendo allo strumento “Aggrega”, selezionando il GeoID come espressione di raggruppamento ed impostando gli altri parametri come illustrato in Figura 5-18.

82

Figura 5-18 Aggregazione dei vertici coincidenti

Il vettore così ottenuto potrà essere salvato come Nodi_v1.

8. L’ultimo passaggio consiste nel classificare i nodi sulla base dei criteri seguenti:

• Se n elementi lineari hanno un vertice nel nodo e per tutti gli n elementi tale vertice rappresenta un’estremità, si distinguono 3 possibili casi:

Se EL_Count = Extr_Count allora

▪ se EL_Count = 1, il nodo è un estremo isolato e quindi N_Class = ESTR;

▪ se EL_Count = 2, il nodo è un estremo di continuità e quindi N_Class = CONT43;

▪ se EL_Count > 2, il nodo è una intersezione e quindi N_Class = INT.

• Se un solo elemento lineare ha vertice nel nodo, ma il vertice di tale elemento non rappresenta un’estremità, allora il nodo è interno all’elemento lineare e non ha rilevanza per questa analisi:

Se EL_Count = 1 AND Extr_Count = 0 allora N_Class = Null.

• Se n elementi lineari hanno un vertice nel nodo, ma per nessuno degli n elementi tale vertice rappresenta un’estremità, allora il nodo è un’intersezione tra elementi da correggere:

Se EL_Count > 1 AND Extr_Count = 0 allora N_Class = ERR1.

• I nodi per cui nessuna delle precedenti condizioni risulta verificata saranno, per esclusione, vertici di più elementi lineari ed estremità di almeno un elemento. Anche in questo caso il nodo rappresenterà un’intersezione tra elementi da correggere:

Se EL_Count > 1 AND Extr_Count > 0 allora N_Class = ERR2;

43 Per estremo di continuità (CONT) si intende un nodo che segna il passaggio da un segmento stradale al successivo senza costituire un’intersezione. I segmenti, anche se consequenziali e senza diramazioni, vengono separati da OSM quando si assiste ad un cambio di geometria o quando, per la loro rappresentazione si superano i 2000 vertici. Vedere il paragrafo 5.1.2.

83 Tutte le precedenti condizioni possono essere scritte come formula da inserire nel calcolatore di campi per ottenere la N_Class, ovvero, la classificazione attribuita a ciascun nodo, Tabella 5-10.

Tabella 5-10 Classificazione dei vertici del vettore Nodi_v1

Nodi_v1 – Calcolatore di Campi Nome campo N_Class

Tipo campo String(4)

Formula

if( "EL_Count" = "Extr_Count", if( "EL_Count" =1,'ESTR', if( "EL_Count" = 2, 'CONT', 'INT')), if( "EL_Count" = 1 and "Extr_Count" = 0, null, if(

"EL_Count" > 1 and "Extr_Count" = 0, 'ERR1', if("EL_Count" > 1 and

"Extr_Count" > 0, 'ERR2', null))))

A titolo esemplificativo viene riportata la seguente Figura 5-19, in cui è possibile individuare almeno un nodo per ciascuna N_Class definita durante questa procedura di classificazione.

Figura 5-19 Output d’esempio al termine della procedura di classificazione dei Nodi_v1

84