X
    Categories: Bureautique

QGIS: ajouter automatiquement l’attribut d’une autre couche

Vous dessinez un point sur une couche SIG et vous voulez connaître la commune associée? Dans QGIS, il est possible d’ajouter automatiquement l’attribut d’une autre couche dans une donnée cible. Dans ce tutoriel SIG, on ne traite pas de jointure par champ attributaire ni de jointure spatiale. Il s’agit d’utiliser la calculatrice de champs avec une expression de relation spatiale.

  1. Expression de relation spatiale pour ajouter un attribut d’une autre couche
  2. Exemple : Ajouter le nom de la commune qui intersecte le point dessiné
  3. Formulaire d’attributs pour ajouter automatiquement l’information d’une autre couche dans QGIS
  4. Code PyQGIS pour ajouter les attributs d’une couche source dans une couche cible

1. Expression de relation spatiale pour ajouter un attribut d’une autre couche

On se sert d’une relation spatiale entre les objets géographiques pour obtenir les informations d’une couche source et les ajouter à la couche cible. Une relation spatiale peut être, par exemple, l’intersection, la contenance, le point le plus proche, etc.

Voici les étapes dans QGIS afin d’ajouter l’attribut d’une autre couche dans une donnée cible:

  1. On ouvre la Calculatrice de champ depuis la table d’attributs ou via un clic droit sur la couche cible.
  2. Créez un nouveau champ (ou mettez à jour un champ existant).
  3. Utilisez la fonction overlay_* correspondant à la relation spatiale souhaitée pour ajouter des attributs de la couche source vers la couche cible. Dans QGIS, les fonctions overlay_* disponibles sont :
    • overlay_contains;
    • overlay_crosses;
    • overlay_disjoint;
    • overlay_equals;
    • overlay_intersects;
    • overlay_nearest;
    • overlay_touches;
    • overlay_within.

Chaque fonction de relation spatiale overlay_* est décrite dans la calculatrice de champ comme le montre la figure 1 ci-dessous.

Figure 1: fonction overlay_intersects dans la calculatrice de champs de QGIS.
  • Par exemple, pour obtenir un attribut de la couche source qui intersecte la couche cible, vous pourriez utiliser :
   overlay_intersects('nom_de_la_couche_source', attribut_source)
  • Puis, pour récupérer l’attribut d’un polygone contenant un point, vous pouvez utiliser :
   overlay_within('nom_de_la_couche_source', attribut_source)

Alors, passons à une étude de cas.

2. Exemple : Ajouter le nom de la commune qui intersecte le point dessiné

Dans cet exemple, on montre comment ajouter le nom de la commune qui intersecte une couche de points. Dans QGIS, la couche source appelée « couche_point » contient deux champs attributaires (figure 2). Et, le champ « nom_commune » de type texte recevra les valeurs attributaires de la couche cible commune.

Figure 2: Exemple d’ajout du nom de la commune dans une couche de points dans QGIS.

Depuis la couche de points, on ouvre la calculatrice de champ pour mettre à jour le champ existant « nom_commune ». Puis, comme l’indique la figure 3, on saisit l’expression de relation spatiale basée sur l’intersection des deux couches :

overlay_intersects( 'commune', nom)

On se base ici sur le champ attributaire « nom » de la couche source « commune ». La prévisualisation du résultat indique: [‘Carnac’]. Ainsi, le retour de l’expression utilisée est un array (tableau).

Figure 3: Ajout d’une valeur attributaire d’une couche source vers une couche cible avec overlay_intersects.

Extraction des valeurs du tableau par expression dans QGIS

Or, le champ de la couche cible nom_commune est de type texte. C’est pourquoi, on utilise la fonction de chaîne de caractères array_to_string afin de transformer le tableau en texte. Les différents éléments du tableau sont alors séparés par des virgules.

Note : Cet exemple est basé sur une couche de points qui, pour chacun d’entre eux, ne peut intersecter qu’une commune. Dans le cas d’une couche de polygones intersectant plusieurs communes, le résultat est un texte de l’ensemble des valeurs intersectées de la couche source séparées par des virgules. Ainsi, la fonction overlay_intersects gère parfaitement les intersections multiples dans QGIS.

Figure 4: Utilisation de la fonction array_to_string pour transformer un tableau en texte.

Ensuite, l’application de l’expression de relation spatiale entre la couche cible et la couche source met à jour les noms des communes intersectées dans la couche de points (figure 5).

Figure 5: Ajout des noms de communes intersectées dans la couche de points.

3. Formulaire d’attributs pour ajouter automatiquement l’information d’une autre couche dans QGIS

Lors du dessin de nouveaux points, on peut ajouter automatiquement les valeurs attributaires d’une autre couche par relation spatiale. Comme pour la saisie automatique des coordonnées géographiques dans QGIS, le formulaire d’attributs dans la propriété de la couche garantit la génération automatique de valeurs attributaires. Ainsi, la figure 6 montre le formatage du champ « nom_commune » de la couche de points de notre exemple.

Puis, la valeur par défaut en bas à droite de la figure correspond à l’expression utilisée dans la section 3. Il est important d’appliquer la valeur par défaut sur la mise à jour effective lors de l’ajout ou de la modification des géométries des objets géographiques.

Figure 6: Ajout automatique de la valeur attributaire d’une autre couche avec le formulaire d’attributs de QGIS.

Enfin, la figure 7 ci-dessous montre la saisie automatique du nom de la commune intersectée par le point dessiné.

Figure 7: Saisie automatique du nom de la commune intersectée par le point dessiné.

4. Code PyQGIS pour ajouter les attributs d’une couche source dans une couche cible

Dans QGIS, on peut également utiliser la console Python pour ajouter l’attribut d’une autre couche basée sur une jointure spatiale (intersection). Voici le code PyQGIS commenté:

# Chargement des objets des couches source et cible 
couche_cible = QgsProject.instance().mapLayersByName('couche_point')[0]
couche_source = QgsProject.instance().mapLayersByName('commune')[0]

# Création d'un index spatial pour la couche source
index = QgsSpatialIndex(couche_source.getFeatures())

# Edition de la couche cible
with edit(couche_cible):
    # Boucle sur les entités de la couche cible
    for entite_cible in couche_cible.getFeatures():
        # Entités de la couche source qui intersectent l'entité cible
        entite_intersecte = index.intersects(entite_cible.geometry().boundingBox())
        for entite_intersecte_id in entite_intersecte:
            entite_source = couche_source.getFeature(entite_intersecte_id)
            # Vérification de l'intersection entre les entités de chaque couche
            if entite_cible.geometry().intersects(entite_source.geometry()):
                # Ajout des attributs de la couche source à la couche cible
                entite_cible['nom_commune'] = entite_source['nom']
                couche_cible.updateFeature(entite_cible)

Conclusion

Dans ce tutoriel QGIS, on a comparé deux couches SIG afin d’extraire par expression la valeur attributaire de la couche source. L’expression QGIS est basée sur une fonction de relation spatiale comme l’intersection. Les outils intégrés dans QGIS sont suffisants pour la majorité des utilisations, tandis que PyQGIS offre des possibilités d’automatisation plus poussées.

Florian Delahaye: Passionné de Géomatique
Related Post