Travailler avec la table d’attributs

La table d’attributs affiche des informations sur les entités d’un calque sélectionné. Chaque ligne du tableau représente une entité (avec ou sans géométrie) et chaque colonne contient une information particulière sur cette entité. Les entités du tableau peuvent être recherchées, sélectionnées, déplacées ou même modifiées.

Avant-propos : Tables spatiale et non spatiale

QGIS vous permet de charger des couches spatiales et non spatiales. Ceci inclut actuellement les tables supportées par OGR et les fichiers de texte délimité, ainsi que les fournisseurs PostgreSQL, MSSQL, SpatiaLite, DB2 et Oracle. Toutes les couches chargées sont listées dans le panneau Couches. Le fait qu’une couche soit spatiale ou non détermine si vous pouvez interagir avec elle sur la carte.

Les tables non spatiales peuvent être parcourues et modifiées à l’aide de la vue de la table d’attributs. De plus, elles peuvent être utilisées pour des requêtes sur les champs. Par exemple, vous pouvez utiliser les colonnes d’une table non spatiale pour définir des valeurs d’attributs, ou une plage de valeurs qui peut être ajoutées à une couche vectorielle spécifique pendant la numérisation. Regardez le widget d’édition dans la section Attributes Form Properties pour en savoir plus.

Présentation de l’interface de la table d’attributs

Pour ouvrir la table attributaire d’une couche vectoriel, activez la couche en cliquant dessus depuis la Le panneau Couches. Puis dans le menu Couche, cliquez sur openTable Ouvrir la table d’attributs. Vous pouvez aussi y accéder avec un clic droit sur la couche puis en sélectionnant openTable Ouvrir la table d’attributs ou en cliquant sur le bouton openTable Ouvrir la table d’attributs dans la barre d’outils des Attributs. Si vous préférez les raccourcis, F6 ouvrira la table d’attributs. Shift+F6 ouvrira la table d’attributs filtrée vers les entités sélectionnées et Ctrl+F6 ouvrira la table d’attributs filtrée vers les entités visibles.

Cela ouvrira une nouvelle fenêtre qui affiche les attributs de toutes les entités de la couche (voir figure_attributes_table). Selon le paramétrage effectué dans le menu Préférences ‣ Options ‣ Sources de données , la fenêtre s’ouvrira en mode ancré ou pas. Le nombre total des entités et le nombre d’entités sélectionnées ou filtrés sont affichés dans la barre de titre de la table d’attributs. De même, si un filtrage spatial est appliqué à la table, cette information y figure.

../../../_images/vectorAttributeTable.png

Table d’attributs de la couche “regions”

Les boutons situés au-dessus de la table d’attributs apportent les fonctionnalités suivantes :

Icône Étiquette Fonction Raccourci par Défaut
toggleEditing Basculer en mode édition Activer les fonctions d’édition Ctrl+E
multiEdit Basculer en mode édition multiple Mettre à jour plusieurs champs de plusieurs entités  
saveEdits Enregistrer les modifications Enregistrer les modifications en cours Ctrl+S
draw Recharger la table    
newTableRow Ajouter une entité Ajouter une entité non géométrique  
deleteSelected Supprimer les entités sélectionnées Supprimer les entités sélectionnées de la couche  
editCut Couper les entités sélectionnées dans le presse-papiers   Ctrl+X
copySelected Copier les entités sélectionnées dans le presse-papiers   Ctrl+C
editPaste Coller les entités à partir du presse-papier Insérer de nouvelles entités à partir de celles qui ont été copiées Ctrl+V
expressionSelect Sélectionner les entités en utilisant une expression    
selectAll Tout sélectionner Sélectionner toutes les entités de la couche Ctrl+A
invertSelection Inverser la sélection Inverser la sélection en cours dans la couche Ctrl+R
deselectAll Tout désélectionner Désélectionner toutes les entités de la couche courante Ctrl+Shift+A
filterMap Filtrer/Sélectionner les entités en utilisant le formulaire   Ctrl+F
selectedToTop Déplacer la sélection au sommet Regrouper les objets sélectionnés au début de la table  
panToSelected Centrer la carte sur les lignes sélectionnées   Ctrl+P
zoomToSelected Zoomer la carte sur les lignes sélectionnées   Ctrl+J
newAttribute Nouveau champ Ajouter un nouveau champ à la source de données Ctrl+W
deleteAttribute Supprimer le champ Supprimer un champ de la source de données Ctrl+L
calculateField Ouvrir la calculatrice de champ Mise à jour de champs pour de nombreuses entités. Ctrl+I
conditionalFormatting Mise en forme conditionnelle Active la mise en forme de la table  
|intégrer| Intégrer la table attributaire Permet d’intégrer ou de décrocher la table attributaire  
|Actions| Actions Lister les actions liées à la couche  

