Reduzieren Sie die Verarbeitungszeit in der Löschfunktion mithilfe von Arcpy in IDLE

8

Ich verarbeite 18.000 Feature-Classes (in einer GDB-Datei gespeichert) mit jeweils ~ 500 Datensätzen (Polygon-Features) in Meeresgebieten und führe mithilfe der Löschfunktion ein Skript zum Entfernen von mit der Küste überlappenden Bereichen aus. Das Skript wird erfolgreich ausgeführt, dauert jedoch buchstäblich Tage. Die Verarbeitung einiger Dateien dauert Sekunden (ich gehe davon aus, dass dies auf die Tatsache zurückzuführen ist, dass sie sich nicht mit der Küstenlinie überschneiden), während die Verarbeitung einiger Feature-Classes über eine Stunde dauert.

Ich arbeite lokal auf meinem Computer und führe das Skript in IDLE mit ArcGIS 10.1 (alle Lizenzen) auf einem 32-Bit-Computer mit Windows 7, 3,33 GHz Intel DuoCore und 4 GB RAM aus.

Ich lerne die Seile mit Python und würde mich sehr über Tipps zu meinem Skript freuen, wenn ich Schritte unternehmen kann, um die Verarbeitungszeit zu verkürzen. Vielen Dank!

# Import modules
import arcpy
import sys
import os
from arcpy import env

arcpy.env.overwriteOutput = True
print arcpy.env.overwriteOutput

#Erase coastline from selected buffers.
workspace = "C:\\DIR\\points_buff\\"
arcpy.env.workspace = workspace
erase_output = workspace+"erased.gdb\\"
erasedirectorypath = "C:\\DIR\\points_buff\\selectedbuff.gdb"
fileList = []

for dirpath, dirnames, erases in arcpy.da.Walk(erasedirectorypath,
                                              datatype="FeatureClass",
                                              type="Polygon"):
    for erase in erases:
        fileList.append(os.path.join(dirpath, erase))
        filenameparts = erase.split('_')
        if int(filenameparts[1]) > int(1967):

            try:
        #Set variables for Erase tool
                in_features = erasedirectorypath+"\\"+erase
                coastline_feat = "C:\\DIR\\Basic_NE.gdb\\Coastline_Eastern_US"
                out_erase_feat = erase_output+erase[:-4]+"_er"
                arcpy.Erase_analysis(in_features, coastline_feat, out_erase_feat, '')
                print arcpy.GetMessages()
                print "Coastline has been erased from " + erase + " and saved to " + erase_output

            except:
                print arcpy.GetMessages()
SharonB
quelle

Antworten:

7

Obwohl es schwierig ist, Fehler in Ihrem Skript zu beheben, ohne die räumlichen Daten zu sehen, können einige Tricks und Ideen Ihren Workflow unterstützen. Setzen Sie zunächst Ihren Datensatz in eine Teilmenge und experimentieren Sie mit verschiedenen Ansätzen. Integrieren Sie eine Zeitschaltuhr in Ihr Skript, um ein Gefühl dafür zu bekommen, wie schnell oder langsam Vorgänge sind. Versuchen Sie, Ihre Befehle mit einem zu versehen time.clock. Zum Beispiel:

import time
StartTime = time.clock()
arcpy.Erase_analysis(in_features, coastline_feat, out_erase_feat, '')
EndTime = time.clock()
print "Erase finished in %s hours" % ((EndTime - StartTime)/3600)
time.sleep(2.5)
  • Versuchen Sie, die Leistung des Arbeitsbereichs in_memory zu nutzen . Im Allgemeinen sind die ausgeführten Vorgänge in_memoryschneller als die auf die Festplatte geschriebenen. Verwendung in_memoryfür Zwischenoperationen.

  • Verwenden Sie anstelle des Befehls Löschen die folgenden Befehle, um einen ähnlichen Workflow auszuführen:

Feature Layer erstellen (Datenverwaltung)

Wählen Sie Schicht nach Ort (Datenverwaltung)

Funktionen löschen (Datenverwaltung)

Kopierfunktionen (Datenverwaltung)

  • Sind Ihre Polygone zu kompliziert? Auflösen (Datenverwaltung) kann helfen.
  • Betrachten Sie einen rasterbasierten Ansatz, möglicherweise unter Verwendung einer Maske (falls möglich).
Aaron
quelle
2
Die Berechnung der Zeit kann für den Vergleich von Methoden von unschätzbarem Wert sein, insbesondere wenn Sie viele verschiedene Ansätze für eine kleine Teilmenge von Daten ausprobieren.
Aaron
2
Ja, denken Sie daran, dass Sie in_memory-Dateien in Ihrem Skript mithilfe von Löschen (Datenverwaltung) problemlos löschen können.
Aaron
4
Wie viele Features enthält die Coastline-Datei und wie viele Scheitelpunkte enthält ein Feature normalerweise? Wie groß ist die Fläche? Wie groß ist der Bereich, den Ihre Feature-Classes normalerweise abdecken? Wenn Ihre Küstendatei sehr große und komplizierte Funktionen enthält, kann dies die Ursache für die Verlangsamung sein. Es gibt einige Methoden, um dies anzupassen, wenn es das Problem ist.
Blord-Castillo
2
Ich würde eigentlich den entgegengesetzten Weg gehen. Lösen Sie zuerst die Features auf und teilen Sie dann das große Polygon in mehrere separate Feature-Classes mit jeweils einem Polygon auf. Versuchen Sie, nur eine dieser untergeordneten Feature-Classes für einzelne Feature-Küstenlinien für eine Ihrer Feature-Classes auszuführen, die eine Weile gedauert haben (und sich überschnitten haben). Sehen Sie, ob dies zu einer Verbesserung führt. Ich denke, Ihre Kreuzungshüllkurven sind möglicherweise einfach zu groß, wodurch alle Leistungsverbesserungen, die bereits in Overlay-Analysen enthalten sind, wegfallen.
Blord-Castillo
4
Ein weiterer zu testender Workflow. Führen Sie Minimum Bounding GeometryIhre Ziel-Feature-Class mit Gruppenoption ALLund Geometrietyp aus ENVELOPE. Führen Sie eine Löschung der resultierenden Hüllkurven-Feature-Class anhand Ihrer riesigen Küste durch. Verwenden Sie diese Ausgabe aus dieser Löschung, um eine Clipfür Ihre ursprüngliche Ziel-Feature-Class durchzuführen. Dies vereinfacht den komplexen Schritt, das Löschen, und ersetzt ihn durch einen kostengünstigeren Clip gegen ein kleineres Feature.
Blord-Castillo