Salta al contenuto principale

Alla scoperta di GRASS GIS: Il Gigante Open Source dell'Analisi Geospaziale

Inviato da tuxsa il
grass

GRASS GIS: Il Motore Scientifico Open Source per l'Analisi Spaziale

Nato nel 1982 per conto dell'esercito statunitense e oggi pilastro della fondazione OSGeo, GRASS non è un semplice visualizzatore di mappe. È un potentissimo motore di calcolo scientifico per dati raster, vettoriali e d'immagine.

Il vero punto di forza di GRASS è la sua architettura scientifica. A differenza di altri software focalizzati sulla cartografia e sulla veste grafica, GRASS nasce per l'elaborazione rigorosa dei dati.

I suoi superpoteri:

  • Analisi Raster Avanzata: Eccelle nell'idrologia (delimitazione di bacini idrografici, flussi d'acqua), nell'analisi dei modelli digitali del terreno (DEM) e nella geomorfologia.
  • Topologia Vettoriale Reale: GRASS gestisce i vettori in modo rigorosamente topologico. Se due poligoni confinano, condividono la stessa linea di confine, azzerando errori di sovrapposizione o "buchi" geometrici.
  • Telerilevamento (Remote Sensing): Include strumenti nativi per elaborare immagini satellitari (Landsat, Sentinel) e dati LiDAR.
  • Pronto per l'Automazione: Ogni comando GRASS è eseguibile da riga di comando o tramite Python. È il motore perfetto per l'elaborazione massiva di dati (batch processing).

Quando usarlo?

Scegli GRASS quando devi fare analisi spaziale complessa, modellazione ambientale o quando i software GIS tradizionali rallentano a causa della mole di dati (Big Data geospaziali).

Nel mondo aziendale e accademico, il principale rivale commerciale è Esri ArcGIS Pro. Vediamo come si comportano a confronto:

CaratteristicaGRASS GISArcGIS Pro (Proprietario)
CostoGratis, Open Source (Licenza GPL)Licenze commerciali costose (migliaia di €/anno)
Gestione DatiDatabase interno rigoroso (Location/Mapset)File Geodatabase flessibile ma proprietario
Analisi 3D e RasterStrumenti nativi potentissimi, inclusi nel coreRichiede estensioni a pagamento (es. Spatial Analyst)
Interfaccia UtenteFunzionale, ma richiede una curva di apprendimentoModerna, in stile Microsoft Office, molto intuitiva
AutomazioneIntegrazione Python nativa e snellaArcPy e ModelBuilder (molto potenti ma vincolati)

Il verdetto: ArcGIS Pro vince sulla facilità d'uso e sulla produzione di mappe pronte per la stampa. GRASS GIS stravince sulla potenza di calcolo pura, sulla trasparenza degli algoritmi (puoi leggere il codice sorgente di ogni singola funzione) e, ovviamente, sull'abbattimento totale dei costi di licenza.

---

Installazione

GRASS è multipiattaforma. Ecco come averlo sul tuo computer in pochi minuti:

  1. Scarica l'installer: Windows, Mac o Linux.

    Vai sul sito ufficiale grass.osgeo.org e accedi alla sezione Download.

  2. Procedi su Windows: Consigliato: OSGeo4W.

    Se sei su Windows, scarica l'installer standalone oppure usa OSGeo4W. Quest'ultimo è un gestore che installa GRASS, QGIS e tutte le librerie necessarie in un colpo solo, garantendo la massima compatibilità.

  3. Procedi su Mac/Linux: Via Package Manager.

    Su Mac puoi usare l'installer .dmg o Homebrew (brew install grass). Su Linux (Ubuntu/Debian) basta un comando da terminale: sudo apt install grass.

---

Piccolo Manuale d'Uso: I Tuoi Primi Passi

La prima volta che apri GRASS potresti rimanere spiazzato: la gestione dei progetti è diversa da qualsiasi altro software. GRASS organizza tutto in una struttura gerarchica rigida per proteggere l'integrità dei dati geografici.

1. Capire la struttura (La "Database Structure")

Prima di importare un dato, devi definire il tuo spazio di lavoro:

  • GRASS Database (directory): Una cartella sul tuo PC dove GRASS salverà tutto.
  • Location: Il tuo progetto principale. Tutti i dati dentro una Location devono avere lo stesso sistema di riferimento geografico (es. EPSG:32632).
  • Mapset: Sotto-cartelle dentro la Location. Utili per dividere il lavoro per utenti o per sessioni (il mapset di default si chiama PERMANENT).

2. L'Interfaccia Grafica (GUI)

All'avvio si apriranno due finestre principali:

  1. La finestra di Controllo dei Livelli: Dove gestisci i layer (raster, vettori), i Mapset e dove cerchi i comandi.
  2. La finestra di Visualizzazione della Mappa: Dove vedi effettivamente i tuoi dati geografici.

3. I Comandi Chiave (La "Grammatica" di GRASS)

