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.