Impossible de additionner les rasters à cause des pixels nodata


12

J'ai un ensemble de rasters (.vrt) avec des données quotidiennes sur l'humidité du sol. Je veux additionner les pixels de tous les rasters afin d'avoir une mesure par mois. Cependant, le monde entier n'est pas couvert chaque jour, ce qui se traduit par des valeurs de nodata aux endroits où des mesures existent pour les autres jours.

Ce que je veux faire, c'est additionner les valeurs de chaque raster. Cependant, il semble que chaque fois qu'un pixel nodata est dans la somme, le pixel résultant est directement classé comme nodata. Je voudrais avoir le contraire: ignorer toutes les valeurs de nodata et additionner le reste.

J'ai pensé à 2 façons de résoudre le problème:

  1. sommation des rasters en ignorant les valeurs nodata
  2. convertir les pixels nodata en valeur 0, puis additionner tous les rasters

entrez la description de l'image ici

Malheureusement, je ne trouve aucun outil pour le faire.

Quelqu'un peut-il m'aider?


Je me demande dans quelle mesure le résultat sera interprétable: après tout, les sommes n'incluront pas les valeurs des jours manquants, ce qui indique qu'elles seront biaisées de divers montants en fonction de la quantité de données manquantes. S'il existe une quantité appréciable de données manquantes, vous devez plutôt envisager d' imputer ou de prédire les valeurs dans les cellules manquantes, puis d'effectuer la somme.
whuber

1
Merci pour ce commentaire. J'ai demandé aux responsables des données et ils m'ont dit qu'ils avaient calculé la valeur moyenne en additionnant toutes les données disponibles, puis divisé par le nombre de jours du mois où les observations étaient disponibles sur ce pixel.
Damien

2
Cela est identique à la moyenne locale d'une pile de rasters où le SIG est simplement chargé d'ignorer toutes les cellules NoData, ce qui suggère une autre voie à suivre. Soit dit en passant, cette procédure est encore potentiellement biaisée lorsque les observations manquantes sont corrélées avec les valeurs. Par exemple, lorsque vous manquez des données en raison de la couverture nuageuse, il est plausible que ces jours-là, l'humidité du sol soit plus élevée (en moyenne) que d'habitude.
whuber

1
D'accord, je viens de tester l'outil de statistiques cellulaires avec la case `` ignorer nodata '' cochée et il fait exactement ce que je voulais. Je suis conscient des lacunes d'une telle méthode. Cependant, mon travail est à une assez grande échelle, à la fois dans l'espace et dans le temps, donc je suppose que de tels biais seront moins importants. Quoi qu'il en soit, je n'ai pas vraiment autant de choix de données.
Damien

L'échelle ne sera pas liée à la quantité de biais. L'importance du biais dépend de sa taille et de la sensibilité de votre application à celui-ci. Bien que vous pourriez ne pas être en mesure de faire quoi que ce soit sur les données, vous n'avez le contrôle sur les procédures pour les analyser. Il existe de nombreuses façons d'améliorer celui-ci. Parmi vos options, vous pouvez interpoler au fil du temps et régresser contre des covariables qui pourraient être corrélées avec l'humidité du sol et sont disponibles même aux dates manquantes. (Il existe toute une branche de la statistique consacrée à «imputer» les valeurs manquantes.)
whuber

Réponses:


1

Si vous avez accès à ArcGIS, l' outil Cell Statistics a la faculté d'ignorer les nodata que vous additionnez \ mean \ min \ max vos rasters.


Si vous modifiez cette réponse pour remplacer «somme» par «moyenne», ce sera correct: consultez le fil de commentaire à la question pour la raison.
whuber

La sommation n'était qu'une partie de mon problème, car je veux obtenir la valeur moyenne. Je viens de vérifier, et l'outil de statistique cellulaire est également le moyen le plus simple de résumer les rasters sans tenir compte des pixels nodata.
Damien

11

Tout d'abord, vous pouvez utiliser gdal_calc.py pour changer tout -9999 en 0 et définir la valeur NoData sur 0.

Par exemple:

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

Ensuite, vous pouvez ignorer la valeur NoData à l'aide de gdal_translate avec l' option -a_nodata suivie de none .

-a_nodata valeur :

Attribuez une valeur nodata spécifiée aux bandes de sortie. À partir de GDAL 1.8.0, peut être défini sur aucun pour éviter de définir une valeur nodata dans le fichier de sortie s'il en existe une pour le fichier source

Exemple:

gdal_translate -a_nodata none input_with_NoData.tif output_without_NoData.tif

Merci pour le conseil. J'ai joué un peu avec le paramètre -a_nodata, et j'ai réussi à avoir la valeur de -9999 au lieu de NULL. Cependant, j'ai encore besoin de changer tous les -9999 pixels en 0
Damien

1
Vous pouvez utiliser gdal_calc.py pour remplacer tous -9999 par 0 avant de postuler gdal_translate -a_nodata none .... Par exemple: gdal_calc.py -A input.tif --outfile=input_with_NoData.tif --type=Int16 --calc="A+9999*(A==-9999)" --NoDataValue=0
Antonio Falciano

J'ai essayé plusieurs commandes, mais je pense vraiment que j'ai un problème avec gdal_calc.py. Par exemple, j'ai juste essayé d'ajouter 1 à l'ensemble du raster ( i.imgur.com/WiZG7MC.png ) et j'ai obtenu cette erreur Maxrepeat. Je ne comprends pas, j'ai exécuté la commande directement à partir du shell OSGeo, et ce module semble être correctement installé car il apparaît dans la liste lorsque j'ouvre le shell ( i.imgur.com/fgtMZQZ.png ). Mon installation est-elle interrompue?
Damien

