Impossibile sommare i raster a causa dei pixel di nodata


11

Ho un set di raster (.vrt) con dati giornalieri sull'umidità del suolo. Voglio sommare i pixel di tutti i raster per avere una misura per mese. Tuttavia, il mondo intero non è coperto ogni giorno, il che si traduce in valori di nodati in luoghi in cui esistono misure per gli altri giorni.

Quello che voglio fare è sommare i valori di ciascun raster. Tuttavia, sembra che ogni volta che un pixel nodata sia nella somma, il pixel risultante viene direttamente classificato come nodata. Vorrei avere il contrario: ignorare tutti i valori dei nodati e sommare il resto.

Ho pensato a 2 modi per risolvere il problema:

  1. sommatori di raster ignorando i valori dei nodati
  2. convertendo i pixel dei nodati in valore 0, quindi sommando tutti i raster

inserisci qui la descrizione dell'immagine

Sfortunatamente, non riesco a trovare nessuno strumento per farlo.

Qualcuno può aiutarmi?


Mi chiedo quanto sia interpretabile il risultato: dopo tutto, le somme non includeranno i valori per i giorni mancanti, indicando che saranno distorti da vari importi a seconda della quantità di dati mancanti. Se è presente una quantità apprezzabile di dati mancanti, è necessario considerare invece di imputare o prevedere i valori nelle celle mancanti e quindi eseguire la somma.
whuber

1
Grazie per questo commento Ho chiesto ai gestori dei dati e mi hanno detto di aver calcolato il valore medio sommando tutti i dati disponibili, quindi dividere per il numero di giorni entro il mese in cui le osservazioni sono disponibili su quel pixel.
Damien,

2
Questo è identico alla media locale di una pila di raster in cui il GIS è incaricato solo di ignorare tutte le celle NoData, il che suggerisce un altro modo per andare. A proposito, questa procedura è ancora potenzialmente distorta quando le osservazioni mancanti sono correlate ai valori. Ad esempio, quando mancano i dati a causa della copertura nuvolosa, è plausibile che in quei giorni l'umidità del suolo possa essere più alta (in media) del solito.
whuber

1
Bene, ho appena testato lo strumento di statistica delle celle con l'opzione 'ignora nodata' selezionata e fa esattamente quello che volevo. Sono consapevole delle carenze di tale metodo. Tuttavia, il mio lavoro è su larga scala, sia nello spazio che nel tempo, quindi presumo che tali pregiudizi saranno meno importanti. Ad ogni modo, non ho davvero tanta scelta di dati.
Damien,

La scala non sarà correlata alla quantità di errore. L'importanza della distorsione dipende dalle sue dimensioni e dalla sensibilità dell'applicazione ad essa. Anche se si potrebbe non essere in grado di fare nulla circa i dati, non ha il controllo delle procedure per l'analisi di loro. Ci sono molti modi per migliorare questo. Tra le tue opzioni vi sono l'interpolazione nel tempo e la regressione contro le covariate che potrebbero essere correlate all'umidità del suolo e sono disponibili anche nelle date mancanti. (C'è un'intera branca della statistica dedicata a "imputare" i valori mancanti.)
whuber

Risposte:


1

Se hai accesso ad ArcGIS, lo strumento Statistiche cella ha l'opzione facoltativa per ignorare i nodati che sommi \ mean \ min \ max ai tuoi raster.


Se modifichi questa risposta per sostituire "somma" con "media", sarà corretto: vedi il thread dei commenti alla domanda per il motivo.
whuber

Il riepilogo è stato solo una parte del mio problema poiché desidero ottenere il valore medio. Ho appena controllato, e lo strumento Statistica delle celle è anche il modo più semplice per sommare i raster ignorando i pixel dei nodati.
Damien,

11

Innanzitutto, è possibile utilizzare gdal_calc.py per modificare tutti -9999 su 0 e impostare il valore NoData su 0.

Per esempio:

gdal_calc.py -A input.tif --outfile=input_with_NoData.tif --calc="A+9999*(A==-9999)" --NoDataValue=0

Quindi, puoi ignorare il valore NoData usando gdal_translate con l' opzione -a_nodata seguita da none .

-a_nodata value :

Assegna un valore di nodata specificato alle bande di output. A partire da GDAL 1.8.0, può essere impostato su none per evitare di impostare un valore nodata sul file di output se ne esiste uno per il file sorgente

Esempio:

gdal_translate -a_nodata none input_with_NoData.tif output_without_NoData.tif

Grazie per il consiglio. Ho giocato un po 'con il parametro -a_nodata e riesco ad avere il valore di -9999 invece di NULL. Tuttavia, devo ancora cambiare tutti i -9999 pixel in 0
Damien il

1
È possibile utilizzare gdal_calc.py per modificare da -9999 a 0 prima dell'applicazione gdal_translate -a_nodata none .... Ad esempio: gdal_calc.py -A input.tif --outfile=input_with_NoData.tif --type=Int16 --calc="A+9999*(A==-9999)" --NoDataValue=0
Antonio Falciano,

Ho provato diversi comandi, ma penso davvero di avere un problema con gdal_calc.py. Ad esempio, ho appena provato ad aggiungere 1 all'intero raster ( i.imgur.com/WiZG7MC.png ) e ho ottenuto questo errore Maxrepeat. Non capisco, ho eseguito il comando direttamente dalla shell OSGeo e questo modulo sembra essere installato correttamente poiché appare nell'elenco quando apro la shell ( i.imgur.com/fgtMZQZ.png ). La mia installazione è rotta?
Damien,

