วิธีลดขนาดของรูปร่างเมื่อคุณสมบัติถูกลบไปแล้ว?


9

สคริปต์ตัวจิ๋วนี้จะลบฟีเจอร์เล็ก ๆ ทั้งหมดในเลเยอร์ทั้งหมด ใช้งานได้ดี แต่ขนาดของไฟล์. shp จะไม่ลดลง บอกฉันทีว่าทำไม...

canvas = iface.mapCanvas()
expr = QgsExpression("$length<100")
for l in canvas.layers():
    l.startEditing()
    it = l.getFeatures(QgsFeatureRequest(expr))
    for ft in it:
        l.deleteFeature(ft.id())
    l.commitChanges()

คำตอบ:


14

เนื่องจากวิธีที่เร็วที่สุดในการลบฟีเจอร์จาก shapefiles คือการทำเครื่องหมายระเบียนด้วยแฟล็ก "ลบ" ในส่วน. dbf โดยไม่ต้องเขียนส่วน. shp, .shx และ. dbf ใหม่ทั้งหมด นี่เป็นเอกสารในหน้าไดรเวอร์ GDAL shp http://www.gdal.org/drv_shapefile.html

OGR shapefile driver สนับสนุนการเขียนรูปร่างที่มีอยู่ใน shapefile รวมถึงการลบรูปร่าง รูปร่างที่ถูกลบถูกทำเครื่องหมายสำหรับการลบในไฟล์. dbf จากนั้นละเว้นโดย OGR หากต้องการลบออกอย่างถาวร (ส่งผลให้การจัดลำดับใหม่ของ FID) เรียกใช้ SQL 'REPACK' ผ่านทางแหล่งข้อมูล ExecuteSQL () วิธีการ


2
ในทางเทคนิคแล้วคุณสมบัติ "ทำเครื่องหมายว่าลบแล้ว" ของ dBase ไม่รองรับโดย shapefiles ดังนั้น GDAL จึงสร้างรูปร่างที่เสียหายเมื่อดำเนินการนี้
วินซ์

มีคำตอบเก่าgis.stackexchange.com/questions/162615/ … (อันนี้อาจจะซ้ำกัน) ที่ฉันพบว่า MapObjects โดย ESRI มีเมธอด delRecord (ดัชนี) ที่คล้ายกันซึ่งไม่ได้ลบอะไรทางร่างกาย บางทีโปรแกรม ESRI จะดูแลการรัน "แพ็ค" ให้ดีขึ้นก่อนที่จะปิดรูปร่างของไฟล์ แต่ก็รู้สึกว่าพวกเขายังรองรับ "ทำเครื่องหมายว่าลบแล้ว" ด้วยเช่นกัน
user30184

การดำเนินการ 'บันทึกเป็น' บนเลเยอร์จะลบคุณลักษณะที่ถูกลบออก
SpatialSuccess

ฉันไม่เคยมีประสบการณ์ที่ยอดเยี่ยมใน QGIS และ python คุณเรียกใช้ SQL 'REPACK' ได้อย่างไร
EvanH

5

คุณควรตรวจสอบเวอร์ชั่นของ QGIS ว่าคุณเห็นสิ่งนี้หรือไม่

ฉันรู้ว่าพฤติกรรมนี้ tweaked ในรุ่น 2.14 ดังนั้นหลังจากโทร deleteFeatures Shapefile จะถูก repacked เพื่อลบแถวเด็กกำพร้าใด ๆ ที่เหลือ

คุณควรทดสอบเวอร์ชัน 2.14 อีกครั้งและดูว่ามีการปรับปรุงหรือไม่


ขอบคุณมากสำหรับคำตอบของคุณ. มันฟังดูยอดเยี่ยมมากที่มันถูกปรับแต่งในเวอร์ชั่น 2.14 ฉันใช้เวอร์ชั่น 2.12.2 และฉันรู้ว่า 2.12.3 พร้อมดาวน์โหลดแล้ว แต่ฉันจะหาเวอร์ชั่น 2.14 ได้ที่ไหน
EvanH
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.