Como excluir linhas selecionadas usando o ArcPy?

10

Quero excluir todas as linhas de uma classe de recurso, mas permaneço as linhas de 1 a 5. Por outro lado, desejo permanecer as cinco primeiras linhas e excluir outras. Eu sei que tenho que usar o cursor de pesquisa e atualizar o cursor, mas não consegui usá-los. Como posso excluir as linhas usando o ArcPy?

BBG_GIS
fonte
11
Selecione por atributo "FID"> 4 e use arcpy.Deletefeatures
FelixIP
Apenas por curiosidade, por que você não pode usar cursores?
fatih_dur
@fatih_dur porque eu sou iniciante em Arcpy
BBG_GIS
import arcpy fc = r'C: \ temp \ test.gdb \ tmp 'expression = "objectid> 5" com arcpy.da.UpdateCursor (fc, "OBJECTID", where_clause = expression) como cursor: para linha no cursor: se linha [0]> 5: cursor.deleteRow ()
kumar

Respostas:

24

Você pode usar um Cursor de Atualização para excluir linhas com base em suas condições. Neste exemplo, todas as linhas em que OBJECTID> 5 são excluídas.

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

Como alternativa, use Selecionar Camada por Atributo (Gerenciamento de Dados) .

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
fonte
+1 para manter os recursos originais enquanto os recursos do sistema permitirem. Uma pergunta: e se os OIDs não começarem de 1 e não forem consecutivos?
fatih_dur
@ Aaron Obrigado. É possível usar o tipo de campo de identificação do objeto em vez do nome "OBJECTID". porque em algumas camadas o nome do ID do objeto é diferente.
BBG_GIS
@faith_dur Tenha cuidado ao equiparar "OID" e "OBJECTID"; o formato de origem determina o comportamento. A coluna rowid OID de shapefiles é imutável (e com base em zero), enquanto um banco de dados geográfico de empresa ou arquivo OBJECTID retém valor após a inicialização (e geralmente é baseado em um). Você tem um bom argumento de que uma subconsulta SQL com ORDER BY e LIMIT seria necessária para identificar as 5 primeiras linhas atuais.
Vince
11
@wetland Sim, você pode usar o OID@token - basta substituir "OBJECTID" por "OID @".
Aaron