Sous-formulaire : relation géographiques

La relation entre la couche "parent" et la couche "enfant" est obligatoirement de type attributaire pour la création d'un sous-formulaire.

Si l'on ne dispose pas de champs attributaires permettant de construire directement une relation attributaire, comme le cas de relations géographiques, il faut construire cette liaison attributaire. Pour cela 2 solutions sont envisageables :

  • Créer une couche virtuelle basée sur une requête géographique qui comportera le champ nécessaire à la relation. Attention, si la table est volumineuse les performances s'en ressentiront.

  • Créer un champ calculé qui récupère les informations nécessaires.

Pour illustrer ce cas nous allons utiliser les tables FOAD_Communes64.shp (couche de polygones) et FOAD_etablissement_scolaire64 (couche de points). L'objectif est de pouvoir afficher dans le formulaire des communes les informations des établissements présents dans la commune. Les structures respectives de ces 2 tables sont les suivantes :

FOAD_Communes64.shp :

  • id

  • nom_comm

  • insee_com

  • statut

  • code_siren

FOAD_etablissement_scolaire64 :

  • numero_uai

  • appellatio

  • denominati

  • patronyme_

  • nature_uai

  • lib_nature

Il n'existe pas de champs pouvant indiquer dans quelle commune se trouve les établissements scolaires, mais il existe une relation géographique : les objets établissements scolaires sont dans les objets communes.

MéthodeSolution 1 : Créer une couche virtuelle

Les attributs n'étant pas présents dans les 2 tables pour pouvoir établir la relation , il est nécessaire de générer une couche virtuelle pour ajouter l'attribut manquant.

Création de la couche virtuelle Etab_com

Données attributaires de la couche virtuelle générée Etab_com.

Il ne reste plus qu'à paramétrer la relation entre la couche parent "FOAD_communes64" et la couche enfant "Etab_com" comme vu précédemment.

MéthodeSolution 2 : Joindre les attributs par localisation

Il est possible, au lieu de créer une couche ou un champ virtuel, de créer et rapatrier directement l'attribut manquant de façon définitive dans une nouvelle table.

Pour cela, il faut utiliser l'algorithme "Joindre les attributs par localisation" disponible dans le Menu Vecteur -> Outils de gestion de données.

L'algorithme crée une nouvelle table contenant les attributs de la couche "FOAD_etablisssement_scolaire64" et l'attribut choisi dans la couche "FOAD_communes64" :

Données attributaires de la nouvelle couche générée "FOAD_Etablissement_scolaires64_Com"

Il ne reste plus qu'à paramétrer la relation entre la couche parent "FOAD_communes64" et la couche enfant "FOAD_etablisssement_scolaire64_Com" comme vu précédemment.

ComplémentUtilisation du plugin refFunctions

Pour atteindre un résultat équivalent, mais sous forme d'un champ (virtuel ou non) ajouté directement dans la couche de départ, Il est possible de charger le plugin refFunctions qui offre des fonctions de référence spatiales dans le calculateur de champs.

On utilise pour cela la fonction geomwithin() qui permet de récupérer les valeurs d'un champ d'une table par correspondance géographique : Ici nous voulons récupérer le champ 'insee_com" de la table "FOAD_Communes64" où les objets "FOAD_etablissement_scolaire64" sont à l'intérieur des objets "FOAD_Communes64", on utilise donc :

geomwithin ( nom_de_la_couche_géographique , intitulé_champ_à_récupérer)

Pour des raisons de performance, il peut être judicieux suivant les cas de ne pas créer un champ virtuel (comme dans l'exemple ci-dessous) qui se recalcule dynamiquement, mais de créer et de rapatrier la valeur de façon définitive dans la table.