Mehr

Syntaxfehler bei Verwendung des ArcPy Spatial Analyst-Moduls in Python

Syntaxfehler bei Verwendung des ArcPy Spatial Analyst-Moduls in Python


Ich bin sehr neu in der Verwendung von Python und habe festgestellt, dass im folgenden Skript etwas Offensichtliches fehlt. Ich erhalte immer eine "Syntaxfehler"-Meldung, egal wie viel ich mit den ersten paar Zeilen herumfummele. Ich denke, es hat etwas damit zu tun, das Spatial-Analyst-Modul in Python aufzurufen, während Sie die Spatial-Analyst-Erweiterung auschecken.

#Script verwendet ein DEM-Eingabe-Raster und definiert Wasserscheidengrenzen basierend auf # Fließrichtung und Akkumulation # Arcpy-Modul importieren arcpy aus arcpy.sa importieren import * arcpy.env.overwriteOutput = True # Auschecken der Spatial Analyst-Erweiterung arcpy.CheckOutExtension("Spatial ") #Geben Sie das Eingabe-Raster an inDEM = arcpy.GetParameterAsText(0) #Geben Sie das Eingabe-Koordinatensystem an SpatialReference = arcpy.GetParameterAsText(1) #Geben Sie die Mindestanzahl von Zellen an, von denen angenommen wird, dass sie einen Strom darstellen # (Zellenschwellenwert) inMin = arcpy.GetParameterAsText(2) Versuchen: # Prozess: Projektraster arcpy.ProjectRaster_management(inDEM, projectDEM, SpatialReference) # Prozess: Fill fillDEM = Fill(projectDEM) # Prozess: Flow Direction flowDir = FlowDirection(fillDEM, "NORMAL") # Process : Flow Accumulation flowAccum = FlowAccumulation(flowDir) # Process: Raster Calculator outRaster = RasterCalculator((flowAccum > inMin)) # Process: Raster to Polyline arcpy.RasterToPolyline_conversion(outRaster, polyLines, "ZERO", "0", "SIMPLIFY", "VALUE") # Prozess: Feature-Scheitelpunkte zu Punkten arcpy.FeatureVerticesToPoints_management(polyLines, lineVertices, "END") # Prozess: Watershed outWatershed = Watershed(flowDir, lineVertices) # Prozess: Raster zu Polygon arcpy.RasterToPolygon_conversion(outWatershed, watershedPolygons, "SIMPLIFY", "VALUE") # Checken Sie die Spatial Analyst-Erweiterung arcpy.CheckInExtension("Spatial") ein #Fehlerbehandlung außer: arcpy.AddError("Skript konnte nicht erfolgreich geschrieben werden" ) arcpy.AddMessage(arcpy.GetMessages())

IhreVersuchen:Anweisung wird großgeschrieben, sie sollte klein geschrieben werden -Versuchen:


Verwendungszweck

Die Eingabewerte können positiv oder negativ sein.

Wenn das Runden dem Abschneiden vorgezogen wird, fügen Sie ein 0,5-Eingabe-Raster hinzu, bevor Sie den Vorgang ausführen.

Ein weiterer Unterschied besteht darin, dass Round Down Gleitkommawerte ausgibt, während Int nur ganzzahlige Werte ausgibt.

Der maximal unterstützte Bereich ganzzahliger Rasterwerte liegt zwischen -2.147.483.648 (Mindestgröße bestimmt durch -2 31 ) bis 2.147.483.647 (maximale Größe bestimmt durch 2 31 – 1). Wenn Int in einem Gleitkomma-Raster verwendet wird, das Zellen mit Werten außerhalb dieses Bereichs enthält, sind diese Zellen im Ausgabe-Raster NoData.

Das Speichern kategorialer (diskreter) Daten als Ganzzahl-Raster verbraucht deutlich weniger Speicherplatz als dieselben Informationen, die als Gleitkomma-Raster gespeichert werden. Wann immer möglich, wird empfohlen, Gleitkomma-Raster mit diesem Werkzeug in Ganzzahlen zu konvertieren.

