Mehr

For Loop - Kartenalgebra (ArcGIS) mit Python


URSPRÜNGLICHE FRAGE


Ich bin relativ neu in Python und diesen Fourms, habe aber Probleme, for-Schleifen für räumliche Analysen in ArcGIS zu verwenden. Es scheint die Variable RasterImage nicht zu erkennen!

Hier ist ein Teil des Codes, mit dem ich Probleme habe ...

import arcpy, os, sys, string from arcpy import env from arcpy.sa import * arcpy.CheckOutExtension("spatial") arcpy.env.workspace = r'O:DATA	est' InputFolder = arcpy.env.workspace Temp4 = InputFolder + '' + 'temp4' RasterList = arcpy.ListRasters() für RasterImage in RasterList: print (RasterImage) Temp4 = FocalStatistics('RasterImage', NbrRectangle (9, 9, 'CELL'), "RANGE", " DATEN") drucken ("Focal Statistics Done")

Ich erhalte folgenden Fehler

"Traceback (letzter Aufruf zuletzt): Datei "O:	est.py", Zeile 67, in  Temp4 = FocalStatistics('RasterImage', NbrRectangle (9, 9, 'CELL'), "RANGE", "DATA") Datei "C:Program Files (x86)ArcGISDesktop10.0arcpyarcpysa Functions.py", Zeile 4796, in FocalStatistics ignore_nodata) Datei "C:Program Files (x86)ArcGISDesktop10.0arcpyarcpysaUtils.py", Zeile 47, in swapper result = wrapper(* args, **kwargs) Datei "C:Program Files (x86)ArcGISDesktop10.0arcpyarcpysaFunctions.py", Zeile 4790, im Wrapper ignore_nodata) Datei "C:Program Files (x86 .) )ArcGISDesktop10.0arcpyarcpygeoprocessing\_base.py", Zeile 474, in  Rückgabe Lambda *args: val(*gp_fixargs(args)) ExecuteError: Ausführung fehlgeschlagen. Parameter sind ungültig. FEHLER 000865: Eingabe-Raster: RasterImage existiert nicht. Ausführung fehlgeschlagen (FocalStatistics)."

Es scheint meine for-in-Schleife des RasterImage nicht zu erkennen - irgendwelche Ideen? Die print-Anweisung nach der Schleife zeigt, dass die Datei (in Python) erkannt wird, die in arcpy verwendeten räumlichen Analysen jedoch nicht.

Ich dachte, es könnte etwas mit dem verwendeten Arbeitsbereich zu tun haben, also dachte ich, dass das Hinzufügen

RasterImage = InputFolder + '' + RasterImage

könnte helfen, den vollständigen Pfad der Raster-Datasets zu finden, aber ohne Erfolg! Mir fehlen Ideen und die einzigen Hilfedateien, die räumliche Analysen auf der ArcGIS-Ressourcenseite verwenden, verwenden keine Schleifen in ihren Skripten. ¨

AKTUALISIEREN


Das Problem wurde durch folgende Implementierung behoben:

Die ursprüngliche Frage, die den Fehler 'RasterImage' nicht existiert, ist teilweise auf die "Markierungen und die Leerzeichen um das NbrRectangle" zurückzuführen. Ich habe einen Teil meines neuen Codes mit den Vorschlägen von nmpeterson implementiert, wobei die Geoverarbeitung über die Funktion aufgerufen wird

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

Bei Methoden, bei denen mehrere temporäre Dateien aufeinander angewiesen sind (z. B. ein Geoprozess innerhalb eines anderen Geoprozesses), habe ich die .save-Funktion in ein temporäres Verzeichnis verwendet, wie von om_henners angezeigt, bevor ich alle diese Inhalte anschließend lösche.


In der SchlangeTemp4 = FocalStatistics('RasterImage', NbrRectangle (9, 9, 'CELL'), "RANGE", "DATA"), müssen Sie die einfachen Anführungszeichen entfernenRasterbild-- es wird als String-Literal behandelt und sucht nach einer Datei namens RasterImage.

Bearbeiten: Wenn ich noch etwas darüber nachdenke, frage ich mich, ob das Skript fehlschlägt, weil Sie Temp4 als String initialisieren, es dann aber neu definieren als was auch immer der Rückgabetyp von FocalStatistics ist - ich bin mir nicht sicher, ob es als String behandelt wird oder nicht.

Versuche dies:

import arcpy, os, sys, string from arcpy import env from arcpy.sa import * arcpy.CheckOutExtension("spatial") arcpy.env.workspace = r'O:DATA	est' InputFolder = arcpy.env.workspace def fokalStats (raster): Temp4 = FocalStatistics(raster, NbrRectangle(9, 9, 'CELL'), "RANGE", "DATA") return Temp4 RasterList = arcpy.ListRasters() für RasterImage in RasterList: print (RasterImage) fokalStats(RasterImage .) ) drucken ('Fokusstatistik fertig')

Wie @nmpeterson sagt, dreht sich die erste Ausgabe um die Zitate rund um dieRasterbildVariablennamen.

Die große Sache ist jedoch, dass Sie die Variable Temp4 mit dem Inhalt des Rasters überschreiben. Stattdessen hat das zurückgegebene Rasterobjekt laut der FocalStatistics-Dokumentation von ESRI aspeichern (Pfad)Methode.

Ich gehe davon aus, dass Sie Ihre Ausgabe nicht jedes Mal überschreiben möchten, daher ist eine schnelle Möglichkeit, einen temporären Namen zu erhalten, in Python mittempfile.NamedTemporaryFile(dir="working_dir").name- Dies speichert jedoch keinen Verweis auf das ursprüngliche Raster, was ich annehmen möchte, also können wir es wie folgt etwas anders machen (vorausgesetzt, Sie verwenden Info-Raster - wenn Sie eine .tif-, . png">PEP 8) aber am Ende ist es keine große Sache.


Schau das Video: How to Write and Execute Conditional Con Raster Calculator in ArcMap: Emmisivity Calculation (Oktober 2021).