retour aux mémos     retour au modèle     back to SimMasto home page   retour à la page d'accueil

Transformation des tables d'attributs d'un shapefile


Objectif : Les données d'un fichier .shp ne sont pas toujours en adéquation avec les besoins de la simula-tion. On peut avoir besoin d'ajouter des attributs à une table, de changer le champ de référence, de supprimer des éléments qui ne nous intéressent pas ou de reclasser les catégories dans une au-tre classification, etc. Tous ces besoins peuvent êtres résolus par l'utilisation d'une jointure.
Entrée : Un fichier shapefile
Sortie : Un fichier shapefile modifié à partir de changements effectués sur le fichier dbf associé
Outils: QGIS, un tableur prenant en charge les fichier dbf.

Exemple d'application

A.-       1)  Modifier des attributs et éliminer certains éléments

Lorsque l'on dispose d'un fichier shapefile, il est parfois nécessaire d'effectuer des modifications pour le rendre plus explicite et pour éliminer des éléments superflus.

Par exemple après la numérisation d'une image satellitaire avec GRASS, le fichier shapefile créé contient parfois des polygones parasites de un ou deux pixels et  la table des attributs du fichier shapefile  possède une structure (fichier .dbf) ressemblant à celle ci :

Chaque ligne représente un polygone, les types de terrain sont alors référencés par la valeur d'une composante de couleur, enregistrée dans le champ « value » avec une valeur entre 0 et 255.

Cette  distinction, bien que unique pour chaque type de terrain n'est pas explicite, il faut utiliser une table de correspondance pour retrouver la nature du terrain.

De plus si des erreurs se sont introduites lors de l'enregistrement de l'image, lors d'un changement de repère ou lors de la conversion en vecteur par exemple, on observe des catégories supplémentaires (qui ont une couleur particulière mais qui ne sont associées qu'à un seul pixel).

L'utilisation de la jointure permet de créer une nouvelle colonne d'attributs en fonction d'une autre existante et à modifier.

On peut ainsi faire correspondre la valeur contenue dans la colonne « value » à un type de terrain défini explicitement et supprimer les éléments ayant une valeur ne correspondant à aucun terrain.

B.-       2) Regroupement par catégories

Si dans un shapefile, les polygones ont un attribut « zone » pouvant prendre de nombreuses valeurs « prairie, friche, forêt, blé, orge, colza,  jachère... », on peut vouloir les trier et les regrouper en un nombre plus restreint de catégories (reclassement) pour simplifier la mise en place de la simulation (libre, culture... ).

Il est bien sur possible dans le simulateur de récupérer les attributs zones et de faire correspondre chaque zone à une catégorie au moment de leur création, mais à chaque démarrage du simulateur, il va falloir effectuer plusieurs tests sur chaque zone, ce qui peut se révéler une solution lourde et lente. Pour éviter d'avoir à effectuer ces tests, nous pouvons modifier le .dbf en ajoutant un nouvel attribut « Catégorie » à chaque zone.

G        Attention: nous avons  appelé l'attribut « Categorie » et non pas « Catégorie » car il peut apparaître des problèmes si vous décidez d'utiliser votre .shp sous différentes plateformes (par exemple si vous créez un attribut nommé « Catégories » sous linux, si vous essayer de le lire sous windows, celui ci aura été transformé en «Catégorie »).

G        De manière générale il est déconseillé d'utiliser des accents ou des caractères spéciaux.

