Dans QGIS, de nombreuses actions ne doivent s’appliquer qu’à une partie des données : une sélection d’entités précise, choisie par l’utilisateur.
Dans cet article, nous allons voir comment un plugin QGIS peut détecter, contrôler et traiter uniquement les entités sélectionnées, sans risquer de modifier l’ensemble de la couche.
L’objectif est double : sécuriser les traitements et respecter l’intention de l’utilisateur, même avec un code simple et accessible aux débutants.
Modifier une couche QGIS peut sembler risqué, surtout pour les débutants en développement de plugins. Ce guide : Modifier une couche QGIS sans la mettre en danger explique de manière simple et progressive comment utiliser le mode édition, valider ou annuler des modifications, et appliquer des changements en toute sécurité sur vos couches et attributs. Apprenez à protéger vos données tout en rendant votre plugin réellement utile.
Pourquoi travailler uniquement sur la sélection ?
Dans QGIS, l’utilisateur sélectionne rarement des entités par hasard.
Une sélection exprime presque toujours une intention précise : « je veux agir sur ces objets-là, et pas les autres ».
Un plugin qui ignore cette sélection et traite toute la couche :
- peut produire des erreurs graves,
- casse la confiance,
- devient dangereux à utiliser.
Par défaut, un plugin bien conçu doit respecter la sélection active.
Comment QGIS gère une sélection d’entités
Dans QGIS :
- la sélection appartient à la couche
- elle est volatile (elle change à chaque action utilisateur)
- elle est accessible directement depuis l’API PyQGIS
Une couche vectorielle sait à tout moment :
- combien d’entités sont sélectionnées
- lesquelles elles sont
Récupérer la couche active
Dans un plugin, on commence presque toujours par récupérer la couche active :
layer = iface.activeLayer()
Première règle de sécurité :
if not layer:
return
Pas de couche active = pas d’action.
Vérifier qu’il y a une sélection
Avant tout traitement, il faut vérifier que l’utilisateur a bien sélectionné quelque chose :
selected_features = layer.selectedFeatures()
if not selected_features:
# aucune entité sélectionnée
return
À ce stade, le plugin sait déjà :
- s’il doit continuer
- ou s’il doit s’arrêter proprement
Travailler sur les entités sélectionnées
selectedFeatures() retourne une liste d’objets QgsFeature.
Vous pouvez donc les parcourir simplement :
for feature in selected_features:
# traitement sur chaque entité
Chaque feature contient :
- ses attributs
- sa géométrie
- son identifiant unique
Exemple simple : lire un attribut
for feature in selected_features:
valeur = feature["population"]
Si le champ n’existe pas, une erreur se produira :
d’où l’importance de vérifier la structure de la couche (voir article précédent).
Modifier des attributs (avec précaution)
Modifier une entité sélectionnée nécessite que la couche soit en mode édition.
if not layer.isEditable():
layer.startEditing()
Puis :
for feature in selected_features:
feature["statut"] = "traité"
layer.updateFeature(feature)
Enfin :
layer.commitChanges()
Un plugin ne doit jamais forcer silencieusement des modifications.
Dans la suite de la série, on verra comment demander confirmation à l’utilisateur.
Sélection active ≠ filtre ≠ couche temporaire
Dans QGIS, plusieurs mécanismes permettent de travailler sur un sous-ensemble de données.
Ils se ressemblent visuellement, mais n’ont pas du tout le même comportement, surtout dans un plugin.
🔹 Sélection active
- Appartient à la couche
- Visible par surlignage
- Accessible via
selectedFeatures()- Volatile : change à chaque action utilisateur
C’est le mécanisme le plus sûr et le plus explicite pour un plugin.
🔹 Filtre (requête de couche)
- Cache les entités non conformes
- La couche semble ne contenir que certaines entités
- Le plugin voit toujours la couche entière, sauf précaution spécifique
Un plugin mal écrit peut modifier des entités invisibles.
🔹 Couche temporaire
- Résultat d’un traitement ou d’une extraction
- Indépendante de la couche d’origine
- Peut disparaître à la fermeture du projet
Utile pour tester ou visualiser, pas toujours pour modifier les données sources.
À retenir
- Sélection = intention explicite de l’utilisateur
- Filtre = vue partielle
- Couche temporaire = copie de travail
Dans un plugin métier, la sélection active est presque toujours le meilleur point d’entrée
Et si aucune entité n’est sélectionnée ?
Deux options intéressantes :
Option 1 – Bloquer l’action
« Veuillez sélectionner au moins une entité »
C’est la plus sûre.
Option 2 – Proposer une alternative
« Aucune entité sélectionnée. Voulez-vous appliquer l’action à toute la couche ? »
Toujours laisser le choix à l’utilisateur.
Cas d’usage typiques dans un plugin
Travailler uniquement sur la sélection est indispensable pour :
- recalculer un attribut sur un sous-ensemble
- corriger des géométries ciblées
- appliquer une logique métier locale
- préparer des données avant export
- valider des objets précis
En pratique, 90 % des plugins métiers devraient fonctionner ainsi.
À retenir
- Une sélection = une intention utilisateur
- Un plugin doit la respecter par défaut
- Le code nécessaire est simple et lisible
- La sécurité vient plus de la logique que de la complexité