Làm cách nào để xóa các hàng đã chọn bằng ArcPy?


10

Tôi muốn xóa tất cả các hàng trong một lớp đối tượng nhưng vẫn giữ các hàng từ 1 đến 5. Mặt khác, tôi muốn giữ lại năm hàng đầu tiên và xóa các hàng khác. Tôi biết rằng tôi phải sử dụng con trỏ tìm kiếm và cập nhật con trỏ nhưng tôi không thể sử dụng chúng. Làm cách nào để xóa các hàng bằng ArcPy?


1
Chọn theo thuộc tính "FID"> 4 và sử dụng arcpy.Deletefeatures
FelixIP

Chỉ cần ra khỏi curoisty, tại sao bạn không thể sử dụng con trỏ?
fatih_dur

@fatih_dur vì tôi là người mới bắt đầu ở Arcpy
BBG_GIS

nhập hồ quang fpy hàng [0]> 5: con trỏ.deleteRow ()
kumar

Câu trả lời:


24

Bạn có thể sử dụng Con trỏ cập nhật để xóa các hàng dựa trên các điều kiện của bạn. Trong ví dụ này, bất kỳ hàng nào có OBRIID> 5 bị xóa.

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

Hoặc, sử dụng Chọn lớp theo thuộc tính (Quản lý dữ liệu) .

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 để giữ các tính năng gốc miễn là tài nguyên hệ thống cho phép. Một câu hỏi, nếu OID không bắt đầu từ 1 và không liên tiếp thì sao?
fatih_dur

@Aaron Cảm ơn. Có thể sử dụng loại trường id đối tượng thay vì tên "OBRIID". bởi vì trong một số lớp tên của id đối tượng là khác nhau.
BBG_GIS

@faith_dur Cẩn thận với việc đánh đồng "OID" và "OBRIID"; định dạng nguồn ra lệnh hành vi. Cột hàng OID của shapefiles là bất biến (và không dựa trên cơ sở), trong khi một doanh nghiệp hoặc tệp cơ sở dữ liệu địa lý OBRIID giữ lại giá trị sau khi khởi tạo (và thường là dựa trên một). Bạn có một điểm hay là một truy vấn con SQL với ORDER BY và LIMIT sẽ cần thiết để xác định 5 hàng đầu tiên hiện tại.
Vince

1
@wetland Có, bạn có thể sử dụng OID@mã thông báo - chỉ cần thay thế "ĐỐI TƯỢNG" bằng "OID @".
Aaron
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.