Par attributs
Filtres et requêtes attributaires dans QGIS
QGIS propose plusieurs fonctions pour identifier des objets dont les attributs vérifient des conditions définies par l’utilisateur :
- le filtre applicable sur la source de données ;
- les couches virtuelles ;
- les outils de sélection :
- sélection par valeur,
- sélection par expression,
- les outils de traitement :
- “Extraction par attribut” et “Sélection par attribut”,
- “Extraction par expression” et “Sélectionner à l’aide d’une expression”,
- “Séparer une couche vecteur”.
💡 Différence entre traitements d’extraction et de sélection :
- Sélection : le traitement modifie la sélection des objets ;
- Extraction : le traitement crée une nouvelle couche avec les entités vérifiant la requête (et optionnellement crée une nouvelle couche avec les autres entités) sans altérer la sélection.
Filtre
Appliquer un filtre sur une couche se fait dans la fenêtre “Propriétés de la couche”, dans la partie “Filtre d’entité du fournisseur de données” :

💡 Vous pouvez directement accéder au filtre en faisant un clic-droit sur la couche et en sélectionnant le menu “Filtrer…” :

Pour rédiger un filtre cliquez sur le bouton “Constructeur de requête”.
💡 Si un filtre est déjaà actif sur une couche, un entonoir s’affiche sur la droite de son nom. Cliquez sur cet entonoir pour ouvrir l’éditeur de requête pour ce filtre :

