Vari strumenti di SAGA-GIS per l'analisi idrologica sono in corso di integrazione direttamente in QGIS

Nell’ultimo periodo, vari tool di SAGA-GIS (che prima erano utilizzabili in QGIS solo tramite l’apposito plugin attualmente non più disponibile nel repository ufficiale) sono stati integrati, e altri sono in corso di integrazione, direttamente nel core di QGIS come nuovi algoritmi di processing nativi.

Tali nuovi algoritmi di processing vengono sviluppati grazie al crowdfunding avviato da Hans van der Kwast e grazie a chi ha dato il suo contributo permettendo di raggiungere e superare l’importo necessario per le spese di sviluppo.

Un elenco di Pull Request che implementano le funzionalità di SAGA-GIS in QGIS è disponibile tramite l’URL Pull requests · qgis/QGIS · GitHub

Per quanto riguarda il plugin “Processing Saga NextGen Provider” che prima era disponibile nel repository ufficiale dei plugin di QGIS, ma che attualmente non lo è più: Sebastian Gutwein sta continuando lo sviluppo del plugin rendendolo compatibile con QGIS 4 e risolvendo alcuni dei problemi presenti. L’ultima versione da lui sviluppata è la versione 1.3.0 e può essere scaricata e installata a partire dall’URL Releases · baswein/qgis-processing-saga-nextgen · GitHub

Quando lo riterrà opportuno, Sebastian Gutwein renderà disponibile una nuova versione del plugin anche nel repository ufficiale Processing Saga NextGen Provider — QGIS Python Plugins Repository

A presto.

Andrea

2 Likes

avevo visto la richiesta di crowdfinding ma mi ero fermato perché avevo inteso riguardasse solo (?) i moduli idrologici di SAGA.

io sono interessato a che sia inserito nel core anche il modulo di rasterizzazione di SAGA, non perché sia più efficace/efficiente dell’analogo di GDAL ma perché permette in fase in ingresso di indicare la modalità di rasterizzazione del dato vettoriale sottostante, o, meglio, dei valori del parametro del campo da rasterizzare che intersecano la nuova cella.
Infatti permette di scegliere quale sarà il valore che sarà “adottato” nel raster finale, in particolare:
[0] first
[1] last
[2] minimum
[3] maximum
[4] mean

Attualmente in GDAL questo non è possibile e il valore rasterizzato è il primo.
per poter fare quello che permette SAGA, bisogna prima applicare “Unisci gli attributi per posizione (riepilogo)” scegliendo il campo e le operazioni che si vogliono fare (media, somma, eccetera); dopodiché è questo vettore intermedio ad essere rasterizzato.

Ho aperto qualche anno fa una feature request su GDAL [1] ma evidentemente non è di così grande interesse e, a dire il vero, non mi sono poi così sbattuto affinché fosse presa in considerazione.

A questo punto ti chiedo, Andrea: secondo te che cosa è necessario affinché questa opzione sia inserita in QGIS?

  1. rimanere su GDAL?
  2. aggiungere nel core un nuovo modulo di rasterizzazione?
  3. un plugin?

grazie mille per il tuo parere

s.

[1] [feature request] GDAL_Rasterize - choose values for burning · Issue #7480 · OSGeo/gdal · GitHub

Ciao Stefano,
visto che, se non ho capito male, è comunque possibile replicare la funzionalità del tool di rasterizzazione di SAGA-GIS Shape to Grid utilizzando due strumenti già disponibili da tempo in QGIS, penso che questo possa essere l’approccio migliore: è modulare (secondo il principio di avere tool specializzati che fanno poche cose e che possono essere combinati tra loro) ed è utilizzabile con un gran numero di versioni di QGIS.

L’eventuale aggiunta nel core un nuovo algoritmo di processing nativo per la rasterizzazione in QGIS o la modifica di quello esistente in GDAL permetterebbe di usare tale procedura solo con future versioni di QGIS/GDAL, e, oltre a dover essere sviluppato da qualcuno, dovrà essere mantenuto nel tempo. Comunque potresti provare a contattare Nyall Dawson e/o Even Rouault per capire se vorrebbero occuparsene e quanto costerebbe.

