Как удалить выбранные строки с помощью ArcPy?

10

Я хочу удалить все строки в классе пространственных объектов, но оставить строки с 1 по 5. С другой стороны, я хочу оставить первые пять строк и удалить другие. Я знаю, что я должен использовать поисковый курсор и обновить курсор, но я не мог их использовать. Как я могу удалить строки с помощью ArcPy?

BBG_GIS
источник
1
Выберите по атрибуту «FID»> 4 и используйте arcpy.Deletefeatures
FelixIP
Просто из куристов, почему вы не можете использовать курсоры?
fatih_dur
@fatih_dur, потому что я новичок в Arcpy
BBG_GIS
импортировать arcpy fc = r'C: \ temp \ test.gdb \ tmp 'expression = "objectid> 5" с arcpy.da.UpdateCursor (fc, "OBJECTID", где_clause = expression) в качестве курсора: для строки в курсоре: if row [0]> 5: cursor.deleteRow ()
kumar

Ответы:

24

Вы можете использовать курсор обновления, чтобы удалить строки в зависимости от ваших условий. В этом примере удаляются все строки, в которых OBJECTID> 5.

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

В качестве альтернативы, используйте Выбор слоя по атрибуту (Управление данными) .

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"))
Аарон
источник
+1 за сохранение оригинальных функций, пока позволяют системные ресурсы. Один вопрос: что если OID не начинаются с 1 и не являются последовательными?
fatih_dur
@ Аарон Спасибо. Можно ли использовать тип поля идентификатора объекта вместо имени "OBJECTID". потому что в некоторых слоях имя объекта отличается.
BBG_GIS
@faith_dur Будьте внимательны, приравнивая OID и OBJECTID; исходный формат диктует поведение. Столбец OID rowid шейп-файлов является неизменным (и основан на нуле), в то время как OBJECTID многопользовательской или файловой базы геоданных сохраняет значение после инициализации (и, как правило, на основе одного). У вас есть хорошая мысль, что подзапрос SQL с ORDER BY и LIMIT необходим для определения текущих первых 5 строк.
Винс
1
@wetland Да, вы можете использовать OID@токен - просто замените «OBJECTID» на «OID @».
Аарон