Table d’attributs 1 : Les outils disponibles

Note

Selon le format des données et la version de la bibliothèque OGR compilée avec votre version de QGIS, certains outils pourraient manquer.

Sous ces boutons se trouve la barre de Calcul rapide (activée seulement en mode d’édition), qui permet d’appliquer rapidement des calculs à tout ou partie des entités de la couche. Cette barre utilise les mêmes expressions que dans la calculateField Calculateur de champ (voir Editer les valeurs attributaires).

Vue en table vs vue formulaire

QGIS propose deux modes pour manipuler facilement les données dans la table attributaire :

  • La openTable Vue table montre les valeurs des différentes entités en mode tabulaire, chaque ligne représentant une entité et chaque colonne un champ.
  • Et le formView Mode formulaire montre les identifiants de l’entité dans le premier panneau et ne présente que les attributs de l’identifiant cliqué dans le second panneau. Le mode formulaire utilise la configuration des champs de la couche (voir Attributes Form Properties).

Vous pouvez basculer d’un mode à l’autre en cliquant sur l’icône correspondante en bas à droite de la boîte de dialogue.

Vous pouvez aussi préciser le mode de vue par défaut à l’ouverture de la table attributaire dans le menu Préférences‣ Options ‣ Sources de Données. Cela peut être “Se souvenir de la dernière vue”, “Voir la table” or “Voir le formulaire”.

../../../_images/attribute_table_views.png

Table attributaire en mode Table (en haut) vs en mode Formulaire (en bas)

Configurer les colonnes

Un clic droit sur l’en-tête de colonne en mode Table donne accès aux outils permettant de configurer ce qui peut être présenté dans la table attributaire et comment.

Cacher et organiser des colonnes et activer des actions

En faisant un clic droit dans l’en-tête d’une colonne, vous pouvez choisir de la masquer de la table attributaire. Pour changer masquer ou afficher plusieurs colonnes en même temps ou bien changer l’ordre des colonnes, choisissez Organiser les colonnes …. Dans la nouvelle boîte de dialogue, vous pouvez :

  • cocher ou décocher les colonnes que vous souhaitez afficher ou masquer
  • glisser-et-déposer des éléments pour réorganiser les colonnes dans la table attributaire. Notez que ce changement n’affecte que le rendu de la table et ne modifier pas l’ordre des champs dans la source de données de la couche
  • activer une nouvelle colonne virtuelle d” Actions qui présente à chaque rang un bouton de menu déourlant ou un bouton de liste d’action, voir les Propriétés des Actions pour plus d’information sur les actions.

Paramétrer la largeur des colonnes

La largeur des colonnes peut être réglée par un clic droit sur l’en-tête de la colonne, puis en sélectionnant soit :

  • largeur… pour saisir la valeur souhaitée. Par défaut, c’est la valeur actuelle qui est présentée dans l’outil
  • Taille automatique pour redimensionner la taille à la meilleure largeur.

La largeur de la colonne peut aussi être modifiée en glissant la limite de droite de l’en-tête de colonne. La nouvelle dimension de la colonne est maintenue dans la couche, et restaurée à l’ouverture suivante de la table d’attributs.

Trier les colonnes

La table peut être triée par n’importe quelle colonne, en cliquant sur l’en-tête de colonne. Une petite flèche indique le sens du tri (si la flèche pointe vers le bas, cela signifie que les valeurs sont triées par ordre décroissant depuis le haut, si la flèche pointe vers le haut, cela signifie que les valeurs sont triées par ordre décroissant depuis le haut). Vous pouvez aussi choisir de trier les colonnes avec l’option tri du menu contextuel de l’en-tête de colonne et en écrivant une expression, par exemple pour trier les rangs de plusieurs colonnes, vous pouvez écrire concat(col0, col1).

En mode formulaire, les identifiants d’entités peuvent être triés grâce à l’option sort :guilabel:`Définir l’ordre `.

Astuce

Trier des colonnes de différents types

Trier une table attributaire en fonction de colonnes de type numérique et texte risque de causer des résultats inattendus à cause de l’expression  concat("USE", "ID") qui renvoie des valeurs en chaînes de caractères (par ex., 'Borough105' < 'Borough6'). Vous pouvez contourner le problème en utilisant par exemple  concat("USE", lpad("ID", 3, 0)) qui renvoie 'Borough105' > 'Borough006'.

Mise en forme conditionnelle de la table

