Suite

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


J'ai un shapefile avec un seul champ DN. 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 une fonctionnalité, 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, ledeleteFeatures()nécessite des identifiants des fonctionnalités, mais je n'ai aucune idée de comment les obtenir à partir desélectionnerlequel estQgsFeatureIterator.


Vous pouvez parcourir l'itérateur et obtenir le.identifiant()pour chaque fonctionnalité qu'il contient :

with edit(layer): # créer une requête pour filtrer les entités en fonction d'une requête d'attribut = QgsFeatureRequest().setFilterExpression('"DN" != 3') # nous n'avons pas besoin d'attributs ou de géométrie, ignorez-les pour minimiser la surcharge . # ces lignes ne sont pas strictement requises mais améliorent les performances ))

Ou avec QGIS < 2.12

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

Implémentation de l'action Ajouter une fonctionnalité à l'aide de PyQGIS

J'essaie d'implémenter / réutiliser la fonctionnalité Ajouter une fonctionnalité dans mon plugin python. existe-t-il une classe/fonction qui gère la création de la géométrie sur le canevas en fonction de la définition de la géométrie de la couche ? Je vérifie l'API mais je ne trouve pas de fonction qui vous permette de numériser la géométrie et de la transmettre en tant que fonctionnalité à la couche – ou quelque chose de similaire.

J'ai réussi à mettre la couche en mode édition maintenant, je ne peux pas trouver un moyen de l'implémenter.

Donc en gros —> avec l'API PyQGIS.

3 réponses

Une solution complète avec également la sauvegarde de la couche, comme demandé dans un commentaire :

Répondu il y a 4 mois par Marioba avec 5 votes positifs

J'ai passé un certain temps à essayer de comprendre cela aussi.

Le bouton se trouve dans la classe QgisInterface.

Ajoutez ensuite les entités que vous souhaitez ajouter à la couche.

Répondu il y a 4 mois par Nicolas avec 7 votes positifs

Voici un moyen d'ajouter une nouvelle entité à un vecteur polygone :

Avec mes commentaires, je pense que cela devrait être assez explicite.

Dans ce cas, vous n'auriez même pas besoin de démarrer une session d'édition et vous écririez cette fonctionnalité directement dans le fichier, ce qui pourrait ne pas être exactement ce que vous essayez d'implémenter.

Quoi qu'il en soit, ce qui manque maintenant, c'est que les points qui sont ajoutés à cette liste ne sont pas codés en dur mais proviennent en fait de l'utilisateur. Vous devrez donc combiner tout cela avec un événement de clic qui obtient les coordonnées au clic et les ajoute à la liste. Comme tout cela se fait via un plugin, je vous suggère également d'ajouter un bouton qui vous permet de démarrer l'édition (c'est-à-dire de définir de nouveaux points) et de l'arrêter (donc un bouton qui permet de basculer, comme le bouton typique "Ajouter une fonctionnalité", mais vous pouvez également ajouter deux boutons séparés). La fonctionnalité du bouton viendrait, bien sûr, de PyQt, puis référence à vos fonctions PyQGIS. Vous pouvez également ajouter une ligne qui combine chaque point unique défini pour être utilisé comme sommet. Bien que facultatif, cela améliorerait considérablement l'expérience utilisateur.

Soit dit en passant, l'exemple ci-dessus créerait un polygone qui masquerait plus ou moins la Colombie :

PS : pour m'inspirer, j'ai regardé le PyQGIS Cookbook qui a été publié par Packt Pub il y a quelques jours.


Voir la vidéo: QGIS Field Calculator Basics (Octobre 2021).