Xóa các tính năng được chọn bằng PyQGIS?


8

Tôi có một shapefile chỉ với một lĩnh vực DN . Tôi muốn xóa tất cả các tính năng không có giá trị cụ thể của trường. Giả sử DN có thể là 1,2 hoặc 3.

Cho đến nay tôi đã có thể tìm hiểu cách chọn Tính năng và cách xóa tính năng, nhưng tôi đã không thành công khi kết hợp chúng. Giả sử tôi chỉ muốn các tính năng có DN = 3:

Tuy nhiên, lựa chọn các Tính năng được tìm thấy ở đây , tuy nhiên, tôi không biết liệu nó có phải làm gì không vì tôi không tìm thấy cách kiểm tra những gì bên trong.

select = layer.getFeatures(QgsFeatureRequest().setFilterExpression(u'"DN"!=3'))

xóa các tính năng được tìm thấy ở đây

res = Ilayer.dataProvider().deleteFeatures()

Theo như tôi biết, deleteFeatures()yêu cầu ID của các tính năng, nhưng tôi không biết làm thế nào để lấy chúng từ selectđó QgsFeatureIterator.

Câu trả lời:


18

Bạn có thể lặp qua iterator và nhận được .id()mọi tính năng trong đó:

with edit(layer):
    # build a request to filter the features based on an attribute
    request = QgsFeatureRequest().setFilterExpression('"DN" != 3')

    # we don't need attributes or geometry, skip them to minimize overhead.
    # these lines are not strictly required but improve performance
    request.setSubsetOfAttributes([])
    request.setFlags(QgsFeatureRequest.NoGeometry)

    # loop over the features and delete
    for f in layer.getFeatures(request):
        layer.deleteFeature(f.id())

Hoặc với QGIS <2.12

request = QgsFeatureRequest().setFilterExpression('"DN" != 3')
request.setSubsetOfAttributes([])
request.setFlags(QgsFeatureRequest.NoGeometry)
ids = [f.id() for f in layer.getFeatures(request)]
layer.startEditing()
for fid in ids:
    layer.deleteFeature(fid)
layer.commitChanges()

Cảm ơn bạn, đó là điều đó! Tôi chỉ nhận thấy rằng FilterExpression đã sai (không phải u '"DN" = 2 || "DN" = 1' nhưng nên sử dụng u '"DN"! = 3'). Xin vui lòng nếu bạn sẽ chỉnh sửa câu trả lời của bạn để điều này không gây nhầm lẫn cho người xem khác.
MasterPJ

không phải là layer.dataProvider (). removeFeatures (ids)?
mbernasocchi

Có thể sử dụng dataProvider () nhưng tôi thích làm việc trực tiếp trên lớp hơn vì cách này các thay đổi được truyền đạt nội bộ (tới khung bản đồ, bảng thuộc tính ...) và các lý do khác .
Matthias Kuhn

2
layer.dataProvider (). removeFeatures (ids) đã gây ra sự cố cho tôi khi layer.deleteFeature (fid) không ... Sự cố xấu. Loại gây ra lỗi seg và giết qgis. Loại mất 6 giờ để tìm ... gắn bó với câu trả lời được đăng ở đây. Đánh bại tôi vì layer.dataProvider (). XóaFeatures (id) là tất cả thông qua mã của tôi và bây giờ tôi phải sửa tất cả.
Mr Purple
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.