alsperGIS DATI
SOFTWARE


Estrazione delle curve di livello da un DEM:

confronto tra GDAL, GRASS e SAGA.



Le curve di livello sono linee che uniscono tutti i punti con uno stesso valore. Quando il parametro rappresentato è l'altitudine prendono il nome di isoipse e costituiscono uno dei metodi più usati per integrare le informazioni di quota sulle mappa (soprattutto per scale  maggiori o uguali a 1:50'000).
>>> Visualizzazione grafica delle informazioni altimetriche: curve di livello.

Molte applicazioni GIS consentono di estrarre le curve di livello da dati raster creando un file vettoriale di linee quotate. In quasta pagina vengono confrontati i metodi di tre programmi: GDAL, GRASS e SAGA.
Tutti e tre i metodi possono essere usati da QGIS attraverso il plugin “Processing” (con installazione integrata di GRASS e SAGA).

strumenti processing di QGIS

Il confronto di opzioni e prestazioni dei comandi è stato fatto usando QGIS 2.8.6 con installazione OSGeo4W 64 bit su Windows7. Per il modulo di SAGA è stata fatta anche la prova direttamente dall'applicazione con l'installazione stand-alone e versione 2.2.3 (osgeo4w ha una versione più vecchia e ci sono alcune differenze).
Il confronto visivo delle curve prodotte è stato fatto con SAGA che consente di avere più viste sincronizzate e di mostrare il valore delle celle raster.


Il DEM utilizzato è un tassello ampio 1° x 1° del DSM AW3D30 con risoluzione 1 arcsec (circa 30 m) e precisione 16 bit (quindi solo valori interi). Esso copre un'area sub-pianeggiante (pianura padana e una porzione montuosa (prealpi); sono presenti alcuni buchi dovuti alla nuvolosità in cui il DEM ha valore -9999.

DEM pianura-prealpi



   GDAL (gdal_contour)


Il comando gdal_contour può essere richiamato da QGIS attraverso il menù “Raster > Estrazione > Curve di livello” oppure usando gli “Strumenti di Processing”: GDAL/OGR > [GDAL] Extraction > Contour lines (doppio clic per avviare).
(Personalmente consiglio il secondo modo poiché la finestra di dialogo presenta la scheda “Guida” in cui sono spiegate le opzioni aggiuntive.)

strumenti gdalgdal_contour