Cela semble être un problème d'expression régulière ... Essayez de changer votre répertoire de travail à l'aide de la cdcommande et réessayez afin d'avoir seulement -A test.tif.
Antonio Falciano

1
Cela fonctionne pour moi, mais j'ai installé tout cela via l' installateur OSGeo4W . Au lieu de cela, je constate que vous avez installé QGIS via le programme d'installation autonome. Essayez donc de rafraîchir / mettre à jour votre configuration.
Antonio Falciano

5

Dans R:

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

Pourriez-vous ajouter une explication à ce code (si vous l'avez écrit) ou un lien vers l'endroit où vous l'avez trouvé, avec un bref résumé du site?
Paul

1
Ce qui précède charge d'abord le package raster, puis crée une "pile" (un tableau tridimensionnel de fichiers raster d'étendue et de résolution identiques, où chaque fichier devient une tranche de cette pile) comprenant les fichiers indiqués par les noms de fichiers séparés par des virgules . La dernière ligne effectue des sommes par cellule sur toutes les tranches de pile s, l'argument na.rm=TRUEentraînant l'ignorance des NAvaleurs. L'objet de sortie ssest un rasterobjet qui peut être exporté avec writeRaster(voir ?writeRaster). (@RobertH est le créateur du rasterpackage R. )
jbaums

1

L'outil conditionnel dans Spatial Analyst est un moyen simple de convertir des valeurs nulles en zéros. Prendre ensuite les sommes devrait être un jeu d'enfant.


Merci pour votre réponse. J'ai suivi ce post: support.esri.com/fr/knowledgebase/techarticles/detail/34932 et j'ai pu convertir tous les pixels nuls en 0. Cependant, j'aurais aimé pouvoir faire cette opération pour tous les rasters au sein d'un annuaire. Le «Reclassifier les valeurs de grille» dans QGIS semble être en mesure de le faire, mais tout ce que je ne sais pas comment cela fonctionne. Je choisis la méthode "Table simple", et lui demande de mettre null à 0, et ne change pas les autres valeurs, mais le raster résultant varie de -0,99 à 0,08 alors qu'il s'étend à l'origine de 428 à 3491
Damien

Pouvez-vous publier un extrait de votre raster original quelque part, afin que nous puissions y jeter un œil?
til_b

2
Si vous faites un clic droit sur l'outil, vous pouvez exécuter un traitement par lots sur autant de fichiers que vous le souhaitez, c'est-à-dire un répertoire entier.
brock

Merci pour votre réponse. Cependant, je peux convertir tous les NULLs en 0 pour un seul fichier en utilisant 'analyste spatial / algèbre cartographique / calculatrice raster'. Si je fais un clic droit sur cet outil, je peux batch un répertoire, mais quelle sera la syntaxe pour prendre en compte automatiquement chaque fichier? ( i.imgur.com/aYaUCzz.png )
Damien

J'ai jeté un œil à l'outil «analyste spatial / reclassement / reclassification» et il fait exactement ce que je veux. J'ai réussi à utiliser la fenêtre batch pour traiter plusieurs fichiers à la fois. J'ai un dernier problème: si je clique avec le bouton droit / remplis le «raster en sortie», il copie les mêmes fichiers de sortie pour tous les rasters en entrée. Comment puis-je faire pour qu'il crée une sortie différente pour chaque entrée? ( i.imgur.com/jzTI2x9.png )
Damien

1

J'ai eu le même problème il y a quelque temps et j'ai réussi à le résoudre.

Tout comme une note sur l'affichage des valeurs de nodata dans QGIS: les valeurs de nodata sont toujours affichées en tant que valeurs de nodata dans la fenêtre de carte et lors de l'utilisation de l'outil "informations sur l'objet", qu'elles aient réellement la valeur -9999, 0, NULL, etc. Ainsi, après le reclassement des valeurs de nodata à 0, si vous allez dans les paramètres de calque, vous trouverez dans les métadonnées que les nodata ont la valeur 0.

J'ai finalement trouvé l'outil parfait pour la quête, l'herbe r.series. Avec le paramètre "opération d'agrégation" définissant "maximum" et la "propagation des valeurs NULL" décochée, l'outil créera un calque qui correspond à vos besoins.


0

Je me souviens avoir eu ce problème il y a quelque temps. Comme solution, je pense que j'ai fait +1 à toutes les cellules du raster, ajouté les rasters ensemble, puis fait une soustraction finale (du nombre de +1 que vous avez ajouté). C'est assez grossier mais si ça fait le boulot ...!

Vous pouvez également utiliser la «Reclassification des valeurs de grille» dans la boîte à outils Traitement dans QGIS pour convertir vos valeurs nulles en zéro.


Salut, j'ai essayé de nombreuses façons d'utiliser l'outil «reclassifier les valeurs de la grille» sans succès. J'ai commencé sur un raster où j'ai converti tous les pixels NULL en -9999. J'ai essayé de reclasser en utilisant la méthode [0] single et de définir 'ancienne valeur = -9999', 'nouvelle valeur = 0,0', 'opérateur: [0] =', mais tout ce que j'obtiens est un raster plein de 'nan' pixels. Qu'est-ce que je fais mal?
Damien
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.