Couches virtuelles

Un type particulier de couche vecteur vous permet de définir une couche résultant d’une requête complexe en utilisant le langage SQL sur une ou plusieurs couches vectorielles que QGIS est capable de charger. Ce type de couches est appelé couches virtuelles : elles correspondent à des vues sur d’autres couches et ne stockent donc pas de donnée.

Créer une couche virtuelle

Ouvrez la fenêtre de création de couche virtuelle en cliquant sur Ajouter/Editer une couche virtuelle... depuis le menu Couche ou la barre d’outils correspondante.

La fenêtre vous permet de spécifier une requête SQL. La requête peut faire appel aux noms (ou identifiants, id) de couches vectorielles existantes ainsi qu’aux noms de champs de ces couches.

Par exemple, si vous avez une couche nommée regions, vous pouvez créer une nouvelle couche virtuelle avec cette requête SQL : SELECT * FROM regions WHERE id < 100. La requête SQL sera exécutée quel que soit le fournisseur de la couche regions et même si ce fournisseur ne gère pas les requêtes SQL.

Des jointures et des requêtes complexes peuvent être crées en utilisant directement les noms des couches à joindre.

Langage supporté

Le moteur sous-jacent utilise SQLite et Spatialite pour fonctionner.

Cela signifie que vous pouvez utiliser tous les ordres SQL que comprend votre installation locale de SQLite.

Les fonctions de SQLite et les fonctions spatiales de Spatialite peuvent également être utilisées dans une requête de couche virtuelle. Par exemple, créer une couche de points à partir d’une couche purement attributaires, peut être effectuée avec une requête ressemblant à: SELECT id, MakePoint (x, y, 4326) as geometry FROM coordonnées

Les fonctions des expressions de QGIS peuvent aussi être utilisées dans une requête de couche virtuelle.

Pour référencer la colonne géométrique d’une couche, utilisez le nom geometry.

Contrairement à une requête SQL pure, tous les champs d’une requête de couche virtuelle doivent être nommés. N’oubliez pas d’utiliser le mot-clé as pour nommer vos colonnes si elles sont le résultat d’un calcul ou d’une fonction.

Problèmes de performance

Avec les paramètres définis par défaut, le moteur de couche virtuelle fera de son mieux pour détecter le type des différentes colonnes de la requête, y compris le type de la colonne de géométrie si elle est présente.

Ceci est réalisé par examen de la requête lorsque cela est possible ou en récupérant la première ligne de la requête (LIMIT 1) en dernier recours. Obtenir la première ligne du résultat juste pour créer la couche peut être indésirable pour des raisons de performance.

Le dialogue de création permet de spécifier différents paramètres:

  • colonne avec des valeurs uniques: cette option permet de spécifier quel champ de la requête représente des valeurs entières uniques que QGIS peut utiliser comme identifiants de ligne. Par défaut, une valeur entière auto-incrémentée est utilisée. La spécification d’une colonne avec des valeurs uniques permet d’accélérer la sélection des lignes par id.

  • pas de géométrie: cette option oblige la couche virtuelle à ignorer tout champ géométrique. La couche résultante est une couche uniquement d’attributs.

  • colonne géométrique: cette option permet de spécifier le nom de la colonne à utiliser comme géométrie de la couche.

  • Type: cette option permet de spécifier le type de la géométrie de la couche virtuelle.

  • SCR: cette option permet de spécifier le système de coordonnées de référence de la couche virtuelle.

Commentaires spéciaux

Le moteur de couche virtuelle essaie de déterminer le type de chaque champ de la requête. S’il n’y arrive pas, la première ligne de la requête est récupérée pour déterminer les types des champs.

Le type d’un champ particulier peut être spécifié directement dans la requête en utilisant des commentaires spéciaux.

La syntaxe est la suivante : /*:type*/. Il doit être placé juste après le nom du champ. type peut correspondre soit à int pour des entiers, real pour des nombres réels ou text pour du texte.

Par exemple : SELECT id+1 as nid /*:int*/ FROM table

Le type et le système de coordonnées d’un champ géométrie peuvent également être précisés grâce au commentaires spéciaux suivants : /*:gtype:srid*/gtype est le type de géométrie (point, linestring, polygon, multipoint, multilinestring ou multipolygon) et srid, un entier correspondant au code EPSG du système de coordonnées.

Utilisation des index

Lorsque vous utilisez une couche dans une couche virtuelle, les index de cette couche source seront utilisés de la manière suivante:

  • Si un prédicat = est utilisé sur la colonne de la clé primaire de la couche, le fournisseur de données sous-jacent sera interrogé avec un id particulier (FilterFid)

  • Pour tous les autres prédicats (>, <=, !=, etc.) ou sur une colonne sans clé primaire, une demande construite à partir d’une expression sera utilisée pour interroger le fournisseur de données vectoriel sous-jacent. Cela signifie que les index peuvent être utilisés sur les fournisseurs de base de données s’ils existent.

Une syntaxe spécifique existe pour gérer les prédicats spatiaux et déclencher l’utilisation d’un index spatial: une colonne cachée nommée _search_frame_ existe pour chaque couche virtuelle. Cette colonne peut être comparée pour l’égalité à un rectangle d’encombrement. Exemple: select * from vtab where _search_frame_=BuildMbr(-2.10,49.38, -1.3,49.99,4326)

Les prédicats spatiaux comme ST_Intersects sont considérablement accélérés lorsqu’ils sont utilisés conjointement avec cette syntaxe d’index spatial.