Skip to Content

QGIS: jointures dynamiques entre tables lors de l'édition d'une couche avec l'extension Form Value Relation

Niveau Intermédiaire
Logiciels utilisés QGIS
Form Value Relation
Plateforme Windows | Mac | Linux | FreeBSD

Qui n’a pas rêvé lors de l’édition des données dans QGIS d’utiliser dynamiquement des listes de valeurs provenant d’une autre table, c’est-à-dire que si je rentre une valeur dans un champ, QGIS me fournira automatiquement la valeur liée provenant de l’autre table dans le champ ad hoc.

Il y avait l’outil d’édition Valeur relationnelle et il y a maintenant l’extension Form Value Relation développée par Alessandro Pasotti pour et avec l’aide financière de l’ARPA Piemonte qui l’améliore (il permet le filtrage dynamique des valeurs, voir les différences dans Form Value Relation).

Pour rappel, cet outil d’édition permet de sélectionner des valeurs d’une autre table liée par un champ commun sous forme de liste. Si l’on veut aller plus loin, il faut connaître Python (How to build cascading form controls in QGis 2.4 par exemple).

La nouvelle extension est dynamique: si je rentre une valeur dans le champ IGN, le champ nom_carte sera automatiquement mis à jour (voir animations plus bas).

Principes

Son utilisation a été décrite dans:

L’extension propose:

  • dans l’onglet Champs des Propriétés d’une couche vectorielle un nouvel Outil d’édition: Form Value Relation

  • dans les Custom scripts, l’expression/fonction CurrentFormValue()

En pratique

Je dispose de deux tables, celle sur laquelle je veux travailler, et l’autre qui contient simplement les numéros et le nom des cartes de l’IGN belge (cette table peut être celle d’une couche ou provenir d’un fichier CSV, d’un fichier Excel ou LibreOffice (OpenOffice) ou d’une table non spatiale d’une base de données). Je voudrai que chaque fois que je rentre le numéro d’une carte dans ma couche de travail, le nom de la carte soit affiché dynamiquement.

1) Dans ma table de travail, pour le champ désiré (nom_carte), je choisis l’option Form value Relation puis je commence par placer les éléments de jointure provenant de la table extérieure (IDENT, champ de jointure, et NOM_1_1000, les valeurs résultantes désirées), démarche similaire à celle de l’outil d’édition Valeur relationnelle puisque c'est, en partie, un « clone » de cet outil.

 

2) dans l’onglet Filtrer l’expression, je crée l’expression de jointure avec CurrentFormValue() :

"IDENT" = CurrentFormValue('num') signifie que le champs num de ma table de travail est lié au champ IDENT de ma table extérieure

3) résultat final:

4) Remarques

Pour traiter les cas où il n’y a pas de valeur correspondante, il suffit de cocher la case Autoriser une valeur nulle.

Application

Lorsque je crée un nouvel objet, tous les champs sont, bien entendu, vides, mais dès que je rentre une valeur dans le champs num, la valeur concordante, extraite de la table extérieure va s’afficher automatiquement;

 

Pour aller plus loin

Il y a moyen de combiner les deux outils d’éditions pour rendre les sélections d’éléments sous forme de listes de valeurs (voir aussi Formularios personalizados en QGIS 2.12, Parte 2 pour cet aspect)

 

Il est aussi possible de créer de multiples relations basées sur différentes tables ou sur différentes valeurs dans une table.

 

Conclusion

Il s’agit ici d’une extension destinée à combiner plusieurs tables de manière dynamique lors de l’entrée des données dans la phase d’édition d’une couche. En cas de consultation, elle est désactivée.

Tout se joue à l’échelle du projet QGIS (où les relations sont sauvées) et non dans celle des couches. Dans la table de travail la seule valeur qui est sauvegardée est la valeur de jonction et non la valeur résultante comme dans l’outil d’édition Valeur relationnelle.

 

Tous les traitements ont été effectués avec la version 2.12.1 de QGIS et LICEcap pour les gif animés.

Site officiel : Plugin: Form Value Relation


Creative Commons License
licence Creative Commons Paternité-Pas d'Utilisation Commerciale-Pas de Modification 2.0 France

Commentaires

Poster un nouveau commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.