La creazione di un plugin Python apposito potrebbe essere un’altra soluzione che potrebbe essere utilizzato su varie versioni di QGIS, ma anche in questo dovrebbe essere sviluppato appositamente per essere retrocompatibile, e dovrebbe essere mantenuto nel tempo. Inoltre suppongo che possa essere più lento rispetto ad altre soluzioni, visto che solitamente in Python l’elaborazione è più lenta rispetto a quella compilata da codice C++.

A presto.

Andrea

Ah… e comunque… è possibile che non ci sia già un plugin che svolge tale compito fra gli oltre 4 mila plugin presenti?

Comunque, se fornisci un file vettoriale da rasterizzare e i parametri che useresti con il tool di SAGA-GIS per vettorializzarlo e magari anche il raster di output, potrei verificare se corrispondono all’output di un algoritmo di processing che ho scribacchiato in Python che dovrebbe replicare il corrispondente tool di SAGA-GIS.

A presto.

Andrea

grazie andrea.

allego un progetto con un semplice dataset risultato di una elaborazione.

come si vede dalla figura in ogni punto ci sono più punti perfettamente sovrapposti.
la tabella degli attributi prevede i campi di Energia, Velocità, Velocità pesata e il numero di punti.
il passo successivo è creare il raster dell’Energia massima, minima e media in ogni punto.
quindi il valore da rasterizzare deve essere ricavato calcolando il minimo, il massimo e la media, dopodiché si può effettivamente creare il raster.

azz.qgz (12.0 KB)

azz.gpkg (1.3 MB)

nel codice del plugin, originariamente per tutti i campi c’era una routine tipo questa, in cui cambia ovviamente il campo in ingresso e l’operazione da fare prima di fare la rasterizzazione vera e ropria.

SAGA rasterize

    saga_v_min = processing.run("saga:featurestoraster", {
        'INPUT': finalpoints.source(),
        'FIELD': "V",
        'OUTPUT': 2,
        # 0 first, 1 last, 2 min, 3 max, 4 mean. Default is 0
        'MULTIPLE': 2,
        'LINE_TYPE': 0,
        'POLY_TYPE': 0,
        'GRID_TYPE': 9,
        'TARGET_USER_XMIN TARGET_USER_XMAX TARGET_USER_YMIN TARGET_USER_YMAX': extent,
        'TARGET_USER_SIZE': Output_Resolution,
        'TARGET_USER_FITS': 1,
        'GRID': v_min

Grazie Stefano.

Ho implementato un semplice algorithmo di processing in Python che permette la creazione di un raster di output con i valori valori di ogni cella calcolati come il massimo, o il minimo o la media, a partire dai punti del layer di input ricadenti in ogni cella.

Ho fatto un test con il layer finalpoints come input, impostando l’extent e la risoluzione del layer DTM.

I raster di output generati dall’algoritmo sono uguali a quelli generati dall’algoritmo di SAGA-GIS con tempi inferiori.

Se generalmente i layer di input sono di punti (o anche di poligoni, eventualmente da testare con un layer con dati reali) e sono di dimensioni paragonabili a quello che hai messo a disposizione e se solitamente il parametro ‘TARGET_USER_FITS’ viene sempre impostato a 1, allora penso che l’algoritmo possa rimpiazzare efficacemente l’algoritmo di SAGA-GIS.

Nei prossimi giorni metterò a disposizione il codice del plugin di processing così puoi testarlo anche tu.

A presto.

Andrea

1 Like

ottimo, grazie mille.
sarebbe un .py da aggiungere a processing, non core, giusto?
sarebbe utile come valore da rasterizzare anche il numero di occorrenze del layer di input che cadono nella cella del raster di destinazione.

coi punti è facile, non so come si si faccia per linee e poligoni: i vertici? la lunghezza per le linee e l’area per i poligoni?

s.