Weitere Informationen zu den Geoverarbeitungsumgebungen, die für dieses Werkzeug gelten, finden Sie unter Analyseumgebungen und Spatial Analyst.


ReProject-Fehler im Skript

Fehlerinfo:
FEHLER 000622: Fehler beim Ausführen (Projekt). Parameter sind ungültig.
FEHLER 000628: Eingabe in Parameter out_coor_system kann nicht gesetzt werden.

Hier ist ein Teil des Skripts und der definierten Variablen:

Irgendwelche Ideen, wo ich hier falsch liege? Ich schätze die Hilfe!!

Wenn Sie 10.1 verwenden, geben Sie die Koordinatensysteme anders an. Anstatt einen Verweis auf die prj-Datei zu verwenden (der Ordner ist nicht mehr vorhanden), können Sie die WKID für das Ausgabekoordinatensystem verwenden. In diesem Fall lautet der Fabrikcode für die State Plane South HARN 2927. Sie können ein Raumbezugsobjekt erstellen, aber ich habe festgestellt, dass Sie es zum Laufen bringen, indem Sie einfach die WKID angeben.

Wenn Sie 10.1 verwenden, geben Sie die Koordinatensysteme anders an. Anstatt einen Verweis auf die prj-Datei zu verwenden (der Ordner ist nicht mehr vorhanden), können Sie die WKID für das Ausgabekoordinatensystem verwenden. In diesem Fall lautet der Fabrikcode für die State Plane South HARN 2927. Sie können ein Raumbezugsobjekt erstellen, aber ich habe festgestellt, dass Sie es zum Laufen bringen können, indem Sie einfach die WKID angeben.

Ist keine Zeichenfolgendarstellung von CS. Verwenden Sie stattdessen das Raumreferenzobjekt, d. h., Sie verwenden arcmap 10.1:

Ich habe den Code geändert in:

arcpy.Project_management(GRADIENT_BAR_PT, GRADIENT_BARH83, 2927, CSTRANS)

Fehlerinfo:
Konnte nicht ausgeführt werden. Parameter sind ungültig.
FEHLER 000365: Ungültige geografische Transformation.
Fehler beim Ausführen (Projekt).

Die Variable, die meine geografische Transformation ist, ist

CSTRANS = '"NAD_1927_To_NAD_1983_NADCON", "NAD_1983_To_HARN_WA_OR"'

Und es funktioniert, wenn ich diese Transformation im Tool verwende, also denke ich, dass es sich um einen Syntaxfehler oder nur um einen Formatfehler handelt. Das sind die richtigen Transformationen, vielleicht habe ich sie nur irgendwie falsch eingegeben?


Was ist arcpy.cim?

# Ändern Sie die Farbe, Breite und Strichvorlage für die SolidStroke-Ebene
symLvl1 = cim_lyr.Renderer.Symbol.Symbol.SymbolLayers[0]
symLvl1.Color.Values ​​= [250, 250, 40, 50]
symLvl1.Breite = 8
ef1 = symLvl1.Effects[0] #Hinweis, tiefere Einrückung
ef1.DashTemplate = [20, 30]

# Ändern Sie die Farbe/Transparenz für die SolidFill-Ebene
symLvl2 = cim_lyr.Renderer.Symbol.Symbol.SymbolLayers[1]
symLvl2.Color.Values ​​= [140, 70, 20, 20]

# Schieben Sie die Änderungen zurück auf das Ebenenobjekt
lyr.setDefinition(cim_lyr)

# Referenzieren Sie ein Projekt, eine Karte und einen Layer mit arcpy.mp
p = arcpy.mp.ArcGISProject('aktuell')
m = p.listMaps('Trailrouten')[0]
lyr = m.listLayers('Loops')[0]

# CIM-Definition des Layers zurückgeben
cim_lyr = lyr.getDefinition('V2')

# Ändern Sie die Farbe, Breite und Strichvorlage für die SolidStroke-Ebene
symLvl1 = cim_lyr.renderer.symbol.symbol.symbolLayers[0]
symLvl1.color.values ​​= [250, 250, 40, 50]
symLvl1.width = 8
symLvl1.effects = [arcpy.cim.CIMGeometricEffectDashes()]
ef1 = symLvl1.effects[0] #Hinweis, tiefere Einrückung
ef1.dashTemplate = [20, 30]