Tra le opzioni necessarie bisogna inserire:
- il “vettore” di ingresso che in realtà è il DEM raster da cui vogliamo estrarre le curve;
- l'intervallo tra le curve, ovvero l'equidistanza verticale;
- il nome dell'attributo (colonna in tabella associata) che conterrà il valore di quota di ogni curva;
- il file vettoriale di output che può essere tenuto in memoria (temporary) oppure salvato su disco (in tal caso specificare il percorso).
Si possono inserire anche parametri aggiuntivi che sono spiegati nella scheda “Guida” (oppure all'indirizzo www.gdal.org/gdal_contour.html). In questo esempio ho inserito “-snodata -9999” per indicare che le celle con valore -9999 non devono essere considerate.
Purtroppo non è prevista la possibilità di specificare valori di quota minimo e massimo entro cui estrarre le curve.



   GRASS (r.contour.step)


Tra i comandi di GRASS troviamo r.contour.step che permette di creare curve di livello a intervallo costante. Si accede alla finestra del comando attraverso gli “Strumenti di Processing”: Comandi di GRASS > Raster (r.*) > r.contour.step (doppio clic).
(esiste anche un comando r.contour.level per creare curve di livello a quote specifiche)

strumenti-grassgrass r.contour

Opzioni:
- input raster: DEM raster da cui vogliamo estrarre le curve;
- minimum e maximum contour levels: permettono di specificare un intervallo di quota entro cui limitare l'estrazione delle curve;
- increment between contour levels: equidistanza verticale tra le curve;
- minimum number of points...: permette di indicare un numero minimo di celle necessario per la creazione di una curva in modo da non considerare eventuali picchi dovuti ad errori casuali;
- estensione della regione di GRASS: lasciare in bianco per considerare l'estensione del DEM;
- il file vettoriale di output che può essere tenuto in memoria (temporary) oppure salvato su disco (in tal caso specificare il percorso).



   SAGA (contour lines from grid)


Possiamo usare il comando di SAGA da QGIS attraverso gli “Strumenti di Processing”: SAGA > Shapes - Grid >  Contour lines from grid (doppio clic).

strumenti-sagasaga contour lines from grid

In questo caso le opzioni sono molto più semplici:
- grid: DEM raster da cui vogliamo estrarre le curve;
- minimum e maximum contour value: permettono di specificare un intervallo di quota entro cui limitare l'estrazione delle curve;
- equidistance: equidistanza verticale tra le curve;
- contour lines: il file vettoriale di output che può essere tenuto in memoria (temporary) oppure salvato su disco (in tal caso specificare il percorso).



Attualmente (febbraio 2016) la versione di SAGA inclusa in OSGeo4W è ancora la 2.1.2. L'installazione “stand alone” disponibile dal sito di SAGA consente invece di avere la versione 2.2.3.
Usando direttamente l'applicazione SAGA il modulo  “contour lines from grid” è disponibile dal menù “Geoprocessing > Shapes > Grid > Vectorization >  Contour Lines From Grid”.

SAGA contour lines from gridSAGA contour lines from grid

La finestra di dialogo permette di impostare alcune opzioni in più rispetto all'uso della versione 2.1.2 tramite QGIS, in particolare:
- polygons: consente di salvare le curve di livello anche come poligoni:
- vertex type: si può scegliere tra x,y (2D) o x,y,z (3D):
- interpolation scale: permette di aumentare il valore di interpolazione per ottenere linee più smussate.




   Confronto


software
(installazione)
versione
GDAL
(OSGeo4W)
1.11.3-1
GRASS
(OSGeo4W)
6.4.3-5
SAGA
(OSGeo4W)
2.1.2-1
SAGA
(stand alone)
2.2.3
tempo
6 secondi 35 secondi 30 secondi 66 secondi
n° linee
n° nodi
14375
692320
14930
1010099
31384
1025801
15691
1010843
peso .shp
peso .dbf
11640 KB
295 KB
24725 KB
365 KB
17745 KB
1104 KB
16653 KB
552 KB


Si nota una significativa differenza di velocità nell'esecuzione: GDAL è decisamente il più veloce.
Osservando il n° di linee create vediamo che la versione 2.1.2 di SAGA produce circa il doppio delle curve, questo perché per ogni livello crea anche elementi di un solo punto (tale difetto non è presente nella versione 2.2.3).





   Confronto delle curve prodotte

(cliccare sulle immagini per aprirle a piena risoluzione)


La prima differenza, dovuta alle diverse opzioni disponibili per i comandi, è in corrispondenza dei “buchi” (intesi come aree con assenza di dato): GDAL permette di specificare i valori nulli che quindi sono ignorati e non vengono create curve attorno ad essi. GRASS e SAGA invece trattano tali buchi come depressioni e quindi vengono create le relative curve di livello.




GDAL traccia le curve fino al bordo del raster mentre GRASS e SAGA le fermano al centro della cella di confine; SAGA 2.1.2 a volte ferma la curva una cella prima del confine.




Le linee prodotte da GDAL non si toccano mai tra loro mentre con gli altri metodi può esserci congiunzione in corrispondenza di nodi o segmenti ed eventuale creazione di tratti “appesi”. Inoltre in presenza di singole celle raster continenti valori “buoni” (cioè corrispondenti ai passi dell'equidistanza) GDAL crea una piccola polilinea di quattro vertici; gli altri metodi creano anch'essi una geometria ma con i nodi coincidenti (quindi con lunghezza nulla) e che risulta invisibile nella vista di QGIS e pochissimo visibile in quella di SAGA. Se le celle “buone” sono due (o più ma allineate) GRASS e SAGA creano linee chiuse ma collassate che sembrano segmenti, mentre GDAL produce una linea visivamente più corretta.
GDAL sembra quindi migliore almeno dal punto di vista topologico.




Oltre alla topologia ci sono altre differenze. In corrispondenza di rilievi “regolari” le geometrie sono praticamente identiche. Se però esaminiamo le zone sub-pianeggianti o altri punti (soprattutto in valli o su creste) dove il pendio è incerto i risultati possono essere diversi e personalmente trovo difficile stabilire quale algoritmo sia migliore in assoluto.





 
Argomenti correlati
> DEM
> Curve di livello
> QGIS
> GDAL
> GRASS
> SAGA










Febbraio 2016
Alessandro Perego