Wie lösche ich ausgewählte Zeilen mit ArcPy?

10

Ich möchte alle Zeilen in einer Feature-Class löschen, aber die Zeilen 1 bis 5 bleiben. Andererseits möchte ich die ersten fünf Zeilen bleiben und andere löschen. Ich weiß, dass ich den Suchcursor und den Aktualisierungscursor verwenden muss, aber ich konnte sie nicht verwenden. Wie kann ich die Zeilen mit ArcPy löschen?

BBG_GIS
quelle
1
Wählen Sie mit dem Attribut "FID"> 4 und verwenden Sie arcpy.Deletefeatures
FelixIP
Warum konnten Sie aus Neugier keine Cursor verwenden?
fatih_dur
@ Fatih_dur, weil ich Anfänger in Arcpy bin
BBG_GIS
importiere arcpy fc = r'C: \ temp \ test.gdb \ tmp 'expression = "objectid> 5" mit arcpy.da.UpdateCursor (fc, "OBJECTID", wobei_clause = expression) als Cursor: für Zeile im Cursor: if row [0]> 5: cursor.deleteRow ()
kumar

Antworten:

24

Sie können einen Aktualisierungscursor verwenden , um Zeilen basierend auf Ihren Bedingungen zu löschen. In diesem Beispiel werden alle Zeilen gelöscht, in denen OBJECTID> 5 ist.

import arcpy

fc = r'C:\temp\test.gdb\tmp'

with arcpy.da.UpdateCursor(fc, "OBJECTID") as cursor:
    for row in cursor:
        if row[0] > 5:
            cursor.deleteRow()

Alternativ können Sie Layer nach Attribut auswählen (Datenverwaltung) verwenden .

import arcpy, os

fc = r'C:\temp\test.gdb\tmp'
outws = r'C:\temp\test.gdb'

# Make a layer from the feature class
arcpy.MakeFeatureLayer_management(fc, "fc_lyr")

# Use a SQL query to select OBJECTID 1 - 5
arcpy.SelectLayerByAttribute_management("fc_lyr", "", ' "OBJECTID" <= 5 ')

# Write the selected features to a new feature class
arcpy.CopyFeatures_management("fc_lyr", os.path.join(outws, "fc_out"))
Aaron
quelle
+1, um die ursprünglichen Funktionen beizubehalten, solange die Systemressourcen dies zulassen. Eine Frage: Was ist, wenn die OIDs nicht bei 1 beginnen und nicht aufeinander folgen?
fatih_dur
@ Aaron Danke. Ist es möglich, den Feldtyp ID-ID anstelle des Namens "OBJECTID" zu verwenden? weil in einigen Ebenen der Name der Objekt-ID unterschiedlich ist.
BBG_GIS
@faith_dur Seien Sie vorsichtig beim Gleichsetzen von "OID" und "OBJECTID"; Das Quellformat bestimmt das Verhalten. Die OID-Zeilen-ID-Spalte von Shapefiles ist unveränderlich (und nullbasiert), während eine Unternehmens- oder Datei-Geodatabase OBJECTID nach der Initialisierung den Wert beibehält (und normalerweise einsbasiert ist). Sie haben einen guten Punkt, dass eine SQL-Unterabfrage mit ORDER BY und LIMIT erforderlich wäre, um die aktuellen ersten 5 Zeilen zu identifizieren.
Vince
1
@wetland Ja, Sie können das OID@Token verwenden - ersetzen Sie einfach "OBJECTID" durch "OID @".
Aaron