Bagaimana cara mengurangi ukuran shapefile ketika fitur dihapus?

9

Skrip kecil ini menghapus semua fitur kecil di semua lapisan. Ini berfungsi dengan baik tetapi ukuran file .shp tidak berkurang. Tolong beritahu saya mengapa ...

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

Jawaban:

14

Karena cara tercepat untuk menghapus fitur dari shapefile adalah dengan menandai catatan dengan tanda "dihapus" di bagian .dbf tanpa menulis ulang semua bagian .shp, .shx, dan .dbf. Ini juga didokumentasikan di halaman driver GDAL shp http://www.gdal.org/drv_shapefile.html

Pengandar shapefile OGR mendukung penulisan ulang bentuk yang ada di dalam suatu shapefile serta menghapus bentuk. Bentuk yang dihapus ditandai untuk dihapus dalam file .dbf, dan kemudian diabaikan oleh OGR. Untuk benar-benar menghapusnya secara permanen (menghasilkan penggantian nomor FID) gunakan SQL 'REPACK' melalui metode sumber data ExecuteSQL ().

pengguna30184
sumber
1
Secara teknis, fitur "tandai sebagai terhapus" dari dBase tidak didukung oleh shapefile, sehingga GDAL menghasilkan shapefile yang korup ketika melakukannya.
Vince
Ada jawaban lama gis.stackexchange.com/questions/162615/… (yang ini mungkin merupakan duplikat) di mana saya menemukan bahwa MapObjects oleh ESRI memiliki metode delRecord (indeks) yang serupa yang tidak menghapus apa pun secara fisik. Mungkin program ESRI lebih berhati-hati menjalankan "paket" sebelum menutup shapefile tetapi rasanya mereka juga memiliki beberapa dukungan untuk "tandai sebagai terhapus".
user30184
Melakukan 'save as' pada layer akan menghapus fitur yang dihapus.
SpatialSuccess
Saya tidak punya pengalaman besar dalam QGIS dan python. Bagaimana Anda menjalankan SQL 'REPACK'?
EvanH
5

Anda harus memeriksa versi QGIS yang Anda lihat.

Saya tahu bahwa perilaku ini telah di-tweak dalam versi 2.14, sehingga setelah memanggil deleteFeatures, sebuah shapefile akan dibungkus ulang untuk menghapus baris yatim piatu yang tersisa.

Anda harus menguji ulang dengan versi 2.14 dan melihat apakah ada peningkatan.

ndawson
sumber
Terimakasih banyak atas jawaban Anda. Kedengarannya hebat bahwa itu di-tweak dalam versi 2.14. Saya menjalankan versi 2.12.2 dan saya tahu 2.12.3 siap untuk diunduh tetapi di mana saya dapat menemukan versi 2.14?
EvanH