I comandi di GRASS hanno tutti un prefisso logico che ti permette di capire subito cosa fanno:

  • g.* = Comandi generali (es. g.region per impostare l'area di calcolo).
  • r.* = Comandi per i dati Raster (es. r.slope.aspect per calcolare pendenza ed esposizione).
  • v.* = Comandi per i dati Vettoriali (es. v.buffer per creare aree di rispetto).
  • i.* = Comandi per l'elaborazione di immagini satellitari.

Regola d'oro di GRASS: Prima di lanciare qualsiasi comando raster, definisci la tua Regione di calcolo con il comando g.region. GRASS elaborerà i dati solo all'interno di questa estensione geometrica e alla risoluzione da te impostata, risparmiando tempo e memoria.

GRASS GIS richiede un piccolo sforzo iniziale per digerire la sua logica rigida ("Location" e "Mapset"), ma ripaga ampiamente questo investimento. È uno strumento da scienziati: preciso, leggero, incredibilmente veloce ed estremamente flessibile grazie all'integrazione con Python. Se il tuo obiettivo è fare analisi spaziale seria senza spendere un patrimonio in licenze, GRASS merita assolutamente un posto nel tuo flusso di lavoro.

---

Automatizzare GRASS con Python: Script per il Calcolo della Pendenza

Per far girare questo script, puoi aprirlo direttamente dall'interfaccia grafica di GRASS andando su File > Sotto-finestra Python, oppure salvarlo come file .py e lanciarlo dal terminale di GRASS.

Utilizzeremo la libreria nativa grass.script, che funge da ponte tra Python e il motore di calcolo del software.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import grass.script as gs

def elabora_e_esporta_pendenza(nome_dem, prefisso_output, cartella_destinazione):
   """
   Automatizza il calcolo di pendenza e esposizione da un DEM
   e esporta i risultati direttamente in formato GeoTIFF.
   """
   print(f"--- Inizio elaborazione per: {nome_dem} ---")

   # 0. Assicuriamoci che la cartella di destinazione esista sul PC
   if not os.path.exists(cartella_destinazione):
       os.makedirs(cartella_destinazione)
       print(f"Cartella creata: {cartella_destinazione}")

   # 1. Controllo presenza del file DEM nel Mapset corrente
   lista_raster = gs.list_pairs(type='raster')
   nomi_raster = [mappa[0] for mappa in lista_raster]

   if nome_dem not in nomi_raster:
       print(f"Errore: Il raster '{nome_dem}' non è stato trovato.")
       return

   # 2. Impostazione della regione di calcolo sul DEM di input
   print("Impostazione della regione di calcolo...")
   gs.run_command('g.region', raster=nome_dem)

   # Definizione dei nomi dei layer interni a GRASS
   mappa_pendenza = f"{prefisso_output}_pendenza"
   mappa_esposizione = f"{prefisso_output}_esposizione"

   # 3. Calcolo di pendenza (Slope) ed esposizione (Aspect)
   print("Calcolo della pendenza e dell'esposizione in corso...")
   gs.run_command('r.slope.aspect',
                  elevation=nome_dem,
                  slope=mappa_pendenza,
                  aspect=mappa_esposizione,
                  format='degrees',
                  overwrite=True)

   # 4. ESPORTAZIONE IN GEOTIFF VIA R.OUT.GDAL
   # Definiamo i percorsi completi dei file di output sul PC
   path_tiff_pendenza = os.path.join(cartella_destinazione, f"{mappa_pendenza}.tif")
   path_tiff_esposizione = os.path.join(cartella_destinazione, f"{mappa_esposizione}.tif")

   print("\nEsportazione dei file in formato GeoTIFF...")

   # Esportazione raster pendenza
   gs.run_command('r.out.gdal',
                  input=mappa_pendenza,
                  output=path_tiff_pendenza,
                  format='GTiff',
                  nodata=-9999,        # Definisce il valore per i pixel vuoti
                  overwrite=True)
   print(f"Esportato: {path_tiff_pendenza}")

   # Esportazione raster esposizione
   gs.run_command('r.out.gdal',
                  input=mappa_esposizione,
                  output=path_tiff_esposizione,
                  format='GTiff',
                  nodata=-9999,
                  overwrite=True)
   print(f"Esportato: {path_tiff_esposizione}")

   print("\n--- Processo completato con successo! ---")

# --- ESECUZIONE DELLO SCRIPT ---
if __name__ == "__main__":
   # Parametri di configurazione
   nome_input_dem = 'il_mio_dem' 
   prefisso_file_uscita = 'analisi_territorio'
   
   # Inserisci il percorso della cartella sul tuo PC dove vuoi salvare i GeoTIFF
   # NOTA: Usa lo slash su Mac/Linux o il doppio backslash \\ su Windows (es. "C:\\Utenti\\Nome\\Desktop\\Output")
   cartella_output_pc = "./output_geotiff" 
   elabora_e_esporta_pendenza(nome_input_dem, prefisso_file_uscita, cartella_output_pc)

Ecco i 3 concetti chiave:

  1. gs.run_command(): È la funzione principale per eseguire i moduli di GRASS. I parametri del comando diventano semplicemente argomenti di Python (es. elevation=nome_dem).

  2. g.region integrato: Automatizzare la regione di calcolo tramite script evita l'errore tipico dei principianti, ovvero calcolare la pendenza su un'area diversa da quella del file di input, generando file vuoti o pixel disallineati.

  3. gs.read_command(): A differenza di run_command (che esegue e basta), questa funzione cattura l'output testuale dell'algoritmo (in questo caso r.univar, che calcola media, minimo, massimo e deviazione standard) e lo restituisce direttamente nella console di Python.

 

Con un ciclo for, questo identico script potrebbe elaborare centinaia di DEM regionali in automatico mentre ti prendi un caffè.