Supprimer les entités sélectionnées à l'aide de PyQGIS?

8

J'ai un fichier de formes avec un seul DN de champ . Je voudrais supprimer toutes les fonctionnalités qui n'ont pas de valeur spécifique du champ. Disons que le DN peut être 1,2 ou 3.

Jusqu'à présent, j'ai pu découvrir comment sélectionner des fonctionnalités et comment supprimer des fonctionnalités, mais je n'ai pas réussi à les combiner. Disons que je veux que seules les fonctionnalités avec DN = 3 restent:

Sélection des fonctionnalités trouvées ici , cependant, je ne sais pas s'il fait ce qu'il est censé faire car je n'ai pas trouvé le moyen de vérifier ce qu'il y a à l'intérieur.

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

supprimer les fonctionnalités trouvées ici

res = Ilayer.dataProvider().deleteFeatures()

Pour autant que je sache, l' deleteFeatures()exige ID des fonctionnalités, mais je ne sais pas comment les obtenir à partir de ce selectqui est QgsFeatureIterator.

MasterPJ
la source

Réponses:

19

Vous pouvez faire une boucle sur l'itérateur et obtenir les fonctionnalités .id()de chaque fonctionnalité:

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

Ou avec 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
la source
Merci, c'était ça! Je viens de remarquer que le FilterExpression était faux (pas u '"DN" = 2 || "DN" = 1' mais u '"DN"! = 3' devrait être utilisé). Veuillez modifier votre réponse pour ne pas dérouter les autres téléspectateurs.
MasterPJ
n'est-ce pas layer.dataProvider (). deleteFeatures (ids)?
mbernasocchi
L'utilisation de dataProvider () est possible mais je préfère travailler directement sur la couche car de cette façon les modifications sont communiquées en interne (au canevas de carte, table attributaire ...) et pour d'autres raisons .
Matthias Kuhn
2
layer.dataProvider (). deleteFeatures (ids) a jeté des plantages pour moi lorsque layer.deleteFeature (fid) n'a pas ... Mauvais plantages. Le type qui cause une faute de segmentation et tue les qgis. Le genre qui prend 6 heures à trouver ... respectez la réponse affichée ici. Me dérange parce que layer.dataProvider (). DeleteFeatures (ids) est tout au long de mon code et maintenant je dois tout réparer.
Mr Purple