Pour modifier les attributs d'un shapefile, il faut modifier le fichier .dbf qui lui est associé. Comme le fichier .dbf sert de base de données contenant les informations propres à chaque élément géométrique du shapefile, on peut directement le modifier si on se contente de rajouter des champs ou d'éditer le contenu de certains champs (sauf celui qui sert d'index).

En revanche si l'on veut ajouter ou supprimer des enregistrements, il faudra recréer un shapefile pour conserver la relation entre le nombre de formes et le nombre d'enregistrements du  fichier .dbf.

De manière générale, la modification d'un shapefile est plus rapide en utilisant une jointure, mais on peut également modifier un .dbf en l'éditant directement avec un tableur. Cette dernière solution est à éviter, mais il peut être utile de la connaître si vous n'avez à modifier que quelques lignes.

Solution avec un tableur

G        Si vous n'arrivez pas à ouvrir un fichier .dbf avec OpenOffice, assurez vous que votre version est à jour et contient OpenOffice « bases de données ».

         Vous pouvez ouvrir le fichier .dbf associé à un shapefile  avec un tableur comme  OpenOffice ou Excel.

         Une fois le .dbf ouvert avec le tableur, les attributs doivent apparaître en ligne.

G        Chaque ligne représente un élément. Il y a normalement une colonne d'identifiant (qui sert à faire correspondre  le fichier .dbf avec les autres fichiers du shapefile) et des colonnes d'attributs.

         Pour ajouter un champ d'attributs  il suffit de rajouter une colonne.

         Si vous voulez attribuer les colonnes en fonctions d'un autres attributs, vous pouvez effectuer un tri de la manière suivante (les noms des options correspondent au tableur OpenOffice): dans le menu « Données », sélectionnez « trier ». dans la fenêtre qui apparaît, vous pouvez choisir le champ cible et l'ordre (croissant ou décroissant)

G        Une fois le tri effectué, les tuples (lignes d'attributs) sont regroupés selon la valeur de l'attribut cible. Il est alors possible de faire correspondre une valeur du nouvel attribut à toutes les lignes ayant la même valeur de l'attribut ayant servit pour le tri.

G        Pour récupérer l'ordre de départ, on peut ré effectuer un tri en ordre croissant sur la colonne de l'index.

G        Attention: Il est important de penser à fermer le tableur après l'édition d'une table, sinon les  autres programmes (dont QGIS) pourront ne pas y avoir accès. Exel par exemple verrouille les feuilles de calcules ouvertes et bloque leur accès à d'autres programmes.

Solution avec une jointure

Si le fichier est important, il est plus simple d'utiliser une jointure. Le principe de la jointure est de créer une table par fusion de deux tables indépendantes en fonction d'un attribut commun. QGIS permet d'effectuer simplement des jointures et de recréer des fichiers shapefile indépendants résultants de la jointure.

QGIS possède deux extensions utiles pour les manipulations des tables d'attributs, et dont nous pouvons nous servir pour effectuer la jointure.

G        Le plugin « Table Manager » n'est pas directement utile pour la jointure, mais permet d'éditer la structure d'une table en ajoutant ou en supprimant des champs. Il peut être utile de modifier une table avant ou après jointure (pour supprimer les champs en double par exemple).

G        Si vous avez installé le plugin FTOOLS, celui ci contient des fonctions permettant la gestion des attributs d'une table  (menu tools => Data Management tools).

Avant de faire la jointure, il faut créer une table de correspondance. C'est à dire qu'elle doit posséder un attribut qui possède des valeurs communes avec un autre attribut du fichier .dbf cible. QGIS permet de prendre comme table de correspondance la table d'attribut d'un autre shapefile, ou d'utiliser une table seule. Nous allons utiliser la deuxième solution qui correspond mieux  à notre besoin.

         La façon la plus simple de faire est d'ouvrir un tableur, de créer les différentes champs et de renseigner les éléments de jointure, puis d'enregistrer le fichier au format .dbf 

G        des erreurs peuvent s'afficher lors de l'enregistrement mais le fichier .dbf est créé.

G        Votre table de correspondance doit posséder un attribut en commun avec votre table de départ, cet attribut va être la clé de la jointure. Dans notre exemple cet attribut sera « zone ».

Table 1: exemple d'une table .dbf (on veut associer une catégorie en fonction de la zone):

Table 2: exemple de  table de jointure:

L'attribut utile à la jointure (ici ‘zone’) est utilisé en clé primaire, on  associe à chaque valeur une catégorie. (ce tableau est un copié-collé  du contenu du .dbf créé avec un tableur). Une fois que l'on a défini la table contenant les attributs que l'on veut rajouter, on peut procéder à la jointure grâce à FTOOLS.

         Dans le Menu Tools, sélectionnez « Data Management Tools » puis « join attributes »

         Dans le champ « Target vector Layer », vous devez sélectionner le shapefile dont vous voulez récupérer les données, et indiquer  dans le champ « target join field » l'attribut selon lequel la jointure doit s'effectuer (ici « zone »).

         Dans la partie « join data », vous pouvez utiliser un des shapefiles chargés (présent dans le projet), ou utiliser seulement un fichier .dbf en sélectionnant « join dbf  table » et en indiquant le chemin de la table de jointure que vous avez créé.

G        Vous devez également préciser le champs de la table qui doit correspondre au premier (il est souvent plus pratique de leur donner le même nom). Dans notre exemple, on va donc faire la correspondance entre les champs « zone » de notre SIG avec le champ « zone » du fichier .dbf contenant les correspondances.

         Il faut ensuite indiquer l'emplacement du shapefile dans le champ « output shapefile » qui sera créé avec la concaténation des deux tables d'attributs et préciser dans la partie «output table» que l'on veut conserver (ou non) les enregistrements de la table de départ qui n'ont pas de correspondance dans la table de jointure.

Table 3: résultat de la jointure

On a maintenant défini une catégorie pour chaque élément du fichier dbf.


Mémo 11 - Auteur Q.Baduel, MAJ  03.01.13 par jlefur

retour aux mémos     retour au modèle     back to SimMasto home page   retour à la page d'accueil