Programmation en C

Les principaux aspects de la programmation en C sont abordés dans le manuel du programmeur GRASS 5.0 (PDF, 2.3MB). Cette section vous donnera juste un aperçu de la façon dont les modèles GRASS sont structurés. En général, il est bon de regarder quelques uns des 350 modules existants afin de d'apprendre (et de comprendre) comment ils fonctionnent (vous pouvez parcourir le code source par l'intémédiaire de notre interface CVS web). Seul un SIG en code ouvert tel que GRASS permet d'examiner ainsi les « entrailles » d'un SIG. La structure générale des modules esttoujours la même, chaque module est stocké dans un répertoire à l'intérieur du code source.

Le code source actuel est structuré de la façon suivante :[1]

Bibliothèque du SIG GRASS (fonctions les plus pertinentes uniquement) :

html/

descriptions des modules

src/CMD/

scripts internes pour la compilation

src/include/

en-têtes de fichier

src/libes/

routines des bibliothèques de fonctions SIG

src/display/devices/

pilote d'affichage

src/fonts/

polices de caractère

src/front.end/

routines internes pour le mode interactif de modules

Modules (arborescence standard):

src/display/

modules pour l'affichage de couches de données dans le moniteur GRASS

src/general/

modules de gestion de fichier

src/imagery/

modules de traitement d'image

src/mapdev/

modules vecteurs

src/misc/

modules divers

src/paint/

pilote paint (PPM)

src/ps.map/

pilote postscript

src/raster/

modules raster

src/scripts/

scripts

src/sites/

modules sites

src/tcltkgrass/

Interface Graphique (GUI) Tcl/Tk

Autres modules:

src.contrib/

contributions de diverses institutions (bien que la majorité d'entre elles soient aussi dans l'arborescence principale)

src.garden/

modules liées à des modèles de simulation et à diverses interfaces

Les modules de GRASS existants sont construits à partir de la « bibliothèque de programmation GRASS » qui offre une multitude fonctions SIG. Elle est structurée comme suit (les crochets encadrent les traditionnels préfixes de noms de fonction pour chacune des routines considérée)

Bibliothèque SIG :

routines de base de données (gestion de fichiers GRASS), gestion de la mémoire, parser (analyse de chaînes), projection, etc.database routines (GRASS file management), memory management, parser (string analysis), projections, etc. [G_]

Bibliothèque vectorielle :

gestion des objets vectoriels (surfaciques, linéaires et sites)[Vect_, V2_, dig_]

Bibliothèque raster :

gestion de données raster [R_]

Bibliothèque de données sites :

gestion de données sites [G_sites_]

Bibliothèque d'affichage :

sortie graphique du moniteur [D_]

Bibliothèque des pilotes :

pilote d'impression

Bibliothèque de données images :

gestion de fonction de traitement d'image [I_]

Bibliothèque de segmentation :

gestion de donnnées segmentées [segment_] [segment_]

Bibliothèque vask :

contrôle des touches de curseur etc [V_]

Bibliothèque rowio :

pour l'analyse parallèle des lignes d'une couche raster [rowio_]

Certaines des routines proposées sont très solides. Par exemple, elles permettent de calculer des distances géodésiques à partir de coordonnées données, d'autres permettent de faire des requètes sur des surfaces vectorielles (par exemple : est-ce qu'un point se trouve à l'intérieur d'un polygone?).

Les modules sont composés de programmes C (*.c), d'en-têtes de fichier (*.h) et d'un Gmakefile. GRASS possède sa propre routine « make » : gmake5. Le fichier Gmakefile contient des instructions à propos des fichiers à compiler et aux bibliothèques de fonctions à utiliser(bibliothèques GRASS et UNIX). Il a une composition spécifique qui doit être respectée. Un simple exemple (important : les indentations doivent être faites avec tabulation, et non avec espace!) vous montrera la structure typique. [2]

La ligne "\$(HOME)/\$(PGM)..." et la suivante contiennent les instructions du compilateur, au dessus de cette section on trouve les assignations de variables. Les variables qui ne sont pas fixées à cet endroit là sont paramétrées automatiquement dans

grass5/src/CMD/head/head.$ARCH

où $ARCH est le nom de l'architecture système. A partir de GRASS 5.0 cet en-tête de fichier est crée autometiquement en fonction de la plate-forme par le script "configure", qui doit être exécuté avant la première compilation. La variable $(HOME) indique où le fichier binaire (c'est-à-dire le module) sera copié : dans cet exemple, c'est le chemin standard pour les modules qui offre une interface en ligne de commande (sans limitation à la seule utilisation interactive) : grass5/etc/bin/cmd/. grass5/etc/bin/cmd/.

Le programme C lui-même doit être divisé en (sous-) fonctionnalités en différents fichiers qui doivent être listés respectivement comme liste d'objets dans le Gmakefile. Pour plus de détails veuillez vous référer au manuel du Programmeur GRASS étant donné que ce tutoriel ne peut contenir une introduction complète à la programmation en C. Les commandes de bibliothèques de fonctions GRASS peuvent être utilisées directement dans le code source. La récupération interactive de paramètres est possible grâce à la programmation de paramètres propre à GRASS. Voici un court exemple pour un module raster..

Le calcul se fait en fonction des lignes et des colonnes (voir la boucle « for »). Comme indiqué plus haut, il est vivement conseillé de diviser le module complet en fichiers distincts, organisés de façon thématique de façon à faciliter la maintenance du programme.

Notes

[1]

Cela changera dans les nouvelles versions de GRASS, avec plus de routines courantes dans les bibliothèques et l'intégration d'un tout nouveau moteur vectoriel (voir manuel du programmeur GRASS 5.7).

[2]

L'exemple de ce code de ce chapitre appartient à M. Neteler, H. Mitasova, 2002. Open Source GIS: A GRASS GIS Approach.