# Ändern Sie die Farbe/Transparenz für die SolidFill-Ebene
symLvl2 = cim_lyr.renderer.symbol.symbol.symbolLayers[1]
symLvl2.color.values ​​= [140, 70, 20, 20]

# Schieben Sie die Änderungen zurück auf das Ebenenobjekt
lyr.setDefinition(cim_lyr)

von JeffBarrette

Vielen Dank, dass Sie dies melden! Sie haben Recht, spät in der Entwicklung von 2.4 haben wir das CamelBack-Format der Objektmitglieder geändert, damit es mit der verwalteten API konsistent ist. Ich konnte Beispiel 3 nicht aktualisieren und Sie haben es erkannt. Das Skript wurde korrigiert und wird in der nächsten Hilfeveröffentlichung erscheinen.

Die fehlende Zeile, die Sie hinzugefügt haben, ist NICHT erforderlich, wenn das Symbol bereits einen gestrichelten Effekt hat. Was die Linie im Wesentlichen tat, war, den Effekt zu erzeugen. Dies ist etwas, bei dem Sie sehr vorsichtig sein müssen. Das Plenarvideo des Developer Summit zeigt die von Ihnen hinzugefügte Zeile. Dieses spezielle Beispiel ist ein einfacher Anwendungsfall, aber aufgrund der Komplexität der Objekterstellung, bei der neue Objekte von zusätzlichen Objekten abhängig sind, ist es einfach, Objekte zu erstellen, die in der Anwendung möglicherweise fehlschlagen.


Die AssertionError-Ausnahme

Anstatt darauf zu warten, dass ein Programm mittendrin abstürzt, können Sie auch mit einer Assertion in Python beginnen. Wir behaupten, dass eine bestimmte Bedingung erfüllt ist. Wenn sich herausstellt, dass diese Bedingung wahr ist, dann ist das ausgezeichnet! Das Programm kann fortgesetzt werden. Wenn sich herausstellt, dass die Bedingung False ist, können Sie das Programm eine AssertionError-Ausnahme auslösen lassen.

Schauen Sie sich das folgende Beispiel an, in dem behauptet wird, dass der Code auf einem Linux-System ausgeführt wird:

Wenn Sie diesen Code auf einem Linux-Computer ausführen, wird die Assertion erfolgreich ausgeführt. Wenn Sie diesen Code auf einem Windows-Computer ausführen würden, wäre das Ergebnis der Assertion False und das Ergebnis wäre Folgendes:

In diesem Beispiel ist das Auslösen einer AssertionError-Ausnahme das Letzte, was das Programm tut. Das Programm wird angehalten und nicht fortgesetzt. Was ist, wenn das nicht das ist, was Sie wollen?


Dies ist die geeignete Syntax für die Verwendung von Clip in ArcPy:

arcpy.Clip_analysis(in_features, clip_features, out_feature_class)

Ihre for-Schleife sollte stattdessen etwa so aussehen:

Ich würde auch jede Dateipfadzeichenfolge drucken (), damit Sie überprüfen können, ob ihre Syntax richtig verwendet wird. Backslashes sind Escape-Zeichen in Python und können besondere Eigenschaften haben, wenn sie von Schlüsselbuchstaben gefolgt werden.

Ich stelle immer ein r vor jeden String, der einen Dateipfad enthält, z.B. r"srvrdrvprojgdb.gdbfc" teilt Python mit, dass es sich um einen Rohstring handelt und ignoriert die Escape-Funktionen.

Siehe Link unten für eine unterhaltsame Analogie zum Umgang mit Backslashs in Dateinamen.

Um mehrere Clips mit mehr als einem Clip-Feature zu erstellen, müssen Sie zunächst eine Liste aller Clip-Features erstellen und diese wiederholen.


Python-Skript erzeugt ERROR 999999 bei der Clip-Funktion