Dans QGIS vous pouvez aussi bien appliquer un filtre sur des bases de données SQL que sur des fichiers de données vecteur.
Syntaxe
Syntaxe très proche du contenu d’une clause WHERE du langage SQL :
- Juste un filtre
- Pas d’aggrégation de données
- Pas de transformation des données
Quelques supports pour se familiariser avec cette syntaxe :
Guillemets
⚠️ Noms des champs entre guillemets doubles : "nom_du_champ"
⚠️ Chaînes de caractères entre guillemets simples : 'Exemple de chaîne de caractères'
Comparer une valeur numérique
"WD2" > 20Comparer des chaînes de caractères
"ZI005_FNA" LIKE 'Route%'
"ZI005_FNA" ILIKE 'route%'
"ZI005_FNA" LIKE 'Q 12_'LIKE : prise en compte de la casse
ILIKE : sans prise en compte de la casse
% : n’importe quelle chaîne de caractères (même vide)
_ : un seul caractère
Tester une valeur NULL
"ZI005_FNA" IS NOT NULLComparer à une liste de valeurs
"RTN_ROI" IN (3, 4)Combiner des conditions
Il est possible de combiner des conditions sur un même champ ou plusieurs champs à l’aide des éléments suivants :
- parenthèses
(): pour regrouper des conditions logiques - opérateur
OR: ou logique - opérateur
AND: et logique - opérateur
NOT: pour appliquer une négation à une condition
Exemple :
("ZI005_FNA" LIKE 'Route%' OR "ZI005_FNA" LIKE 'Q 12_')
AND "RTN_ROI" NOT IN (3, 4)Couche virtuelle
Une couche virtuelle est une couche créée à la volée à partir des données d’une autre couches (voire de plusieurs autres couches) à l’aide d’une instruction SQL. Pour créer une telle couche passez par le menu “Couche - Créer une couche - Nouvelle couche virtuelle” : 
La fenêtre de configuration d’une couche virtuelle se présente de la manière suivante : 
Principaux éléments de cette fenêtre :
- Couches intégrées : identification des couches de source qui sont utilisées pour construire la couche virtuelle. Pour y ajouter une couche, utilisez le bouton “Importer” ;
- Requête : la requête SQL exécutée sur les couches de données source pour produire le contenu de la couche virtuelle ;
- Géométrie : zone dédiée à la configuration des informations liées à la géométrie des enregistrements de la couche virtuelle.
Syntaxe de la requête
La syntaxe de ces requêtes est celle des requêtes de sélection classiques écrites en SQL. Voici la forme la plus simple de ces requête :
SELECT <noms des champs>
FROM <liste des tables>
WHERE <conditions>;Quelques ressources pour se familiariser avec cette syntaxe :
Nom des tables
⚠️ La clause FROM de ces requêtes doit contenir une liste de noms de tables séparés par des virgules. Dans le cas présent, le nom de chaque table doit correspondre à l’un des noms présents dans la colonne “Nom local” du tableau “Couches intégrées”. 
Nom des champs
Au niveau de la clause SELECT, les noms des champs doivent prendre la forme suivante : nom_de_la_table.nom_du_champ
On peut utiliser le signe * pour désigner tous les champs de la table :
SELECT *
FROM ROAD_C
WHERE "TYP" = 1;Usages
Les couches virtuelles offrent de très nombreuses possibilités car on peut y croiser des données issues de plusieurs couches et y intégrer des calculs relativement complexes à l’aide de fonctions alphanumériques, de fonctions statistiques ou d’analyse spatiale.
Quelques exemples d’usages possibles :
- Filtrer les données
- Créer des champs calculés
- Croiser des tables
- Réaliser des calculs sur les géométries :
- Intersections
- Distances
- Zones tampon
…
- Calculer des statistiques par agrégation
Exemples plus avancés
Création d’un champ calculé
SELECT *, length(geometry)
FROM ROAD_C
WHERE length(geometry) > 0.005;⚠️ Cet exemple est intéressant mais il est sans doute plus simple de réaliser cela avec les fonctions natives de QGIS (calculteur de champ).
Transformation de géométrie : buffer
Création d’une zone tampon autour de la géométrie d’origine d’une couche de points :
SELECT points_test.id, points_test.distance,
ST_BUFFER(geometry, distance, 16) AS geom2
FROM points_test;Statistiques
Calcul de la longueur totale des tronçons de route pour chaque nom de route :
SELECT ZI005_FNA, SUM(LZN)
FROM ROAD_C
WHERE ZI005_FNA IS NOT NULL
GROUP BY ZI005_FNA;Performances
⚠️ Les couches virtuelles peuvent être très lentes lorsque l’on croise des tables volumineuses entre elles. Il ne faut pas oublier que les couches virtuelles sont calculées à la volée. Le résultat des calculs n’est pas sauvegardé en base ni dans des fichiers. Elles consomment donc beaucoup de puissance de calcul.
Pour en savoir plus
Documentation de QGIS sur les couches virtuelles
💡 QGIS utilise SpatiaIte comme moteur des requêtes SQL utilisé par les couches virtuelles. Les fonctions supportées par SpatiaLite sont donc utilisables dans le cœur des requêtes de vos couches virtuelles. Les fonctions length et ST_BUFFER sont des fonctions incluses dans SpatiaLite. Liste des fonctions de SpatiaLite utilisables
Outils de sélection
Deux outils de la barre d’outils de sélection permettent de réaliser des recherches alphanumériques : 
- Sélectionner des entités par valeur…
- Sélectionner des entités à l’aide d’une expression…
Sélectionner des entités par valeur…

Cet outil permet de définir une recherche comme une série de conditions :
- chaque condition porte sur un des attributs de la couche ;
- les conditions sont combinées les unes aux autres par des
ETlogiques (il n’est pas possible de combiner des conditions avec desOUlogiques). - chaque condition peut prendre l’une des valeurs suivantes :

