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 :

💡 Différence entre traitements d’extraction et de 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” :
filtres-requetes-01.png

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

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 :
filtres-requetes-03.png

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" > 20

Comparer 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 NULL

Comparer à 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” : filtres-requetes-04.png

La fenêtre de configuration d’une couche virtuelle se présente de la manière suivante : filtres-requetes-05.png

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”. filtres-requetes-06.png

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 : filtres-requetes-10.png

  • Sélectionner des entités par valeur…
  • Sélectionner des entités à l’aide d’une expression…

Sélectionner des entités par valeur…

filtres-requetes-11.png

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 ET logiques (il n’est pas possible de combiner des conditions avec des OU logiques).
  • chaque condition peut prendre l’une des valeurs suivantes : filtres-requetes-12.png

💡 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 : filtres-requetes-17.png

filtres-requetes-14.png 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 NULL

Recherche de valeurs numériques :

"WD2" > 10

Recherche selon plusieurs conditions :

"WD2" > 10 AND "FCO" = 5

Recherche d’une chaîne de caractères dans un attribut :

strpos( "ZI005_FNA", 'Route') > 0

ou

strpos( lower("ZI005_FNA"), 'route') > 0

Recherche d’objets linéaires par rapport à leur longueur : [longueur supérieure à 200 mètres]

$length > 200

Recherche d’objets surfaciques par rapport à leur superficie : [superficie supérieure à 10000 mètres carrés]

$area > 10000

Recherche d’objets par rapport à une caractéristique de leur géométrie : [nombre de trous supérieur à 1]

num_interior_rings($geometry) > 1

Traitements (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 : filtres-requetes-07.png

La condition est exprimée à l’aide de trois paramètres :

  1. L’attribut de la couche de données à évaluer ;
  2. L’opérateur de comparaison à appliquer : filtres-requetes-08.png
  3. 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. filtres-requetes-09.png

💡 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 : filtres-requetes-13.png

Les possibilités offertes par ce traitement sont bien plus importantes mais nécessitent une certaine maîtrise des expressions.