Ich versuche, ein Python-Skript zu schreiben, das einen Ordner mit Shapefiles nimmt, eines der Features in einem der Polygon-Shapefiles auswählt und einen Puffer für dieses Feature erstellt. Diese Funktion wird dann verwendet, um alle Shape-Dateien innerhalb des Ordners auszuschneiden. Die Shape-Dateien werden dann alle neu projiziert und in eine Geodatabase geschrieben.

Es funktioniert für die erste Shape-Datei im Ordner und erzeugt das gewünschte Ergebnis, aber wenn es zum nächsten Shapefile iteriert, kommt es bis zur Clip-Funktion, dann erhalte ich "ERROR 999999: Fehler beim Ausführen der Funktion. Fehler beim Ausführen (Clip) ". Hier ist der Code:

Ich habe auch getestet, zuerst alles neu zu projizieren und dann zu schneiden, aber ArcGIS lässt nicht zu, dass die Ausgabe einer Neuprojektion "in_memory" gespeichert wird. Ich möchte das Programm eigenständig machen, damit es verwendet werden kann, ohne Zwischendateien lokal zu speichern.

Update - Das Skript funktioniert mit Polygon-Shapefiles mit vielen Features, aber sobald es zu einer Linien- oder Punkt-Shape-Datei kommt, auch wenn diese nicht viele Features enthalten, schlägt das Skript fehl. Irgendwelche Ideen?


31 Antworten 31

Basierend auf Ihren Kommentaren zu orips Beitrag, denke ich, ist Folgendes passiert:

  1. Sie haben __init__.py unter Windows bearbeitet.
  2. Der Windows-Editor hat etwas hinzugefügt, das nicht druckt, vielleicht ein Wagenrücklauf (das Zeilenende in Windows ist CR/LF, unter Unix ist es nur LF) oder vielleicht ein STRG-Z (Windows-Ende der Datei).
  3. Sie haben WinSCP verwendet, um die Datei auf Ihre Unix-Box zu kopieren.
  4. WinSCP dachte: "Dies hat etwas, das kein einfacher Text ist. Ich füge eine .bin-Erweiterung hinzu, um Binärdaten anzuzeigen."
  5. Das fehlende __init__.py (jetzt __init__.py.bin genannt) bedeutet, dass Python das Toolkit nicht als Paket versteht.
  6. Sie erstellen __init__.py im entsprechenden Verzeichnis und alles funktioniert. ?

Importieren laufen Durch Ihre Verzeichnisse muss jedes Verzeichnis eine __init__.py-Datei haben.

Als ich diese Übung in LPTHW durchführte, stieß ich auf etwas sehr Ähnliches. Ich konnte Python nie dazu bringen, zu erkennen, dass ich Dateien in dem Verzeichnis hatte, aus dem ich aufrief. Aber am Ende konnte ich es zum Laufen bringen. Was ich getan habe und was ich empfehle, ist Folgendes zu versuchen:

(HINWEIS: Aus Ihrem ersten Beitrag gehe ich davon aus, dass Sie einen * NIX-basierten Computer verwenden und Dinge über die Befehlszeile ausführen, daher ist dieser Rat darauf zugeschnitten. Da ich Ubuntu verwende, habe ich dies getan)

1) Wechseln Sie das Verzeichnis (cd) in das Verzeichnis Oben das Verzeichnis, in dem sich Ihre Dateien befinden. In diesem Fall versuchen Sie, die Datei mountain.py auszuführen und das Modul toolkit.interface.py aufzurufen, das sich in separaten Verzeichnissen befindet. In diesem Fall würden Sie zu dem Verzeichnis wechseln, das die Pfade zu diesen beiden Dateien enthält (oder mit anderen Worten, das nächste Verzeichnis, das die Pfade dieser beiden Dateien gemeinsam haben). Dies ist in diesem Fall das Toolkit-Verzeichnis.

2) Wenn Sie sich im Verzeichnis takeit befinden, geben Sie diese Codezeile in Ihre Befehlszeile ein:

Dadurch wird Ihr PYTHONPATH auf "." gesetzt, was im Grunde bedeutet, dass Ihr PYTHONPATH nun nach allen aufgerufenen Dateien in dem Verzeichnis sucht, in dem Sie sich gerade befinden (und genauer gesagt im Unterverzeichnis Branches des Verzeichnisses, in dem Sie sich befinden. Es wird also nicht nur in Ihrem aktuellen Verzeichnis gesucht, sondern in allen Verzeichnissen, die sich befinden In Ihr aktuelles Verzeichnis).

3) Nachdem Sie Ihren PYTHONPATH im obigen Schritt eingestellt haben, führen Sie Ihr Modul von Ihrem aktuellen Verzeichnis (dem Toolkit-Verzeichnis) aus. Python sollte nun die von Ihnen angegebenen Module finden und laden.


Benutzerdefinierte Kurse & Mentoring

Kursdauer: Variable

Ort: Online/Melbourne CBD

Nächster Schulungstermin: Bitte kontaktieren Sie uns

Kosten (ohne GST):

Bitte kontaktieren Sie uns für individuelle und/oder Vor-Ort-Angebote

Mentoring beginnt bei 180 USD/h (mind. 3 Stunden) oder 1350 USD/Tag

Egal, ob Sie mit GIS völlig neu sind oder versiert sind und sich weiterbilden möchten, das Schulungsteam von Spatial Vision ist für Sie da.

Spatial Vision kann einen maßgeschneiderten Kurs erstellen, der auf Sie oder die spezifischen Schulungsanforderungen Ihres Unternehmens zugeschnitten ist. Alle unsere Trainer sind hochgradig akkreditierte Branchenexperten und Berater, die anderen Personen und Organisationen helfen, die Macht der Daten zu nutzen und den nächsten Schritt auf ihrer GIS-Reise zu machen.

Wir bieten auch Mentoring-Dienste auf Stunden- oder Tagesbasis an, um Personen mit spezifischen Schulungsanforderungen zu unterstützen.

Worum geht es?

Maßgeschneiderte Kurse wurden entwickelt, um Ihre Geschäftsprozesse zu unterstützen, indem Geodaten verwendet werden, um funktionierende Beispiele zu entwickeln. Die Teilnehmer lernen und üben GIS-Kernprozesse, die auf ihre Organisation abgestimmt sind.

Unsere Kurse steigern die Geschäftseffizienz, indem die Mitarbeiter Best Practices und bevorzugte Methoden erlernen und sicherstellen, dass eine gute Datenverwaltung und Datenverwaltung in einem einheitlichen Prozess befolgt werden. Jeder Kurs beinhaltet:

  • Praxisorientierte Beispiele zur Maximierung der für die Kursteilnehmer relevanten Lernziele
  • Referenzblätter, die die Teilnehmer bei den praktischen Übungen unterstützen und wertvolle Hinweise für die zukünftige Verwendung werden
  • PowerPoint-Präsentationen mit zusammenfassenden Hinweisen und Tipps sowie gedruckte Handbücher der Kursinhalte werden allen Teilnehmern ebenfalls zur Verfügung gestellt

Wer sollte teilnehmen

Ein benutzerdefinierter Kurs ist besonders nützlich für Teilnehmer, die auf operativer Ebene direkt für die Planung und Implementierung von GIS verantwortlich sind.

Es wird für diejenigen, die bereits eine GIS-Rolle haben, gleichermaßen nützlich sein, insbesondere für diejenigen, die die GIS-Funktionen unterstützen, damit sie besser einschätzen können, wie ihre Aktivitäten zur Reife des GIS-Prozesses beitragen werden.


3.2.4 Abrufen von Datensätzen mit einer räumlichen Abfrage

Das Anwenden eines SQL-Ausdrucks auf den Suchcursor ist nur für Attributabfragen nützlich, nicht für räumliche Abfragen. Sie können beispielsweise mit einem SQL-Ausdruck problemlos einen Suchcursor für alle Landkreise mit dem Namen "Lincoln" öffnen, aber das Finden aller Landkreise, die den Mississippi berühren oder einschließen, erfordert einen anderen Ansatz. Um eine Teilmenge von Datensätzen basierend auf einem räumlichen Kriterium abzurufen, müssen Sie das Geoverarbeitungswerkzeug Layer nach Position auswählen verwenden.