💡 Il n’est pas possible de définir plusieurs conditions sur un même attribut avec cet outil. Il n’est pas non plus possible de définir une condition portant sur un ensemble de valeurs (contrairement à ce que l’on peut faire avec l’instruction IN en SQL). Si vous avez besoin de ce type de conditions vous devrez enchaîner plusieurs recherche réalisées à l’aide de cet outil ou utiliser un autre outil plus polyvalent (couche virtuelle, sélection par expression, modeleur graphique de traitements…).
💡 Pour les attributs de type chaîne de caractères, une case à cocher “Case sensitive” est présente. Lorsqu’elle est cochée, les comparaisons de chaînes de caractères ne prennent pas en compte les différences de casse (majuscules, minuscules).
Sélectionner des entités à l’aide d’une expression…
L’outil de sélection par expression est à la fois disponible dans la barre d’outils de sélection et dans le menu situé tout en bas de la table attributaire : 
Les possibilités offertes par cet outil sont bien plus importantes mais nécessitent une certaine maîtrise des expressions.
Quelques éléments de syntaxe
- les noms des attributs doivent être entourés de guillemets doubles :
"WD2" - les chaînes de caractères doivent être entourées de guillemets simples :
'Route' - les noms de fonctions et autres mots-clefs du langage ne sont pas sensibles à la casse (pas besoin de faire attention aux minuscules et majuscules). Par contre, vous devez faire attention aux minuscules et majuscules lorsque vous écrivez une expression qui compare des chaînes de caractères
Quelques exemples
Recherche de l’absence de valeur (NULL) :
"ZI005_FNA" IS NULLRecherche de valeurs numériques :
"WD2" > 10Recherche selon plusieurs conditions :
"WD2" > 10 AND "FCO" = 5Recherche d’une chaîne de caractères dans un attribut :
strpos( "ZI005_FNA", 'Route') > 0ou
strpos( lower("ZI005_FNA"), 'route') > 0Recherche d’objets linéaires par rapport à leur longueur : [longueur supérieure à 200 mètres]
$length > 200Recherche d’objets surfaciques par rapport à leur superficie : [superficie supérieure à 10000 mètres carrés]
$area > 10000Recherche d’objets par rapport à une caractéristique de leur géométrie : [nombre de trous supérieur à 1]
num_interior_rings($geometry) > 1Traitements (Boîte à outils de traitements)
Traitement Sélection par attribut
Le traitement “Sélection par attribut” permet de rechercher les objets d’une couche qui vérifient une unique condition sur un de leurs attributs : 
La condition est exprimée à l’aide de trois paramètres :
- L’attribut de la couche de données à évaluer ;
- L’opérateur de comparaison à appliquer :

- La valeur par rapport à laquelle la comparaison sera réalisée. Ce paramètre ne peut pas être configuré lorsque l’opérateur de comparaison prend l’une des deux valeurs suivantes :
est null,n'est pas null.
💡 Les possibilités de ce traitement sont relativement limitées car il n’autorise pas la combinaison de plusieurs conditions par l’emploi des opérateurs logique ET et OU. Si vous avez besoin de ces combinaisons de conditions vous devez passer par d’autres méthodes vues dans ce cours ou alors enchaîner plusieurs traitements de type “Sélection par attribut” (possiblement via le modeleur graphique de traitements de QGIS).
Le résultat de la recherche réalisée via le traitement “Sélection par attribut” est utilisé pour modifier la liste des objets présents dans la sélection de QGIS. Le traitement offre les options suivantes :
- Créer une nouvelle sélection : la sélection de QGIS est remplacée par le résultat de la recherche ;
- Ajouter à la sélection courante : le résultat de la recherche est ajouté à la sélection de QGIS. Les objets précédemment sélectionnés restent donc sélectionnés. Viennent s’y ajouter d’autres objets. La nouvelle sélection est l’union de la précédente sélection et du résultat de la recherche ;
- Enlever de la sélection courante : les objets trouvés par la recherche sont retirés de la sélection de QGIS. Si un objet présent dans la sélection est trouvé par la recherche, il est alors retiré de la sélection. Les objets qui ne sont pas trouvés par la recherche sont laissés dans la sélection ;
- Sélectionenr parmi la sélection : les objets de la sélection qui ne sont pas trouvés par la recherche sont retirés de la sélection. Les objets trouvés par la recherche sont conservés dans la sélection que s’ils y étaient déjà avant la recherche. La nouvelle sélection est l’intersection de la précédente sélection et du résultat de la recherche.

💡 Si vous avez besoin de créer une autre couche de données (couche de données temporaire par exemple) vous pouvez utiliser le traitement “Extraction par attribut”.
Traitement Sélection à l’aide d’une expression
Le traitement “Sélection à l’aide d’une expression” permet de rechercher les objets d’une couche qui vérifient une expression QGIS : 
Les possibilités offertes par ce traitement sont bien plus importantes mais nécessitent une certaine maîtrise des expressions.