Làm cách nào để giảm kích thước của shapefiles khi các tính năng bị xóa?


9

Kịch bản nhỏ bé này xóa tất cả các tính năng nhỏ trong tất cả các lớp. Điều này hoạt động tốt nhưng kích thước của tệp .shp không giảm. Hãy cho tôi biết tại sao ...

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

Câu trả lời:


14

Bởi vì cách nhanh nhất để xóa các tính năng khỏi shapefiles là đánh dấu các bản ghi bằng cờ "đã xóa" trong phần .dbf mà không cần viết lại tất cả các phần .shp, .shx và .dbf. Điều này cũng được ghi lại trong trang trình điều khiển shp GDAL http://www.gdal.org/drv_shapefile.html

Trình điều khiển shapefile OGR hỗ trợ viết lại các hình dạng hiện có trong một shapefile cũng như xóa các hình dạng. Các hình đã xóa được đánh dấu để xóa trong tệp .dbf và sau đó bị OGR bỏ qua. Để thực sự loại bỏ chúng vĩnh viễn (dẫn đến việc đánh số lại FID), hãy gọi SQL 'REPACK' thông qua phương thức nguồn dữ liệu ExecuteQuery ().


1
Về mặt kỹ thuật, tính năng "đánh dấu là đã xóa" của dBase không được hỗ trợ bởi các shapefile, do đó GDAL đang tạo ra các shapefile bị hỏng khi thực hiện điều này.
Vince

Có một câu trả lời cũ gis.stackexchange.com/questions/162615/ ((cái này có lẽ là một bản sao) trong đó tôi thấy rằng MapObjects của ESRI có phương thức delRecord (index) tương tự không loại bỏ bất cứ thứ gì về mặt vật lý. Có lẽ các chương trình ESRI chăm sóc tốt hơn cho việc chạy "pack" trước khi đóng shapefiles nhưng có vẻ như chúng cũng có một số hỗ trợ cho "đánh dấu là đã xóa".
dùng49584

Thực hiện 'lưu dưới dạng' trên lớp sẽ xóa các tính năng đã xóa.
SpatialSuccess

Tôi không có kinh nghiệm lớn về QGIS và python. Làm thế nào để bạn gọi SQL 'REPACK'?
EvanH

5

Bạn nên kiểm tra phiên bản của QGIS mà bạn đang thấy điều này.

Tôi biết rằng hành vi này đã được điều chỉnh trong phiên bản 2.14, do đó, sau khi gọi xóaFeatures, một shapefile sẽ được đóng gói lại để loại bỏ bất kỳ hàng mồ côi còn sót lại nào.

Bạn nên kiểm tra lại với phiên bản 2.14 và xem có cải thiện gì không.


Cảm ơn bạn rất nhiều vì câu trả lời của bạn. Nghe có vẻ tuyệt vời khi nó đã được điều chỉnh trong phiên bản 2.14. Tôi đang chạy phiên bản 2.12.2 và tôi biết rằng 2.12.3 đã sẵn sàng để tải xuống nhưng tôi có thể tìm phiên bản 2.14 ở đâu?
EvanH
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.