Einige relationale Datenbanken wie SQL Server stellen räumliche Datentypen bereit, die kann mit SQL räumlich abgefragt werden. Die Unterstützung dieser räumlichen Typen in ArcGIS entwickelt sich noch weiter, und in diesem Kurs gehen wir davon aus, dass eine räumliche Abfrage über Layer nach Position auswählen erfolgt. Da wir ArcSDE nicht verwenden, ist dies tatsächlich der Fall.

Angenommen, Sie möchten eine Liste aller Bundesstaaten erstellen, deren Grenzen Wyoming berühren. Wie wir im vorherigen Abschnitt mit dem Werkzeug Layer nach Attribut auswählen gesehen haben, gibt das Werkzeug Layer nach Position auswählen einen Feature-Layer zurück, der die Features enthält, die die Abfragekriterien erfüllen. Eine Sache, die wir im vorherigen Abschnitt nicht erwähnt haben, ist, dass ein Suchcursor nicht nur für Feature-Classes, sondern auch für Feature-Layer geöffnet werden kann. Vor diesem Hintergrund ist hier eine Reihe von Schritten, die Sie unternehmen können, um eine Liste der Nachbarn von Wyoming zu erstellen:

  1. Verwenden Sie Layer nach Attribut auswählen für die State-Feature-Class, um einen Feature-Layer von nur Wyoming zu erstellen. Nennen wir dies den Layer Selection State.
  2. Verwenden Sie Layer nach Position auswählen für die State-Feature-Class, um einen Feature-Layer nur aus den Bundesstaaten zu erstellen, die den Selection State-Layer berühren. Nennen wir dies die Neighbors-Ebene.
  3. Öffnen Sie einen Suchcursor auf dem Layer Neighbors. Der Cursor enthält nur Wyoming und die Staaten, die ihn berühren, da die Ebene "Nachbarn" die in Schritt 2 oben angewendete Auswahl ist. Denken Sie daran, dass der Feature-Layer nur eine Reihe von Datensätzen im Speicher ist.

Unten ist ein Code, der die obigen Schritte anwendet.

Beim Ausführen von SelectLayerByLocation können Sie aus vielen räumlichen Operatoren wählen. Der obige Code verwendet "BOUNDARY_TOUCHES". Andere verfügbare Beziehungen sind "INTERSECT", "WITHIN A DISTANCE" (kann Ihnen einen Pufferungsschritt ersparen), "CONTAINS", "CONTAINED_BY" und andere.

Beachten Sie, dass das Row-Objekt "row" nur ein Feld ("NAME") zurückgibt, auf das über seine Indexposition in der Liste der Felder zugegriffen wird. Da es nur ein Feld gibt, ist dieser Index 0 und die Syntax sieht so aus: row[0]. Sobald Sie den Suchcursor für Ihre ausgewählten Datensätze öffnen, können Sie die gewünschte Aktion für diese ausführen. Der obige Code gibt nur den Statusnamen aus, aber wahrscheinlicher möchten Sie Attributwerte zusammenfassen oder aktualisieren. Sie werden später in dieser Lektion lernen, wie Sie Attributwerte schreiben.

Bereinigen von Feature-Layern und Cursors

Beachten Sie, dass die Feature-Layer mit dem Werkzeug Löschen gelöscht werden. Dies liegt daran, dass Feature-Layer Ihre Daten sperren können, sodass andere Anwendungen die Daten nicht verwenden können, bis Ihr Skript fertig ist. arcpy soll Feature-Layer am Ende des Skripts bereinigen, aber es ist eine gute Idee, sie selbst zu löschen, falls dies nicht passiert oder es zu einem Absturz kommt. In den obigen Beispielen stürzt der Block ausserhalb ab, dann fährt das Skript fort und löscht die beiden Feature-Layer.

Cursor können auch Datensperren aufrechterhalten. Wie bereits erwähnt, die "mit"-Anweisung sollte bereinigen Sie den Cursor automatisch für Sie. Wir haben jedoch festgestellt, dass dies nicht immer der Fall ist, eine Beobachtung, die durch diesen Klappentext aus Esris Dokumentation der arcpy.da.SearchCursor-Klasse bestätigt zu werden scheint:

Suchcursor unterstützen auch Anweisungen zum Zurücksetzen der Iteration und zum Entfernen von Sperren. Es sollte jedoch in Betracht gezogen werden, eine del-Anweisung zum Löschen des Objekts zu verwenden oder den Cursor in eine Funktion einzuschließen, damit das Cursorobjekt den Gültigkeitsbereich verlässt, um alle Sperrfälle zu vermeiden.

Ein letzter zu beachtender Punkt bei diesem Code, der die Feature-Layer und den Cursor bereinigt, ist, dass er in a eingebettet ist schließlich Block. Dies ist ein Konstrukt, das gelegentlich mit try verwendet wird, außer um Code zu definieren, der unabhängig davon ausgeführt werden soll, ob die Anweisungen im try-Block erfolgreich ausgeführt werden. Um die Nützlichkeit von finally zu verstehen, stellen Sie sich vor, Sie hätten diese cleanup-Anweisungen stattdessen am Ende des try-Blocks platziert. Wenn irgendwo oberhalb dieses Punktes im try-Block ein Fehler auftritt - nicht schwer vorstellbar, oder? -- Der Rest des try-Blocks würde nicht ausgeführt, sodass die Feature-Layer und der Cursor im Speicher bleiben. Eine nachfolgende Ausführung des Skripts nach Behebung des Fehlers würde auf ein neues Problem stoßen: Das Skript könnte den in selectionStatesLayer gespeicherten Feature-Layer nicht erstellen, da er bereits vorhanden ist. Mit anderen Worten, die Cleanup-Anweisungen würden nur ausgeführt, wenn der Rest des Skripts erfolgreich ausgeführt wurde.

In dieser Situation ist die abschließende Aussage besonders hilfreich. Code in einem finally-Block wird unabhängig davon ausgeführt, ob etwas im try-Block einen Absturz auslöst. (Falls ein Fehler auftritt, wird der finally-Code nach dem outside-Code ausgeführt.) Wenn Sie also Ihren eigenen Code unter Verwendung von Feature-Layern und/oder Cursorn entwickeln, ist es eine gute Idee, diese Cleanup-Anweisungen in einem finally Block.

Alternative Syntax

Die Implementierung der Werkzeuge Layer nach Attribut/Standort auswählen erforderte in früheren Versionen von ArcGIS eine andere Syntax. Die Werkzeuge gaben keinen Feature-Layer zurück, sondern erforderten, dass Sie den Feature-Layer zuerst selbst mit dem Werkzeug Feature-Layer erstellen erstellen. Sehen wir uns das gleiche Beispiel mit dieser Syntax an:

Beachten Sie, dass die erste MakeFeatureLayer-Anweisung die Boundaries-Feature-Class als Eingabe verwendet und als Ausgabe einen Feature-Layer erzeugt, auf den im restlichen Skript mit dem Namen "AllStatesLayer" verwiesen werden kann. In ähnlicher Weise erstellt die nächste Anweisung einen weiteren Feature-Layer aus der Boundaries-Feature-Class, wobei dieser eine where-Klausel anwendet, um die enthaltenen Features auf Wyoming zu beschränken. Dieser Feature-Layer trägt den Namen "SelectionStateLayer". Die Erstellung dieser Feature-Layer war in dieser älteren Syntax erforderlich, da die Werkzeuge Layer nach Attribut/Standort auswählen nur Feature-Layer, nicht Feature-Classes, als gültige Eingaben erkennen würden.

Obwohl wir diese Syntax etwas seltsam und weniger intuitiv finden als die am Anfang dieses Abschnitts gezeigte, funktioniert sie immer noch und Sie werden möglicherweise darauf stoßen, wenn Sie sich die Skripte anderer ansehen.

Pflichtlektüre

Bevor Sie fortfahren, sehen Sie sich die folgenden Werkzeugreferenzseiten an. Achten Sie besonders auf die Abschnitte Verwendung und Codebeispiel.