Les paramètres de mise en forme conditionnelle peuvent être utilisés pour mettre en surbrillance des entités de la table attributaire que vous souhaitez montrer, en utilisant des conditions sur les éléments des entités :

  • les géométries (par exemple en identifiant les entités multi-parties, celles de petites dimensions ou dans une étendue définie de la carte…) ;
  • la valeur du champ (par exemple en comparant les valeurs à un seuil, en identifiant les cellules vides…).

Vous pouvez activer le panneau de mise en forme conditionnelle en cliquant sur conditionalFormatting en haut à droite de la fenêtre de la table des attributs en mode Table (n’est pas accessible en mode formulaire).

Le nouveau panneau permet à l’utilisateur d’ajouter de nouvelles règles pour le rendu de format d’un radioButtonOnChamp ou d’une radioButtonOffLigne complète. L’ajout d’une nouvelle règle ouvre un formulaire pour définir :

  • le nom de la règle ;
  • une condition utilisant n’importe laquelle des fonctions du calculateur d’expression <vector_expressions> ;
  • la mise en forme : elle peut être choisie dans une liste de formats prédéfinis ou créée selon des propriétés comme :
    • couleurs d’arrière-plan et du texte;
    • utilisation d’une Icône;
    • texte en gras, italique, souligné ou barré;
    • police.
../../../_images/attribute_table_conditional_formating.png

Mise en forme conditionnelle des cellules de la table d’attributs

Interagir avec les entités dans une table attributaire

Sélectionner des entités

En mode table, chaque ligne de la table attributaire présente les attributs d’une seule entité de la couche. En sélectionnant une ligne, vous sélectionnez une entité et, de la même manière, en sélectionnant une entité dans le canevas de la carte (dans le cas d’une couche à géométries activées), vous sélectionnez la ligne dans la table attributaire. Si le jeu d’entités sélectionnées dans le canevas de la carte (ou dans la table attributaire) est modifié, alors la sélection est aussi mise à jour dans la table attributaire (ou le canevas de la carte).

Les lignes peuvent être sélectionnées en cliquant sur le numéro de ligne placé tout à gauche. Plusieurs lignes peuvent être sélectionnées en maintenant la touche Ctrl. Une sélection continue s’effectue en gardant appuyée la touche Shift et en cliquant sur une nouvelle ligne, toutes les lignes entre la première sélection et la dernière seront sélectionnées. Déplacer la position du curseur dans la table d’attributs en cliquant sur une cellule ne modifie pas la sélection des lignes. Modifier les entités sélectionnées depuis la carte ne modifie pas la position du curseur dans la table.

En mode formulaire de la table attributaire, les entités sont identifiées par défaut dans le panneau de gauche par la valeur du champ montré (voir Propriétés des Infobulles). Cet identifiant peut être remplacé en utilisant le menu déroulant en haut du panneau, soit en sélectionnant un champ existant soit en utilisant une expression personnalisée. Vous pouvez aussi choisir de trier la liste des entités depuis le menu déroulant.

Cliquer sur une valeur du panneau de gauche pour afficher les attributs de l’entité dans celui de droite. Pour sélectionner une entité, vous devez cliquer dans le symbole carré situé à gauche de l’identifiant. Par défaut, le symbole prend une couleur jaune. Comme dans la vue en mode table, vous pouvez sélectionner plusieurs entités en utilisant les raccourcis clavier présentés ci-dessus.

En plus de sélectionner les entités avec la souris, vous pouvez créer des sélections automatiques à partir des attributs des entités en vous servant des outils disponibles dans la table attributaire, comme (voir la section Automatic selection et la suivante pour plus d’information et l’utilisation) :

  • expressionSelect Sélectionner à l’aide d’une expression…
  • formSelect Sélectionner des entités par valeur…
  • deselectAll :guilabel:` Désélectionner toutes les entités`
  • selectAll Sélectionner toutes les entités
  • invertSelection Inverser la sélection des entités.

Il est aussi possible de sélectionner les entités à partir des formulaires de sélection Filtrer et sélectionner des entités à partir des formulaires.

Filtrer les entités

Une fois vos entités sélectionnées dans la table attributaire, vous pouvez choisir de n’afficher que celles-ci dans la table. Ceci peut être fait aisément grâce à l’élément Ne montrer que les entités sélectionnées dans le menu déroulant en bas à gauche de la boîte de dialogue. Cette liste offre les filtres suivants :

  • :guilabel:` Montrer toutes les entités`
  • :guilabel:` Ne montrer que les entités sélectionnées`
  • :guilabel:` Ne montrer que les entités visibles sur la carte`
  • :guilabel:` Ne montrer que les entités nouvelles ou éditées`
  • Filtre de champ - permet à l’utilisateur de filtrer selon une valeur contenant dans un champ : choisissez une colonne dans la liste, saisissez la valeur et appuyez sur Entrée pour filtrer. Ainsi, seules les entités correspondantes seront montrées dans la table attributaire.
  • Filtre avancé (Expression) - Ouvre la boîte de dialogue du calculateur d’expression. Dans celle-ci, vous pouvez créer des expressions complexes pour correspondre aux lignes de la table. Par exemple, vous pouvez filtrer en utilisant plus d’un champ. Lorsqu’elle est appliquée, l’expression de filtre est affichée en bas de la boîte de dialogue.

