Mehr

Arcpy.da.Editor richtig verwenden?

Arcpy.da.Editor richtig verwenden?


Ich versuche, Duplikate in einer Feature-Class zu entfernen, die von einem Python-Skript generiert werden. Am Ende meines Skripts habe ich den folgenden Codeblock; Ich habe es noch nicht implementiert, würde aber gerne sehen, ob dies der richtige Weg ist, arcpy.da.Editor zu verwenden, da die Fehler, die ich erhalten habe, sich außerhalb einer Bearbeitungssitzung befinden.

Wird arcpy.da.Editor hier richtig verwendet?

'

field = ['OBJECTID', 'SRNumber', 'ItemLoc_9'] table_rows = [] delete_rows = [] where_clause = """ ItemLoc_9 ="""" with arcpy.da.Editor(appendClass) as edit: with arcpy.da .SearchCursor(appendClass, Felder, where_clause) als Cursor: für Zeile im Cursor: if [row[1], row[2]] in table_rows: delete_rows.append(row[0]) else: table_rows.append([row[ 1], row[2]]) del table_rows with arcpy.da.UpdateCursor(appendClass, ['OBJECTID']) as cursor2: for row in cursor2: if row[0] in delete_rows: print 'Datensatz löschen: OBJECTID = ' + str(row[0]) cursor2.deleteRow() print '
done"

Ich erinnere mich, dass ich ein Problem mit dem Editor in der with-Anweisung hatte, aber ich habe es schon eine Weile nicht mehr ausprobiert.

Sie können stattdessen dieses Format ausprobieren:

edit = arcpy.da.Editor(workspace) edit.startEditing(False, True) edit.startOperation() ##CODE edit.stopOperation() edit.stopEditing(True)

Ich habe mir ein altes Skript angesehen und das ist das Format, das ich verwendet habe.


Ich hatte in der Vergangenheit viele Probleme/Unstimmigkeiten damit. Stattdessen habe ich einige Wrapper sowohl für den Update- als auch für den Insert-Cursor implementiert. Auf diese Weise weiß ich jedes Mal, wenn ich einen Update-Cursor ausführe, dass eine Editiersitzung für den Cursor ordnungsgemäß gestartet und gestoppt wird. Hier ist mein Update-Cursor (mit einer Hilfsfunktion zum Abrufen des Arbeitsbereichs):

import arcpy import os def find_ws(path, ws_type="): """findet einen gültigen Workspace-Pfad für eine arcpy.da.Editor()-Sitzung Erforderlich: path -- Pfad zu Features oder Workspace Optional: ws_type -- Option to find spezifischer Arbeitsbereichstyp (FileSystem|LocalDatabase|RemoteDatabase) """ # Versuchen Sie zuerst den ursprünglichen Pfad, wenn os.sep nicht im Pfad ist: path = arcpy.Describe(path).catalogPath desc = arcpy.Describe(path) if hasattr(desc, ' workspaceType'): if ws_type und ws_type == desc.workspaceType: Rückgabepfad elif not ws_type: Rückgabepfad # suchen bis ein gültiger Arbeitsbereich gefunden wird SPLIT = filter(None, path.split(os.sep)) if path.startswith(' '): SPLIT[0] = r'{0}'.format(SPLIT[0]) # finde gültigen Arbeitsbereich für i in xrange(1, len(SPLIT)): sub_dir = os.sep .join(SPLIT[:-i]) desc = arcpy.Describe(sub_dir) if hasattr(desc, 'workspaceType'): if ws_type und ws_type == desc.workspaceType: return sub_dir elif not ws_type: return sub_dir class UpdateCursor(object ): """Wrapper-Klasse für arcpy.da.UpdateCursor, um automatisch zu im Elementbearbeitung (erforderlich für versionierte Daten und Daten mit geometrischen Netzwerken, Topologien, Netzwerk-Datasets und Beziehungsklassen""" def __init__(self, *args, **kwargs): """initiiere Wrapper-Klasse für Update-Cursor. Unterstützte Argumente: in_table, field_names, where_clause=None, Spatial_reference=None,explod_to_points=False, sql_clause=(None, None) """ self.args = args self.kwargs = kwargs self.edit = None def __enter__(self) ws = None if self.args: ws = find_ws(self.args[0]) elif 'in_table' in self.kwargs: ws = find_ws(self.kwargs['in_table']) self.edit = arcpy.da.Editor (ws) self.edit.startEditing() self.edit.startOperation() return arcpy.da.UpdateCursor(*self.args, **self.kwargs) def __exit__(self, type, value, traceback): self.edit .stopOperation() self.edit.stopEditing(True) self.edit = Keine

Wenn Sie dies also irgendwo in Ihrem PYTHONPATH speichern und den Update-Cursor aufrufen, können Sie immer sicher sein, dass eine Editiersitzung gestartet und gestoppt wird. Dieser Wrapper ermöglicht auch die Verwendung der with-Anweisung für den Cursor.

Wenn Sie das obige Skript gespeichert haben alssome_module.pyund speichern Sie es in Ihrem PYTHONPATH, Sie können es so aufrufen:

import some_module fc = r'C:Path	o_yourFileGeodatabaseYourFC' fields = ["field1", "field2"] with some_module.UpdateCursor(fc,fields) as rows: for row in rows: row[1] = row[0] rows.updateRow(row)

Dies funktioniert bei einer versionierten Datenbank-Feature-Class:

edit = arcpy.da.Editor(workspace) # Edit-Sitzung wird ohne Rückgängig-/Wiederholen-Stack für versionierte Daten gestartet # (für das zweite Argument False für nicht versionierte Daten verwenden) edit.startEditing(False, True) # Update-Cursor mit arcpy erstellen .da.UpdateCursor("Ihre Parameter") als Cursor: # Starte eine Editieroperation edit.startOperation() für Zeile im Cursor: # Dein Code # Stoppe die Editieroperation. edit.stopOperation() # Stoppt die Editiersitzung und speichert die Änderungen edit.stopEditing(True)