Combler les lacunes NoData dans le raster à l'aide d'ArcGIS Desktop?

9

J'ai un raster avec des lacunes. Je souhaite les remplir avec des moyennes des cellules environnantes à l'aide d'ArcGIS 10.2 for Desktop.

J'ai essayé "Focal Statistics" mais il fait la moyenne de CHAQUE cellule et pas seulement les écarts.

J'ai essayé [Mosaic] .IsNull.Con ([Average], [Mosaic]) trouvé ici Patching mais je ne sais pas comment l'implémenter / cela ne fonctionnera pas pour moi

J'ai essayé Map ALgebra mais je pense qu'ils utilisaient des versions antérieures à 10.2.

Ce que je veux. Créez un faux raster avec des lacunes comblées. Utilisez le faux raster pour combler les lacunes du vrai raster sans remplacer les points par des données réelles.

Steven Crisp
la source
Mauvaise syntaxe, utilisez ([mosaic] .isnull) .Con ([average], [mosaic])
FelixIP
1
Juste en observant que votre lien "Patching" semble avoir 15 ans (de 2000 à 2001).
phloem
2
Beaucoup de choses ont changé avec les rasters récemment, donc de nombreux exemples plus anciens ont la bonne intention, mais n'ont pas la bonne syntaxe à utiliser dans la version actuelle. @crmackey a la bonne traduction bien que j'utilise un cercle et non un rectangle; pour les petites dimensions, il y a peu de différence, mais pour les zones de voisinage (relativement) grandes, il y a une différence significative entre le cercle et le rectangle.
Michael Stimson
1
Même si c'est 15 ans, c'est toujours très pertinent. Huber connaissait et connaît très bien le sujet.
FelixIP
1
Exactement. L'opération est la même, seule la syntaxe a changé.
Michael Stimson

Réponses:

9

Cela marche:

filled = arcpy.sa.Con(arcpy.sa.IsNull(in_raster),arcpy.sa.FocalStatistics(in_raster,
                        arcpy.sa.NbrRectangle(w, h),'MEAN'), in_raster)

Où "w" et "h" sont le rayon de recherche.

Cela ne fait que des statistiques focales sur les zones NoData. J'ai vérifié en effaçant les données d'un DEM, puis en trouvant la différence. Il vous suffit de vous assurer que le rayon de recherche est adéquat.

crmackey
la source
Dois-je simplement ajouter tout cela à la calculatrice raster et changer le "in_raster" et w et h? Pour une raison quelconque, je ne peux pas le faire fonctionner, bien que son flux ait un sens car il saute la création manuelle du raster focal et le fait à la volée.
Steven Crisp
Je l'ai fait fonctionner! Merci beaucoup! j'ajoutais simplement "où j'étais pas; je suis censé le faire. Merci!
Steven Crisp
1
Aucun problème. Un avertissement, comme l'a souligné @ MichaelMiles-Stimson, l'utilisation de NbrCircle () serait préférable.
crmackey
Les unités de cellules sont-elles dans la carte?
Si vous ne savez pas - juste GIS
Vous feriez mieux d'utiliser la arcpy.sa.NbrCircle(radius, units)où les unités peuvent être 'MAP'ou 'CELL'.
crmackey
3

Utilisez la fonction de statistiques focales, comme vous l'avez décrit pour faire la moyenne de toutes les cellules du raster. Ensuite, utilisez les fonctions Con et IsNull dans la calculatrice raster pour remplacer uniquement les cellules qui sont nulles.

Con(IsNull(<inputRaster>), <focalRaster>, <inputRaster>)

Un inconvénient possible de cette solution est que vous pouvez voir des valeurs de cellule moyennes supplémentaires indésirables autour du périmètre de votre raster en sortie

Ben Gosack
la source
Je ne peux pas voter en raison de la réputation ou du w / e, mais cette méthode fonctionne si je crée d'abord un raster de statistiques focales, puis applique le code ci-dessus. Je souhaite juste pouvoir tout faire en une seule ligne comme le commentaire ci-dessus pour gagner du temps. J'ai quelques centaines de ces choses ...
Steven Crisp
Cela dépend simplement de si vous souhaitez conserver vos statistiques focales raster ou interpréter à la volée ... les deux méthodes sont essentiellement les mêmes (+1 pour les deux).
Michael Stimson
3

Vous devez utiliser Raster Calculator et il existe une ligne de code utile et pertinente à partir de la page de support d'ESRI HowTo: supprimer et remplacer aucune valeur de données dans un raster en utilisant des informations statistiques à partir des valeurs de données environnantes . D'après votre question, il semble que cela ferait exactement ce que vous essayez de faire, mais faites-moi savoir si je me trompe. Voici ma capture d'écran de Raster Calculator utilisant une instruction conditionnelle pour calculer une valeur moyenne pour les cellules sans données des cellules environnantes: entrez la description de l'image ici

Si vous avez des centaines de ces tâches à effectuer, je vous recommande d'utiliser l'itérateur de trame dans le générateur de modèle, qui alimentera tous vos rasters dans l'outil de calcul de raster, comme ceci:

entrez la description de l'image ici

Leo
la source
2

J'ai essayé la méthode Raster Calculator utilisée par LeonB, mais j'ai rencontré une erreur de mémoire insuffisante, ce qui est surprenant compte tenu des spécifications de mon système. A écrit un petit script python autonome - modifié à partir d' ici - dans IDLE qui a fonctionné pour moi ...

import arcpy
from arcpy import env
from arcpy.sa import *

env.workspace="D:/Watershed/"

inRaster="D:/Watershed/tamtr14_1m"

arcpy.CheckOutExtension ("Spatial")

outCon=Con(IsNull(inRaster), FocalStatistics (inRaster, NbrRectangle (5,5, "CELL"), "MEAN"), inRaster)

outCon.save ("D:/Watershed/outCon")
wiebe712
la source