Il est aussi possible de filtrer les entités à partir de formulaires.

Note

Le fait de filtrer des enregistrements à partir de la table d’attributs ne filtre pas les entités sur la couche ; elles sont simplement momentanément cachées de la table et on peut y accéder via le canevas de la carte ou en retirant le filtre. Pour des filtres qui cachent bien les entités de la couche, utiliser le Constructeur de requête.

Astuce

**Mise à jour des filtres de la source de données avec **Ne montrer que les entités visibles sur la carte

Lorsque pour des raisons de performance, les entités montrées dans la table attributaires sont limitées spatialement à l’étendue du canevas de la carte à l’ouverture (voir les Options de sources de données pour la marche à suivre), choisir Ne montrer que les entités visibles sur la carte sur une nouvelle étendue du canevas de la carte met à jour la restriction spatiale.

Filtrer et sélectionner des entités à partir des formulaires

En cliquant sur filterMap Sélectionner/Filtrer les entités en utilisant le formulaire ou en tapant Ctrl+F vous faites passer la boite de dialogue de la table attribuaire du mode table au mode formulaire et remplacez chaque widget avec sa variante de recherche.

A partir de ce point, les fonctionnalités de cet outils sont similaires à celles décrites dans Sélectionner des entités selon les valeurs, où vous trouverez la description de tous les opérateurs et modes de sélection.

../../../_images/tableFilteredForm.png

Table attributaire filtrée par le formulaire

Lorsque vous filtrez/sélectionnez des entités de la table attributaire, il y a un bouton Filtrer les entités qui permet de définir et d’affiner les entités. Son utilisation active l’option Filtre avancé (Expression) et affiche l’expression du filtre correspondant dans un menu de texte éditable en bas du formulaire.

S’il y a déjà des entités filtrées, vous pouvez affiner le filtre avec le menu déroulant situé à côté du bouton Filtrer les entités button. Les options sont :

  • Filtre incluant (« AND »)
  • Filtre exclusif (« OR »)

Pour effacer le filtre, vous pouvez soit sélectionner l’option Montrer toutes les entités du menu déroulant en bas à gauche, soit effacer l’expression et cliquer sur Appliquer ou appuyer sur Entrée.

Actions applicables aux entités

Les utilisateurs ont plusieurs choix pour manipuler les entités dans le menu contextuel comme par exemple :

  • Sélectionner tout (Ctrl+A) : sélectionne toute les entités
  • Copier le contenu d’une cellule dans le presse-papier avec Copier le contenu de la cellule;
  • Zoomer sur l’entité sans avoir à la sélectionner au préalable ;
  • Se déplacer sur l’entité sans avoir à la sélectionner au préalable ;
  • Faire clignoter l’entité, pour la mettre en surbrillance dans le canevas de carte ;
  • Ouvrir le formulaire : cela transforme la table attributaire en mode formulaire avec un focus sur l’entité sélectionnée.
../../../_images/copyCellContent.png

Bouton Copier le contenu de la cellule

Si vous souhaitez utiliser des données attributaires de programmes externes (comme Excel, LibreOffice, QGIS ou une application web), sélectionnez une ou plusieurs ligne(s) et utilisez le bouton copySelected Copiez les lignes sélectionnées dans le presse-papier ou appuyez sur Ctrl+C.

Dans le menu Paramètres ‣ Options ‣ Sources de données vous pouvez définir le format pour coller avec la liste déroulante Copier les entités comme :

  • Texte simple, pas de géométrie,
  • Texte simple, géométrie WKT,
  • GeoJSON

Vous pouvez aussi afficher une liste d’actions dans le menu contextuel. Ceci est activé dans l’onglet Propriétés de la couche ‣ Actions . Voir Propriétés des Actions pour plus d’informations sur les actions.

Enregistrer les entités sélectionnées en tant que nouvelle couche

