Comment supprimer des lignes sélectionnées à l'aide d'ArcPy?

10

Je souhaite supprimer toutes les lignes d'une classe d'entités mais conserver les lignes 1 à 5. En revanche, je souhaite conserver les cinq premières lignes et en supprimer d'autres. Je sais que je dois utiliser le curseur de recherche et le curseur de mise à jour, mais je ne pouvais pas les utiliser. Comment puis-je supprimer les lignes à l'aide d'ArcPy?

BBG_GIS
la source
1
Sélectionnez par attribut "FID"> 4 et utilisez arcpy.Deletefeatures
FelixIP
Juste par curiosité, pourquoi ne pourriez-vous pas utiliser des curseurs?
fatih_dur
@fatih_dur parce que je suis débutant à Arcpy
BBG_GIS
importer arcpy fc = r'C: \ temp \ test.gdb \ tmp 'expression = "objectid> 5" avec arcpy.da.UpdateCursor (fc, "OBJECTID", where_clause = expression) comme curseur: pour la ligne dans le curseur: si ligne [0]> 5: cursor.deleteRow ()
kumar

Réponses:

24

Vous pouvez utiliser un curseur de mise à jour pour supprimer des lignes en fonction de vos conditions. Dans cet exemple, toutes les lignes où OBJECTID> 5 sont supprimées.

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()

Vous pouvez également utiliser Sélectionner la couche par attribut (gestion des données) .

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
la source
+1 pour conserver les fonctionnalités d'origine tant que les ressources système le permettent. Une question, que se passe-t-il si les OID ne commencent pas à partir de 1 et ne sont pas consécutifs?
fatih_dur
@Aaron Merci. Est-il possible d'utiliser le type de champ id objet au lieu du nom "OBJECTID". car dans certaines couches, le nom de l'ID d'objet est différent.
BBG_GIS
@faith_dur Soyez prudent en assimilant "OID" et "OBJECTID"; le format source dicte le comportement. La colonne OID rowid des fichiers de formes est immuable (et basée sur zéro), tandis qu'une OBJECTID de géodatabase d'entreprise ou de fichier conserve sa valeur après l'initialisation (et est généralement basée sur une seule). Vous avez un bon point qu'une sous-requête SQL avec un ORDER BY et LIMIT serait nécessaire pour identifier les 5 premières lignes actuelles.
Vince
1
@wetland Oui, vous pouvez utiliser le OID@jeton - remplacez simplement "OBJECTID" par "OID @".
Aaron