Ausgewählte Funktionen mit PyQGIS löschen?

8

Ich habe ein Shapefile mit nur einem Feld DN . Ich möchte alle Features löschen, die keinen bestimmten Wert für das Feld haben. Angenommen, der DN kann 1,2 oder 3 sein.

Bisher konnte ich herausfinden, wie Features ausgewählt und Features gelöscht werden, aber es gelang mir nicht, sie zu kombinieren. Angenommen, ich möchte, dass nur Funktionen mit DN = 3 erhalten bleiben:

Auswahl der hier gefundenen Funktionen Ich weiß jedoch nicht, ob es das tut, was es tun soll, da ich nicht herausgefunden habe, wie ich überprüfen kann, was sich darin befindet.

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

Hier gefundene Funktionen löschen

res = Ilayer.dataProvider().deleteFeatures()

Soweit ich weiß, deleteFeatures()erfordert das IDs der Features, aber ich habe keine Ahnung, wie ich sie von selectwelchen bekommen kann QgsFeatureIterator.

MasterPJ
quelle

Antworten:

18

Sie können den Iterator durchlaufen und .id()für jedes Feature darin Folgendes abrufen :

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

Oder mit 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
quelle
Danke, das war's! Ich habe gerade bemerkt, dass der FilterExpression falsch war (nicht u '"DN" = 2 || "DN" = 1', sondern u '"DN"! = 3' sollte verwendet werden). Bitte, wenn Sie Ihre Antwort darauf bearbeiten würden, um andere Zuschauer nicht zu verwirren.
MasterPJ
ist es nicht layer.dataProvider (). deleteFeatures (ids)?
Mbernasocchi
Die Verwendung von dataProvider () ist möglich, aber ich arbeite lieber direkt auf der Ebene, da auf diese Weise die Änderungen intern (auf der Kartenoberfläche, der Attributtabelle ...) und aus anderen Gründen kommuniziert werden .
Matthias Kuhn
2
layer.dataProvider (). deleteFeatures (ids) hat Abstürze für mich ausgelöst, wenn layer.deleteFeature (fid) nicht ... schlechte Abstürze. Die Art, die einen Seg-Fehler verursacht und QGIS tötet. Die Art, deren Suche 6 Stunden dauert ... bleiben Sie bei der hier veröffentlichten Antwort. Brennt mich raus, weil layer.dataProvider (). DeleteFeatures (ids) meinen gesamten Code durchläuft und ich jetzt alles reparieren muss.
Mr Purple