Sembra un problema regex ... Prova a cambiare la tua directory di lavoro usando il cdcomando e riprova per averne solo -A test.tif.
Antonio Falciano,

1
Funziona per me, ma ho installato tutto questo tramite il programma di installazione di OSGeo4W . Invece, vedo che hai installato QGIS tramite il programma di installazione autonomo. Quindi prova ad aggiornare / aggiornare la tua configurazione.
Antonio Falciano,

5

In R:

library(raster)
s <- stack('file1', 'file2', ...)
ss <- sum(s, na.rm=TRUE)

Potresti aggiungere una spiegazione a questo codice (se l'hai scritto) o un link a dove l'hai trovato, con un breve riassunto dal sito?
Paolo,

1
Quanto sopra carica prima il pacchetto raster, quindi crea uno "stack" (un array tridimensionale di file raster di identica estensione e risoluzione, in cui ogni file diventa una porzione di questo stack) comprendente i file indicati dai nomi di file separati da virgola . La riga finale esegue somme a livello di cella su tutte le sezioni di stack s, con l'argomento na.rm=TRUErisultante che i NAvalori vengono ignorati. L'oggetto di output ssè un rasteroggetto che può essere esportato con writeRaster(vedi ?writeRaster). (@RobertH è il creatore del rasterpacchetto R. )
jbaums,

1

Lo strumento condizionale in Analista spaziale è un modo semplice per convertire valori nulli in zeri. Quindi prendere le somme dovrebbe essere un gioco da ragazzi.


Grazie per la risposta. Ho seguito questo post: support.esri.com/fr/knowledgebase/techarticles/detail/34932 e sono stato in grado di convertire tutti i pixel null in 0. Tuttavia, mi sarebbe piaciuto poter fare questa operazione per tutti i raster all'interno di un directory. I "Riclassifica valori griglia" in QGIS sembrano essere in grado di farlo, ma tutto ciò che non so come funziona. Scelgo il metodo "Tabella semplice" e chiedo di impostare null su 0 e non modificare altri valori, ma il raster risultante varia da -0,99 a 0,08 mentre inizialmente si estende da 428 a 3491
Damien

Puoi pubblicare un estratto del tuo raster originale da qualche parte, così possiamo dare un'occhiata?
til_b,

2
Se fai clic con il pulsante destro del mouse sullo strumento, puoi eseguire un processo batch su tutti i file che desideri, ovvero un'intera directory.
Brock

Grazie per la tua risposta. Tuttavia, posso convertire tutti i NULL in 0 per un singolo file usando "analista spaziale / Mappa algebra / calcolatrice raster". Se faccio clic destro su questo strumento, posso raggruppare una directory, ma quale sarà la sintassi per tenere conto automaticamente di ogni file? ( i.imgur.com/aYaUCzz.png )
Damien,

Ho dato un'occhiata allo strumento 'analista spaziale / Riclassifica / Riclassifica' e fa esattamente quello che voglio. Sono riuscito a utilizzare la finestra batch per elaborare più file contemporaneamente. Ho un ultimo problema: se faccio clic con il pulsante destro del mouse / riempo il "output raster", copia gli stessi file di output per tutti i raster di input. Come posso fare per farlo creare un output diverso per ogni input? ( i.imgur.com/jzTI2x9.png )
Damien,

1

Ho avuto lo stesso problema qualche tempo fa e sono riuscito a risolverlo.

Proprio come una nota sulla visualizzazione dei valori dei nodati in QGIS: i valori dei nodati vengono sempre mostrati come valori dei nodati nella finestra della mappa e quando si utilizza lo strumento "informazioni sull'oggetto", indipendentemente dal fatto che abbiano effettivamente il valore -9999, 0, NULL ecc. Quindi, dopo la riclassificazione dei valori dei nodati su 0, se vai nelle impostazioni del livello troverai nei metadati che i nodati hanno il valore 0.

Alla fine ho trovato lo strumento perfetto per la ricerca, l'ERBA r.series. Con "operazione aggregata" impostazione "massimo" e "propagare NULL" non selezionato, lo strumento creerà un livello adatto alle vostre esigenze.


0

Ricordo di aver avuto questo problema qualche tempo fa. Come soluzione penso di aver fatto +1 su tutte le celle del raster, ho aggiunto i raster insieme, quindi ho fatto una sottrazione finale (di quanti + 1 hai aggiunto). È piuttosto rozzo ma se riesce a fare il lavoro ...!

In alternativa, utilizzare "Riclassifica valori griglia" nella casella degli strumenti di elaborazione in QGIS per convertire i valori null in zero.


Ciao, ho provato molti modi per utilizzare lo strumento "riclassifica valori griglia" senza successo. Ho iniziato con un raster in cui ho convertito tutti i pixel NULL in -9999. Ho provato a riclassificare usando il metodo [0] singolo e ho impostato 'vecchio valore = -9999', 'nuovo valore = 0,0', 'operatore: [0] =', ma tutto ciò che ottengo è un raster pieno di 'nan' pixel. Che cosa sto facendo di sbagliato?
Damien,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.