Les entités sélectionnées peuvent être enregistrés comme n’importe quel format de vecteur supporté par OGR et aussi transformées dans un autre système de coordonnées de référence (SCR). Dans les propriétés de la couche, depuis le panneau Couches, cliquez sur Exporter ‣ Sauvegarder les entités sous pour définir le nom du jeu de données en sortie, son format et son SCR (voir la section Creating new layers from an existing layer). Vous noterez que la boîte checkbox Ne sauvegarder que les entités séléectionnées est cochée.

Editer les valeurs d’attributs

L’édition des valeurs attributaires peut être faite en :

  • saisissant directement la nouvelle valeur dans la cellule, que la table attributaire soit en mode table ou en mode formulaire. Les modifications sont ainsi faites cellule par cellule, entité par entité ;
  • utilisant la calculatrice de champs : pour mettre à jour dans une ligne un champ déjà existnat ou un champ à créer mais pour plusieurs entités. Cela peut être utilisé pour créer des champs virtuels ;
  • utilisant barre de calcul rapide de champ : comme ci-dessus mais uniquement pour un champ existant ;
  • ou en utilisant le mode édition multiple : pour mettre à jour dans une ligne plusieurs champs pour plusieurs entités.

Utiliser la Calculatrice de Champs

Le bouton calculateField Calculatrice de champ de la table attributaire vous permet de réaliser des calculs à partir de valeurs attributaires existantes ou de fonctions définies, comme par exemple pour calculer la longueur ou la surface d’entités géométriques. Les résultats peuvent être utilisés pour mettre à jour un champ existant ou écrites dans un nouveau champ (qui peut être un champ virtuel ).

La calculatrice de champ fonctionne avec toutes les couches qui gèrent le mode édition. Lorsque vous cliquez sur le bouton de la calculatrice de champ, la fenêtre s’ouvre (voir figure_field_calculator). Si la couche n’est pas en mode édition, un avertissement s’affiche et l’utilisation de la calculatrice de champ basculera automatiquement la couche en édition avant d’effectuer le calcul.

Basée sur la boîte de dialogue Constructeur de requêtes , la boîte de dialogue de la calculatrice de champ offre une interface complète pour définir une expression et l’appliquer à un champ existant ou à un champ nouvellement créé. Pour utiliser la boîte de dialogue de la calculatrice de champ, vous devez choisir si vous voulez :

  1. appliquer le calcul à la totalité de la couche ou seulement à des entités sélectionnées
  2. créer un nouveau champ pour le calcul ou mettre à jour un champ existant.
../../../_images/fieldcalculator.png

Calculatrice de champ

Si vous choisissez d’ajouter un nouveau champ, vous devez saisir un nom de champ, un type de champ (entier, réel, date ou texte) et si nécessaire, la longueur totale du champ et la précision du champ. Par exemple, si vous choisissez une longueur de champ de 10 et une précision de champ de 3, cela veut dire que vous avez 7 chiffres avant la virgule et 3 chiffres pour la partie décimale.

