Menghapus fitur yang dipilih menggunakan PyQGIS?

8

Saya memiliki shapefile dengan hanya satu bidang DN . Saya ingin menghapus semua fitur yang tidak memiliki nilai spesifik bidang. Katakanlah DN bisa 1,2 atau 3.

Sejauh ini saya bisa mengetahui cara memilih Fitur dan cara menghapus fitur, tetapi saya tidak berhasil menggabungkannya. Katakanlah saya ingin hanya fitur dengan DN = 3 yang tersisa:

Pemilihan Fitur yang ditemukan di sini , bagaimanapun, saya tidak tahu apakah itu melakukan apa yang seharusnya dilakukan karena saya tidak menemukan cara bagaimana memeriksa apa yang ada di dalamnya.

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

hapus fitur yang ditemukan di sini

res = Ilayer.dataProvider().deleteFeatures()

Sejauh yang saya tahu, deleteFeatures()memerlukan ID fitur, tetapi saya tidak tahu bagaimana mendapatkannya dari selectmana QgsFeatureIterator.

MasterPJ
sumber

Jawaban:

19

Anda dapat mengulangi iterator dan mendapatkan .id()untuk setiap fitur di dalamnya:

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

Atau dengan 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()
Matthias Kuhn
sumber
Terima kasih, itu tadi! Saya hanya memperhatikan bahwa FilterExpression salah (bukan u '"DN" = 2 || "DN" = 1' tetapi u '"DN"! = 3' harus digunakan). Harap jika Anda akan mengedit jawaban Anda untuk ini agar tidak membingungkan pemirsa lain.
MasterPJ
bukan layer.dataProvider (). deleteFeatures (id)?
mbernasocchi
Menggunakan dataProvider () dimungkinkan tetapi saya lebih suka bekerja langsung pada layer karena cara ini perubahan dikomunikasikan secara internal (ke kanvas peta, tabel atribut ...) dan alasan lainnya .
Matthias Kuhn
2
layer.dataProvider (). deleteFeatures (ids) telah membuat crash bagi saya ketika layer.deleteFeature (fid) tidak ... Bad crash. Jenis yang menyebabkan kesalahan seg dan membunuh qgis. Jenis yang membutuhkan waktu 6 jam untuk menemukan ... tetap dengan jawaban yang diposting di sini. Bums me out karena layer.dataProvider (). DeleteFeatures (id) semuanya melalui kode saya dan sekarang saya harus memperbaiki semuanya.
Tn. Purple