PyQGISを使用して選択したフィーチャを削除しますか?


8

フィールドDNが 1つだけのシェープファイルがあります。フィールドの特定の値を持たないすべての機能を削除したいと思います。DNが1、2、または3であるとしましょう。

これまでのところ、フィーチャーの選択方法とフィーチャーの削除方法を見つけることができましたが、それらを組み合わせることに成功しませんでした。DN = 3の機能のみを残したいとします。

ここで見つかった機能の選択は、内部の内容を確認する方法がわからなかったため、想定どおりの動作をするかどうかはわかりません。

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

ここにある機能を削除

res = Ilayer.dataProvider().deleteFeatures()

私の知る限りでは、deleteFeatures()機能のIDが必要ですが、私はからからそれらを取得する方法は考えていないselectであるがQgsFeatureIterator

回答:


18

イテレータをループして、その.id()すべての機能のfor を取得できます。

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

または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()

ありがとうございました!FilterExpressionが間違っていることに気づきました(u '"DN" = 2 || "DN" = 1'ではなく、u '"DN"!= 3'を使用する必要があります)。他の視聴者を混乱させないように、このための回答を編集する場合は、どうぞ。
MasterPJ 2014

layer.dataProvider()。deleteFeatures(ids)ではありませんか?
mbernasocchi

dataProviderの()を使用することは可能ですが、私は変更が内部的に伝達されるので、この方法層の上に直接作業することを好む(属性テーブル、マップキャンバスに...)やその他の理由
Matthias Kuhn

2
layer.dataProvider()。deleteFeatures(ids)は、layer.deleteFeature(fid)が失敗したときにクラッシュをスローしました...不正なクラッシュ。セグメントフォールトを引き起こし、qgisを強制終了する種類。見つけるのに6時間かかる種類...ここに投稿された答えに固執してください。layer.dataProvider()。deleteFeatures(ids)はすべてコードに含まれているので、気が狂います。今では、すべてを修正する必要があります。
Mr Purple
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.