L’exemple suivant montre comment la calculatrice de champs fonctionne. Il s’agit de calculer la longueur en km de la couche railroads issue de l’échantillon de données QGIS.

  1. Chargez le fichier shapefile railroads.shp dans QGIS et ouvrez sa openTable Table d’Attributs.
  2. Cliquez sur toggleEditing Basculer en mode édition et ouvrez la calculateField Calculatrice de champs.
  3. Cochez la case checkbox Créer un nouveau champ pour enregistrer le résultat des calculs dans un nouveau champ.
  4. Saisir le :guilabel:Nom` avec``length_km``
  5. Sélectionner Nombre décimal (réel) pour le Type
  6. Choisir la Longueur du nouveau champ 10 et la Précision 3
  7. Double cliquer sur $length dans le groupe Geometrie pour ajouter la longueur de la géométrie dans la boîte d’expression de la Calculatrice de champ.
  8. Compléter l’expression en saisissant / 1000 dans la boîte d’expression de la Calculatrice de champ et cliquer sur OK.
  9. Vous avez maintenant un nouveau champ length_km dans la table attributaire.

Créer un Champ virtuel

A virtual field is a field based on an expression calculated on the fly, meaning that its value is automatically updated as soon as an underlying parameter changes. The expression is set once; you no longer need to recalculate the field each time underlying values change. For example, you may want to use a virtual field if you need area to be evaluated as you digitize features or to automatically calculate a duration between dates that may change (e.g., using now() function).

Note

Utilisation des Champs Virtuels

  • Les champs virtuels ne sont pas des attributs permanents, ils ne sont sauvegardés et disponibles que dans le projet dans lequel ils ont été créés.
  • Un champ est défini comme virtuel uniquement à sa création et l’expression utilisée pour le générer ne peut pas être modifiée par la suite : pour le faire, vous devez supprimer et recréer le champ.

Using the Quick Field Calculation Bar

While Field calculator is always available, the quick field calculation bar on top of the attribute table is only visible if the layer is in edit mode. Thanks to the expression engine, it offers a quicker access to edit an already existing field:

  1. Select the field to update in the drop-down list.
  2. Fill the textbox with a value, an expression you directly write or build using the expression expression button.
  3. Click on Update All, Update Selected or Update Filtered button according to your need.
../../../_images/fieldcalculatorbar.png

Quick Field Calculation Bar

Editing multiple fields

Contrairement aux outils précédents, le mode d’édition multiple permet d’éditer simultanément plusieurs champs de plusieurs entités. Une fois la couche basculée en mode édition, les options d’édition multiple sont accessibles:

  • using the multiEdit Toggle multi edit mode button from the toolbar inside the attribute table dialog;
  • soit en sélectionnant depuis le menu Edition ‣ multiEdit Modifier les attributs des entités sélectionnées.

Note

Unlike the tool from the attribute table, hitting the Edit ‣ Modify Attributes of Selected Features option provides you with a modal dialog to fill attributes changes. Hence, features selection is required before execution.

Afin de modifier d’une traite plusieurs champs:

  1. Select the features you want to edit.

  2. From the attribute table toolbar, click the multiEdit button. This will toggle the dialog to its form view. Feature selection could also be made at this step.

  3. At the right side of the attribute table, fields (and values) of selected features are shown. New widgets appear next to each field allowing for display of the current multi edit state:

    • multiEditMixedValues The field contains different values for selected features. It’s shown empty and each feature will keep its original value. You can reset the value of the field from the drop-down list of the widget.
    • multiEditSameValues All selected features have the same value for this field and the value displayed in the form will be kept.
    • multiEditChangedValues The field has been edited and the entered value will be applied to all the selected features. A message appears at the top of the dialog, inviting you to either apply or reset your modification.

    Clicking any of these widgets allows you to either set the current value for the field or reset to original value, meaning that you can roll back changes on a field-by-field basis.

    ../../../_images/attribute_multiedit.png

    Mettre à jour des champs de plusieurs entités

  4. Make the changes to the fields you want.

  5. Click on Apply changes in the upper message text or any other feature in the left panel.

Changes will apply to all selected features. If no feature is selected, the whole table is updated with your changes. Modifications are made as a single edit command. So pressing undo Undo will rollback the attribute changes for all selected features at once.

Note

Le mode d’édition multiple n’est disponible que pour les formulaires auto-générés ou en conception par glisser/déposer (voir Customizing a form for your data); il n’est pas disponible pour les formulaires par fichiers ui personnalisés.

Créer des relations un ou plusieurs à plusieurs

Utiliser des relations est courant dans les bases de données. L’idée est que des entités (lignes) de différentes couches (tables) peuvent être liées les unes aux autres.

Introducing 1-N relations

Comme exemple, nous prendrons une couche contenant toutes les régions de l’Alaska (des polygones) qui fournit quelques attributs sur le nom, le type de région et un identifiant unique (qui jouera le rôle de clé primaire).

Nous prenons ensuite une autre couche de point ou une table contenant des informations sur les aéroports localisés dans les régions. Si vous souhaitez accéder, depuis la couche des régions, vous devez créer une relation “un à plusieurs”, en utilisant des clés étrangères, car il y a plusieurs aéroports dans la plupart des régions.

../../../_images/relations1.png

Les régions d’Alaska contenant des aéroports

Layers in 1-N relations

QGIS makes no difference between a table and a vector layer. Basically, a vector layer is a table with a geometry. So you can add your table as a vector layer. To demonstrate the 1-n relation, you can load the regions shapefile and the airports shapefile which has a foreign key field (fk_region) to the layer regions. This means, that each airport belongs to exactly one region while each region can have any number of airports (a typical one to many relation).

Foreign keys in 1-N relations

En plus des attributs existants dans la table des aéroports, un autre champ, fk_region, va jouer le rôle de clé étrangère (si la table est stockée dans une base de données, vous allez sans doute définir une contrainte sur ce champ).

Ce champ fk_region contiendra toujours un identifiant de région. Il peut être vu comme un pointeur vers la région à laquelle l’aéroport appartient. Et vous pouvez créer un formulaire personnalisé d’édition pour la saisie. Cela fonctionne avec différents fournisseurs (vous pouvez vous en servir également avec des shapefiles ou des fichiers csv) et la seule chose que vous avez à faire est de dire à QGIS qu’il y a une relation entre les tables.

Defining 1-N relations (Relation Manager)

The first thing we are going to do is to let QGIS know about the relations between the layers. This is done in Project ‣ Project Properties…. Open the Relations tab and click on Add Relation.

  • Name is going to be used as a title. It should be a human readable string, describing, what the relation is used for. We will just call say Airports in this case.
  • Referenced Layer (Parent) also considered as parent layer, is the one with the primary key, pointed to, so here it is the regions layer
  • Referenced Field is the primary key of the referenced layer so it is ID
  • Referencing Layer (Child) also considered as child layer, is the one with the foreign key field on it. In our case, this is the airports layer
  • Referencing Field will say, which field points to the other layer so this is fk_region in this case
  • Id will be used for internal purposes and has to be unique. You may need it to build custom forms. If you leave it empty, one will be generated for you but you can assign one yourself to get one that is easier to handle
  • Relationship strength sets the strength of the relation between the parent and the child layer. The default Association type means that the parent layer is simply linked to the child one while the Composition type allows you to duplicate also the child features when duplicating the parent ones.
../../../_images/relations2.png

Gestionnaire de Relations

Forms for 1-N relations

Maintenant que QGIS a bien généré la relation, le formulaire d’édition va être amélioré. Nous n’avons pas modifié le formulaire d’édition par défaut (généré automatiquement), une nouvelle zone va simplement être ajoutée au formulaire. Sélectionnez la couche de régions dans la légende et utilisez l’outil d’identification. Selon vos préférences, le formulaire s’ouvre directement ou vous devez le faire via la zone d’identification qui s’affiche.

../../../_images/relations3.png

Formulaire de la couche des régions affichant la relation avec les aéroports

As you can see, the airports assigned to this particular region are all shown in a table. And there are also some buttons available. Let’s review them shortly:

  • Le bouton toggleEditing permet de passer en mode édition. Soyez conscients qu’il active le mode édition de la couche des aéroports bien qu’il soit situé dans le formulaire de la couche des régions. La table affiche bien les entités de la couche des aéroports.
  • The saveEdits button is for saving all the edits.
  • The newTableRow button will add a new record to the airport layer attribute table. And it will assign the new airport to the current region by default.
  • The duplicateFeature button allows you to copy one or more child features.
  • The deleteSelected button will delete the selected airport permanently.
  • Le bouton link ouvre une nouvelle fenêtre où vous pouvez sélectionner des aéroports existants et qui seront ensuite attribués à la région identifiée. Ceci est pratique lorsque vous assignez par erreur la mauvaise région à un aéroport.
  • Le bouton unlink permet de supprimer le lien entre l’aéroport sélectionné et la région identifiée, le laissant non assigné (la clé étrangère devient alors NULL).
  • With the zoomToSelected button you can zoom the map to the selected child features.
  • The two buttons formView and openTable to the right switch between table view and form view where the later let’s you view all the airports in their respective form.

In the above example the referencing layer has geometries (so it isn’t just an alphanumeric table) so the above steps will create an entry in the layer attribute table that has no corresponding geometric feature. To add the geometry:

  1. Choose openTable Open Attribute Table for the referencing layer.
  2. Select the record that has been added previously within the feature form of the referenced layer.
  3. Use the addPart Add Part digitizing tool to attach a geometry to the selected attributes table record.

If you work on the airport table, the widget Relation Reference is automatically set up for the fk_region field (the one used to create the relation), see Relation Reference widget.

In the airport form you will see the formView button at the right side of the fk_region field: if you click on the button the form of the region layer will be opened. This widget allows you to easily and quickly open the forms of the linked parent features.

../../../_images/relations4.png

Formulaire d’identification d’un aéroport et de sa région associée

The Relation Reference widget has also an option to embed the form of the parent layer within the child one. It is available in the Properties ‣ Attributes Form menu of the airport layer: select the fk_region field and check the Show embedded form option.

Vous devriez ainsi voir que le formulaire de la région est inclus dans celui d’un aéroport et il vous permet de modifier la région assignée à l’aéroport.

../../../_images/relations5.png

Moreover if you toggle the editing mode of the airport layer, the fk_region field has also an autocompleter function: while typing you will see all the values of the id field of the region layer.

Introducing many-to-many (N-M) relations

N-M relations are many-to-many relations between two tables. For instance, the airports and airlines layers: an airport receives several airline companies and an airline company flies to several airports.

This SQL code creates the three tables we need for an N-M relationship in a PostgreSQL/PostGIS schema named locations. You can run the code using the Database ‣ DB Manager… for PostGIS or external tools such as pgAdmin. The airports table stores the airports layer and the airlines table stores the airlines layer. In both tables few fields are used for clarity. The tricky part is the airports_airlines table. We need it to list all airlines for all airports (or vice versa). This kind of table is known as a pivot table. The constraints in this table force that an airport can be associated with an airline only if both already exist in their layers.

CREATE SCHEMA locations;

CREATE TABLE locations.airports
(
   id serial NOT NULL,
   geom geometry(Point, 4326) NOT NULL,
   airport_name text NOT NULL,
   CONSTRAINT airports_pkey PRIMARY KEY (id)
);

CREATE INDEX airports_geom_idx ON locations.airports USING gist (geom);

CREATE TABLE locations.airlines
(
   id serial NOT NULL,
   geom geometry(Point, 4326) NOT NULL,
   airline_name text NOT NULL,
   CONSTRAINT airlines_pkey PRIMARY KEY (id)
);

CREATE INDEX airlines_geom_idx ON locations.airlines USING gist (geom);

CREATE TABLE locations.airports_airlines
(
   id serial NOT NULL,
   airport_fk integer NOT NULL,
   airline_fk integer NOT NULL,
   CONSTRAINT airports_airlines_pkey PRIMARY KEY (id),
   CONSTRAINT airports_airlines_airport_fk_fkey FOREIGN KEY (airport_fk)
      REFERENCES locations.airports (id)
      ON DELETE CASCADE
      ON UPDATE CASCADE
      DEFERRABLE INITIALLY DEFERRED,
   CONSTRAINT airports_airlines_airline_fk_fkey FOREIGN KEY (airline_fk)
      REFERENCES locations.airlines (id)
      ON DELETE CASCADE
      ON UPDATE CASCADE
      DEFERRABLE INITIALLY DEFERRED
 );

Instead of PostgreSQL you can also use GeoPackage. In this case, the three tables can be created manually using the Database ‣ DB Manager…. In GeoPackage there are no schemas so the locations prefix is not needed.

Foreign key constraints in airports_airlines table can´t be created using Table ‣ Create Table… or Table ‣ Edit Table… so they should be created using Database ‣ SQL Window…. GeoPackage doesn’t support ADD CONSTRAINT statements so the airports_airlines table should be created in two steps:

  1. Set up the table only with the id field using Table ‣ Create Table…

  2. Using Database ‣ SQL Window…, type and execute this SQL code:

    ALTER TABLE airports_airlines
       ADD COLUMN airport_fk INTEGER
       REFERENCES airports (id)
       ON DELETE CASCADE
       ON UPDATE CASCADE
       DEFERRABLE INITIALLY DEFERRED;
    
    ALTER TABLE airports_airlines
       ADD COLUMN airline_fk INTEGER
       REFERENCES airlines (id)
       ON DELETE CASCADE
       ON UPDATE CASCADE
       DEFERRABLE INITIALLY DEFERRED;
    

Then in QGIS, you should set up two one-to-many relations as explained above:

  • a relation between airlines table and the pivot table;
  • and a second one between airports table and the pivot table.

An easier way to do it (only for PostgreSQL) is using the Discover Relations in Project ‣ Properties ‣ Relations. QGIS will automatically read all relations in your database and you only have to select the two you need. Remember to load the three tables in the QGIS project first.

../../../_images/relations6.png

Relations and autodiscover

In case you want to remove an airport or an airline, QGIS won’t remove the associated record(s) in airports_airlines table. This task will be made by the database if we specify the right constraints in the pivot table creation as in the current example.

Note

Combining N-M relation with automatic transaction group

You should enable the transaction mode in Project Properties ‣ Data Sources ‣ when working on such context. QGIS should be able to add or update row(s) in all tables (airlines, airports and the pivot tables).

Finally we have to select the right cardinalilty in the Layer Properties ‣ Attributes Form for the airports and airlines layers. For the first one we should choose the airlines (id) option and for the second one the airports (id) option.

../../../_images/relations7.png

Set relationship cardinality

Now you can associate an airport with an airline (or an airline with an airport) using Add child feature or Link existing child feature in the subforms. A record will automatically be inserted in the airports_airlines table.

../../../_images/relations8.png

N-M relationship between airports and airlines

Note

Using Many to one relation cardinality

Sometimes hiding the pivot table in an N-M relationship is not desirable. Mainly because there are attributes in the relationship that can only have values when a relationship is established. If your tables are layers (have a geometry field) it could be interesting to activate the On map identification option (Layer Properties ‣ Attributes Form ‣ Available widgets ‣ Fields) for the foreign key fields in the pivot table.

Note

Pivot table primary key

Avoid using multiple fields in the primary key in a pivot table. QGIS assumes a single primary key so a constraint like constraint airports_airlines_pkey primary key (airport_fk, airline_fk) will not work.