วิธีการลบแถวที่เลือกโดยใช้ ArcPy


10

ฉันต้องการลบแถวทั้งหมดในคลาสคุณลักษณะ แต่ยังคงอยู่แถวที่ 1 ถึง 5 ในอีกทางหนึ่งฉันต้องการคงแถวห้าแถวแรกและลบแถวอื่น ๆ ฉันรู้ว่าฉันต้องใช้เคอร์เซอร์ค้นหาและอัปเดตเคอร์เซอร์ แต่ฉันไม่สามารถใช้ได้ ฉันจะลบแถวโดยใช้ ArcPy ได้อย่างไร


1
เลือกตามคุณสมบัติ "FID"> 4 และใช้ arcpy.Deletefeatures
FelixIP

เพิ่งออกมาจาก curoisty ทำไมคุณถึงใช้เคอร์เซอร์ไม่ได้ล่ะ?
fatih_dur

@fatih_dur เพราะฉันเริ่มต้นใน Arcpy
BBG_GIS

นำเข้า arcpy fc = r'C: \ temp \ test.gdb \ tmp 'expression = "objectid> 5" ด้วย arcpy.da.UpdateCursor (fc, "OBJECTID", where_clause = expression) เป็นเคอร์เซอร์: สำหรับแถวในเคอร์เซอร์: ถ้า แถว [0]> 5: cursor.deleteRow ()
kumar

คำตอบ:


24

คุณสามารถใช้Update Cursorเพื่อลบแถวตามเงื่อนไขของคุณ ในตัวอย่างนี้แถวใด ๆ ที่ลบ 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

@Aaron ขอบคุณ เป็นไปได้หรือไม่ที่จะใช้ประเภทฟิลด์รหัสวัตถุแทนชื่อ "OBJECTID" เพราะในบางเลเยอร์ชื่อของ id วัตถุจะแตกต่างกัน
BBG_GIS

@faith_dur ระมัดระวังด้วย equate "OID" และ "OBJECTID"; รูปแบบต้นฉบับกำหนดพฤติกรรม คอลัมน์ rowid ของ OID ของ shapefiles นั้นไม่เปลี่ยนรูปแบบ (และอิงตามศูนย์) ในขณะที่องค์กรหรือฐานข้อมูลทางภูมิศาสตร์ OBJECTID จะเก็บค่าไว้หลังจากการเริ่มต้น (และมักจะเป็นฐานเดียว) คุณมีจุดที่ดีที่แบบสอบถามย่อย SQL ที่มีคำสั่ง ORDER BY และ LIMIT จำเป็นต้องระบุแถว 5 แถวแรกในปัจจุบัน
Vince

1
@wetland ใช่คุณสามารถใช้OID@โทเค็น - เพียงแค่แทนที่ "OBJECTID" ด้วย "OID @"
Aaron
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.