Suite

Boucle For - Algèbre cartographique (ArcGIS) à l'aide de Python

Boucle For - Algèbre cartographique (ArcGIS) à l'aide de Python


QUESTION ORIGINALE


Je suis relativement nouveau sur python et ces fourms, mais j'ai du mal à utiliser les boucles for pour les analyses spatiales dans ArcGIS. Il ne semble pas reconnaître la variable RasterImage !

Voici une partie du code avec laquelle je rencontre des problèmes…

importer arcpy, os, sys, chaîne de arcpy importer env de arcpy.sa importer * arcpy.CheckOutExtension("spatial") arcpy.env.workspace = r'O:DATA	est' InputFolder = arcpy.env.workspace Temp4 = InputFolder + '' + 'temp4' RasterList = arcpy.ListRasters() pour RasterImage dans RasterList : print (RasterImage) Temp4 = FocalStatistics('RasterImage', NbrRectangle (9, 9, 'CELL'), "RANGE", " DATA") print ('Focal Statistics Done')

je reçois l'erreur suivante

"Traceback (appel le plus récent en dernier): Fichier "O:	est.py", ligne 67, dans  Temp4 = FocalStatistics('RasterImage', NbrRectangle (9, 9, 'CELL'), "RANGE", "DATA") Fichier "C:Program Files (x86)ArcGISDesktop10.0arcpyarcpysa Functions.py", ligne 4796, dans FocalStatistics ignore_nodata) Fichier "C:Program Files (x86)ArcGISDesktop10.0arcpyarcpysaUtils.py", ligne 47, dans swapper result = wrapper(* args, **kwargs) Fichier "C:Program Files (x86)ArcGISDesktop10.0arcpyarcpysaFunctions.py", ligne 4790, dans le wrapper ignore_nodata) Fichier "C:Program Files (x86 )ArcGISDesktop10.0arcpyarcpygeoprocessing\_base.py", ligne 474, dans  return lambda *args : val(*gp_fixargs(args)) ExecuteError : échec de l'exécution. Les paramètres ne sont pas valides. ERREUR 000865 : Raster d'entrée : RasterImage n'existe pas. Échec de l'exécution (FocalStatistics)."

Il ne semble pas reconnaître ma boucle for in the RasterImage - des idées ? L'instruction print après la boucle montre qu'elle reconnaît le fichier (en python) mais que les analyses spatiales utilisées dans arcpy ne le sont pas.

J'ai pensé qu'il faudrait peut-être faire quelque chose avec l'espace de travail utilisé alors j'ai pensé qu'ajouter

RasterImage = InputFolder + '' + RasterImage

peut aider à localiser le chemin complet des jeux de données raster, mais en vain ! Je suis à court d'idées et les seuls fichiers d'aide qui utilisent des analyses spatiales sur la page de ressources ArcGIS n'utilisent pas de boucles dans leurs scripts. ¨

METTRE À JOUR


Le problème a été résolu en implémentant les éléments suivants :

La question d'origine affichant l'erreur 'RasterImage' n'existe pas était due en partie aux "marques et aux espaces autour du NbrRectangle. J'ai implémenté une partie de mon nouveau code en utilisant les suggestions de nmpeterson selon lesquelles le géotraitement est appelé via la fonction

def focalStats(raster): Temp4 = FocalStatistics(raster, NbrRectangle(9, 9, 'CELL'), "RANGE", "DATA") return Temp4

Alors que les méthodologies dans lesquelles plusieurs fichiers temporaires dépendent les uns des autres (c'est-à-dire un géoprocessus dans un autre géoprocessus), j'ai utilisé la fonction .save dans un répertoire temporaire comme indiqué par om_henners avant de supprimer tout ce contenu par la suite.


Dans la ligneTemp4 = FocalStatistics('RasterImage', NbrRectangle (9, 9, 'CELL'), "RANGE", "DONNÉES"), vous devez supprimer les guillemets simples autourImage raster-- il est traité comme un littéral de chaîne et recherche un fichier appelé RasterImage.

Éditer: En y réfléchissant un peu plus, je me demande si le script échoue parce que vous initialisez Temp4 en tant que chaîne, puis le redéfinissez comme quel que soit le type de retour de FocalStatistics -- je ne sais pas s'il est géré comme une chaîne ou non.

Essaye ça:

importer arcpy, os, sys, chaîne depuis arcpy importer env depuis arcpy.sa importer * arcpy.CheckOutExtension("spatial") arcpy.env.workspace = r'O:DATA	est' InputFolder = arcpy.env.workspace def focalStats (raster): Temp4 = FocalStatistics(raster, NbrRectangle(9, 9, 'CELL'), "RANGE", "DATA") return Temp4 RasterList = arcpy.ListRasters() pour RasterImage dans RasterList: print (RasterImage) focalStats(RasterImage ) print ('Statistiques focales terminées')

Comme le dit @nmpeterson, le premier problème se résume aux citations autour duImage rasterNom de variable.

Cependant, le gros problème est que vous écrasez la variable Temp4 avec le contenu du raster. Au lieu de cela, selon la documentation FocalStatistics d'ESRI, l'objet raster renvoyé a unEnregistrer le chemin)méthode.

Je suppose que vous ne voulez pas écraser votre sortie à chaque fois, donc un moyen rapide d'obtenir un nom temporaire est en Python en utilisantfichier temporaire.NamedTemporaryFile(dir="working_dir").name- cependant, cela ne stockera pas de référence au raster d'origine, ce que je suppose que vous voulez, nous pouvons donc le faire légèrement différemment comme suit (en supposant que vous utilisez des rasters Info - si vous utilisez un .tif, . png">PEP 8) mais au final ce n'est pas grand chose.


Voir la vidéo: Opetusohjelma: Kartta Algebra PCRasterilla Pythonissa