Vous êtes sur la page 1sur 511

Les principes des systmes dinformation

gographique
Principes, algorithmes et architecture du systme
Savane
Marc Souris

Sommaire

Premire partie : introduction et prsentation gnrale du systme


SAVANE
0. Introduction ..1
1. Prsentation gnrale des systmes d'information gographique .. 9
1.1. L'apport de l'informatique pour la gographie ou la cartographie
1.2. Les SIG comme synthse de ces domaines : historique et volution
1.2.1. Les dbuts : les annes 60-70
1.2.2. La consolidation : les annes 80
1.2.3. La diffusion : les annes 90
1.2.4. Les volutions actuelles
1.3. Les SIG : objectifs gnraux
1.4. Conclusion

2. Prsentation du systme SAVANE.... 21


2.1. Le systme SAVANE : principes gnraux
2.1.1. Les concepts gnraux de SAVANE
2.1.2. Larchitecture gnrale de SAVANE
2.1.3. Administrer une base SAVANE
2.2. Prsentation des diffrents modules
2.2.1. SAVATECA : administration des bases de donnes
2.2.1.1. Principes gnraux dadministration
2.2.1.2. Configuration du systme
2.2.1.3. Organisation dune base de donnes SAVANE : principe gnraux
2.2.1.4. Cration dune base de donnes
2.2.1.5. Gestion du schma
2.2.1.6. Gestion des vues externes
2.2.1.7. Intgration dobjets
2.2.1.8. Gestion des utilisateurs

2.2.2. SAVAMER : gorfrencement dimages et constitution de mosaques


2.2.2.1. Le gorfrencement
2.2.2.2. Le r-chantillonage

II Sommaire
2.2.2.3. Le mosaquage et lintgration

2.2.3. SAVEDIT : saisie vectorielle sur cran avec gestion des contraintes dintgrit
2.2.3.1. Principes gnraux
2.2.3.1. Format des documents SAVEDIT
2.2.3.1. Principes gnraux
2.2.3.1. Principes gnraux

2.2.4. SAVANE : exploitation des bases de donnes et cartographie


2.2.4.1. Cartes, cadres et requtes
2.2.4.1.1. La classe CCarte
2.2.4.1.2. La classe CCadre
2.2.4.2. Principales oprations de manipulation de donnes
2.2.4.3. Masques et distances
2.2.4.4. Macro-commandes et mthodes
2.2.4.5. Edition cartographique et impression
2.2.4.6. Utilisateurs et partage des bases de donnes
2.2.4.7. Raster et vecteur

2.2.5. SAVATLAS : consultation de cartes et de donnes


2.2.6. SAVLIBRARY : librairie de dveloppement VC++
2.2.7. SAVSERVEUR : serveur de requtes via Internet
2.2.7.1. Mthodes client/serveur via Internet
2.2.7.2. Larchitecture du serveur
2.2.7.3. Larchitecture dun client

2.3. La constitution et lexploitation dune base de donnes avec SAVANE


2.3.1. Gnralit sur la constitution d'une base de donnes gographiques
2.3.1.1 Mthodes de mise en place, d'administration, et d'exploitation
2.3.1.2 Difficults

2.3.2. De la cration d'une base de donnes son exploitation


2.3.2.1 La cration d'une base de donnes : schma et mthodes
2.3.2.2 L'intgration graphique
2.3.2.3 Modifications et unions graphiques, contraintes d'intgrits
2.3.2.4 L'intgration descriptive
2.3.2.5 Vues externes et droits d'accs
2.3.2.6 Cration et gestion de mthodes

Deuxime partie : Modliser et grer linformation gographique


3. Modliser le monde rel ... 59
3.1. Prambule
3.1.1. Quelques exemples
3.1.2. Prcision et description
3.2. Pourquoi et comment modliser le monde rel
3.2.1. Comment apprhender et reprsenter la ralit avec un ordinateur
3.2.2. Ralit et connaissance
3.2.3. Modliser la connaissance
3.2.4. Collection dobjet et gestion
3.3. La schmatisation du monde rel : de la ralit la gographie
3.3.1. La localisation comme attribut : lobjet gographique
3.4. La schmatisation de la localisation : de la gographie la gomtrie

Sommaire III
3.4.1. Gographie et cartographie : une union agite
3.4.2. Cartes de localisation et cartes thmatiques
3.4.3. La reprsentation gomtrique de la localisation gographique
3.4.4. Dcrire la localisation
3.4.5. Les limites du modle gomtrique
3.5. De la gomtrie linformatique : la reprsentation informatique de la localisation
3.5.1. La reprsentation en maille
3.5.2. La reprsentation vectorielle
3.5.3. Les structures de reprsentation de linformation localise
3.5.4. Les mthodes de compactage
3.6. Les sources de linformation localise : nature et validit
3.6.1. Les moyens dacquisition des donnes localises
3.6.2. La validit de linformation
3.7. Structure gomtriques des objets dans le systme SAVANE
3.7.1. Le modle gomtrique
3.7.2. La classe CArc
3.7.3. Les changements de reprsentation interne
3.8. Conclusion

4. Mesurer la localisation . 95
4.1. Introduction
4.2. Formes et mesure de la Terre : godsie et gravimtrie
4.2.1. Mesurer la forme de la Terre : la godsie
4.2.2. Lapproche gomtrique
4.2.3. Lapproche gophysique
4.2.3.1. Gravit et gode.
4.2.3.2. De nouveaux ellipsodes

4.2.4. Nouveaux instruments, nouvelles mesures, nouvelles prcisions


4.2.4.1. Le systme GPS
4.2.4.2 Les changements de datum

4.2.5. Prcision des mesures


4.3. Reprsenter l'ellipsode sur une surface plane : cartographie et projections
4.3.1. Les dformations
4.3.2. Les surfaces dveloppables
4.3.3. Coordonnes et espace de projection
4.3.4. chelles et cartes
4.3.5. chelle, projection, prcision
4.4. Exemples de projections
4.4.1. La projection Mercator
4.4.2. La projection UTM (Universal Transverse Mercator)
4.4.3. La projection conique de Lambert
4.5. SAVANE, datum et projections
4.5.1. Provenance des donnes en entre
4.5.2. Fonctionnement de SAVEDIT pour les projections et le datum
4.5.3. Fonctionnement de SAVANE pour les projections dans un cadre
4.6. Conclusion

IV Sommaire

5. De l'objet la collection d'objet : les SGBD .... 129


5.1 Introduction
5.2 Notions classiques sur les SGDB
5.2.1. Les problmes soulevs par l'utilisation de fichiers traditionnels :
dpendance, redondance, intgrit, scurit
5.2.2. Lobjectif des SGBD
5.2.3. La modlisation de la ralit dans les SGBD
5.2.3.1. Les diffrents modles de donnes
5.2.3.2. Les niveaux de description

5.2.4. Les modles hirarchique et rseau


5.2.5. Le modle relationnel
5.2.5.1. Les principes du relationnel
5.2.5.2. La notion de cl et la thorie de la normalisation
5.2.5.3. Lalgbre relationnelle
5.2.5.4. Puissance et limite du relationnel

5.2.6. Le modle objet


5.2.6.1. Objets, mthodes, encapsulation et hritage
5.2.6.2. Les bases de donnes objets

5.3. SGBDR et objets gographiques : lextension du modle relationnel


5.3.1 Objectifs
5.3.2 Lextension du modle relationnel
5.3.2.1. Les principes de lextension du modle
5.3.2.2. Relations localises et notion de cl gographique

5.3.3. Les extensions de lalgbre relationnelle


5.3.3.1. La restriction spatiale
5.3.3.2. La jointure spatiale
5.3.3.3. La projection spatiale
5.3.3.4. Masques et semi-jointures gomtriques

5.3.4. Objets spatiaux et oprations relationnelles classiques


5.4. Structuration et indexation de lattribut de localisation
5.4.1. Les mthodes classiques dindexation
5.4.2. Lindexation multidimensionnelle
5.5. SAVANE : mise en uvre du relationnel tendu
5.5.1. Schma : relations et attributs
5.5.2. Structuration des collections dobjet
5.5.2.1. Architecture gnrale et organisation des bases de donnes
5.5.2.2. Indexation gographique et structure des fichiers
5.5.2.2.1. Le type non localis
5.5.2.2.2. Le type point
5.5.2.2.3. Le type ligne
5.5.2.2.4. Le type zone
5.5.2.2.5. Le type mosaque

5.5.3. Intgration dobjets et de valeurs dattributs


5.5.3.1. La constitution dune relation
5.5.3.2. Codage des valeurs dattributs descriptifs
5.5.3.3. Lintgration graphique
5.5.3.4. Lintgration descriptive

Sommaire V
5.5.3.5. La classe CIndexAttribut

5.5.4. SAVANE : requtes et tats temporaires


5.5.4.1. Principes dune requte dans SAVANE
5.5.4.2. Dfinition et gestion des macro-commandes

5.5.5. La classe CLecture


5.5.6. SAVANE : les structures internes
5.5.6.1. Vecteur et raster
5.5.6.2. Un algorithme de rasterisation

5.5.7.Les masques
5.5.7.1. La structure dun masque
5.5.7.2. Cration dun masque : zone tampon ou dfinition sur cran
5.5.7.3. Lalgbre des masques

5.5.8. La ralisation des opration relationnelles classiques


5.5.8.1. La restriction
5.5.8.2. La jointure

5.5.9. La ralisation des opration relationnelles tendues


5.5.9.1. La restriction spatiale
5.5.9.1.1. La restriction spatiale par fentre dtude
5.5.9.1.2. La restriction spatiale par domaine
5.5.9.2. La jointure spatiale
5.5.9.3. Les semi-jointures spatiales

5.5.10. La connexion dautres systmes de gestion de base de donnes


5.6. Conclusion

6. Gorfrencement et intgration dimages .. 195


6.1. Introduction
6.2. Dfinition d'une classe d'objet pour les donnes venant dimages : le pixel
6.2.1. Dfinition de lobjet
6.2.2. Gestion des collections de pixel
6.3. Gorfrencement des images et cration des objets
6.3.1. Redressement dimage
6.3.2. Le choix des points dappui
6.3.3. Le r-chantillonnage
6.3.4. Le mosaquage et lintgration dans une relation
6.3.4.1. Les mthodes de correction gomtriques pour les mosaques
6.3.4.2. Les mthodes de correction descriptives pour les mosaques
6.3.4.3. Lassemblage des images

6.3.5. Un cas particulier : les satellites dobservation de la Terre


6.4. SAVANE et la gestion des mosaques
6.4.1. Structure des relations de type mosaque
6.4.2.Oprations relationnelles
6.4.3. Cration de relations de type mosaque et oprations de changement de type
6.4.4. Utilisation des mosaques dans le cadre objet
6.4.4.1. La classe Cmosaque
6.4.4.2. Quelques classes drives

6.5. Le module SAVAMER


6.5.1. Prsentation gnrale

VI Sommaire
6.5.2. La prise de points dappui
6.5.2.1. Principes gnraux et interface graphique
6.5.2.2. La saisie manuelle des points dappui
6.5.2.3. La saisie semi-automatique et automatique

6.5.3. Le redressement et le r-chantillonnage


6.5.3.1. Le redressement
6.5.3.2. Le r-chantillonnage
6.5.3.3. Un algorithme de triangulation
6.5.3.4. Le redressement descriptif des dynamiques

6.5.4. Le mosaquage et lintgration dans une mosaque


6.6. Conclusion

7. Les contraintes d'intgrits spatiales et la saisie graphique .. 227


7.0. Introduction
7.1. La qualit dans les bases de donnes gographiques
7.1.1. Le problme gnral de la qualit dans les bases de donnes gographiques
7.1.2. La cohrence spatiale
7.1.3. Les contraintes dintgrit spatiales
7.2. Les contraintes dintgrit pour les bases de donnes
7.2.1. Le cadre relationnel
7.2.2. Les contraintes dintgrit
7.2.3. Les contraintes dintgrit pour les donnes localises
7.3. Les contraintes dintgrit spatiale
7.3.1. Une typologie des contraintes dintgrit spatiale
7.3.2. Les contraintes gomtriques
7.3.3. Les contraintes topologiques de type
7.3.3.1. Fermeture et centrode
7.3.3.2. Connexit
7.3.3.3 Surface et primtre

7.3.4. Les contraintes relationnelles


7.3.4.1. Contrainte d'unicit de cl
7.3.4.2. Contrainte d'appartenance un domaine
7.3.4.3. Contraintes descriptives de voisinage
7.3.4.4. Contraintes topologiques
7.3.4.5. Contraintes mtriques

7.3.5. Les contraintes de jointure


7.3.5.1. Les relations spatiales entre objets gographiques
7.3.5.2. Les contraintes topologiques
7.3.5.3. Les contraintes descriptives

7.4. Modles gomtriques et mise en uvre des contraintes dintgrit spatiale


7.4.1. Les diffrentes mthodes de stockage
7.4.1.1. Les modles spaghetti
7.4.1.2. Les modles topologiques

7.4.2. La vrification de la cohrence spatiale


7.5. SAVANE, saisie graphique et contraintes d'intgrit spatiale
7.5.1. Prsentation du module SAVEDIT
7.5.1.1. Les principes de la saisie graphique avec SAVEDIT
7.5.1.2. Saisie et indexation gographique
7.5.1.3. La saisie de points
7.5.1.4. La saisie de lignes

Sommaire VII
7.5.1.5. La saisie de zones
7.5.1.6. Saisie, datum et projection gographique
7.5.1.7. Le format des documents SAVEDIT

7.5.2.Les contraintes sur les objets gomtriques


7.5.2.1. La classe CArc
7.5.2.2. Nettoyage des arcs
7.5.2.3. Simplicit
7.5.2.4. Extra-simplicit
7.5.2.5. Fusion darc
7.5.2.6. Suppression darcs en double
7.5.2.7. Union darcs

7.5.3.Les contraintes sur les objets gographiques


7.5.2.1. Le nettoyage des zones
7.5.3.2. La fermeture de zones
7.5.3.3. Connexit et fermeture des arcs
7.5.3.4. Unicit de cl (zones scantes, zones incluses)
7.5.3.5. Centrode de zones
7.5.3.6. Valeurs adjacentes (courbes de niveaux)
7.5.3.7. Valeurs adjacentes (points cots)

7.5.4. Quelques procdures automatiques : algorithmes


7.5.4.1. La dtection automatique des contours de zone
7.5.4.2. La saisie semi-automatique darc par suivi de contour
7.5.4.3. Le calcul automatique de centrode de zones
7.5.4.4. La cration de taches fermes partir darcs frontires

7.6. Conclusion

Troisime partie : analyse spatiale et reprsentation cartographique


8. Analyser : calculs et analyse spatiale ... 267
8.1. Introduction
8.2. Rappels sur lanalyse spatiale
8.2.1. Structures spatiales et objets gographiques : gnralisation et agrgation
8.2.2. Distribution spatiale dun phnomne
8.2.3. Homognit spatiale, relations de voisinage, regroupement
8.3. SAVANE : exploration des donnes et statistique
8.3.1. Lexploration individuelle
8.3.2. Lexploration statistique
8.4. SAVANE et les mthodes sur les attributs descriptifs
8.4.1. Le principe de la cration de nouveaux attributs descriptifs
8.4.2. Calcul numrique et logique
8.4.3. Classifications et mthodes de discrtisation
8.4.4. Agrgations descriptives
8.4.5. Comparaison dattributs
8.4.6. Combinaison dattributs
8.4.7. Ordre
8.5. Lutilisation de la localisation pour la cration de nouveaux attributs descriptifs
8.5.1. Surface, primtre, coordonnes
8.5.2. Orientation

VIII Sommaire
8.5.3. Distance un point, une relation, un masque
8.5.4. Go-agrgations
8.5.4.1. La go-agrgation gomtrique par distance
8.5.4.2. Go-agrgation par surface dun masque
8.5.4.3. Go-agrgation par valeur pondre par la surface

8.5.5. Appartenance
8.5.6. Go-agrgation sur les pixels : le r-chantillonage
8.5.7. Oprations sur les modles numriques de terrain : orientation, pente,
coulement
8.5.7.1. Pente et orientation
8.5.7.2. Dautres indices en gomorphologie et hydrologie

8.6. La cration de relations temporaires


8.6.1. Le principe de la cration de nouvelles relations
8.6.2. La duplication
8.6.3. La dfinition directe sur cran ou par masque
8.6.4. La cration de mailles
8.6.5. La cration par changement de type dobjet
8.7. Les oprations de changement de type dobjet
8.7.1. Vers le pixel : interpolation ou rasterisation
8.7.1.1. Mosaque et type Raster
8.7.1.2. Mthodes dinterpolation
8.7.1.2.1. La mthode barycentrique
8.7.1.2.2. Barycentre sur tous les points
8.7.1.2.3. Interpolation sous contrainte
8.7.1.3. Zone vers pixel : rasterisation

8.7.2. Vers la zone : vectorisation ou tesslation


8.7.2.1. Un algorithme de vectorisation
8.7.2.2. Un algorithme de tesslation
8.7.2.3. De la ligne la zone : crer la topologie
8.7.2.4. De la zone la zone : regrouper, roder, dilater

8.7.3. Vers la ligne


8.7.3.1. Squelettisation de zones
8.7.3.2. Vectorisation et courbes disovaleurs

8.7.4. Vers le point


8.7.4.1. Centre dun semis de points
8.7.4.2. De la ligne aux points : lutilisation des nuds

8.8. Conclusion

9. Reprsenter ... 315


9.1. Les principes de la reprsentation cartographique
9.1.1. Le langage cartographique
9.1.2. Les variables visuelles
9.1.2.1. La forme
9.1.2.2. La taille
9.1.2.3. La couleur
9.1.2.4. La valeurs
9.1.2.5. Grain, trame, texture
9.1.2.6. Orientation

9.1.3. La reprsentation cartographique

Sommaire IX
9.1.4. Lgendes et habillage
9.2. La cartographique avec SAVANE : cartes et cadres
9.2.1. La carte
9.2.2. Les cadres
9.2.3. Couleurs et palettes
9.3. Lexplorateur cartographique
9.3.1. Principes de lexplorateur cartographique
9.3.2. Limplantation graphique ponctuelle
9.3.3. Limplantation graphique zonale
9.3.4. Limplantation graphique linaire
9.3.5. La reprsentation des images
9.3.6. Masques, fonds graphiques, documents digitaliss
9.3.7. Les procdures de trac
9.3.8. Les lgendes
9.4. La reprsentation en perspective
9.5. Louverture ou la sauvegarde dune carte dans SAVANE

10. Conclusion ....... 343


10.1. La construction du SIG SAVANE : synthse
10.2. Vers plus dintelligibilit pour les bases de donnes gographiques

Bibliographie gnrale ... 351


Annexe : exemples de classes et implmentation en C++ ... 361

A.1. Savateca
A.1.1. Les classes CAttribut et CRelation
A.1.2. La classe CBase
A.1.3. La classe CDico
A.1.4. La classe CFpacc8
A.1.5. La classe CIndexAttribut
A.1.6. La classe CIntegrationObjetsLocalises

A.2. Savane
A.2.1. La manipulation de la base de donnes dans un cadre
A.2.1.1. Les classes CRelation et CAttribut
A.2.1.2. Les classe CSchema
A.2.1.3. La classe CLecture
A.2.1.4. La classe CMacro
A.2.1.5. La classe CCalculateur

X Sommaire
A.2.1.6. La classe CBabel : interpolation
A.2.2. Algorithmique graphique
A.2.2.1. La classe CArc
A.2.2.2. Les classes CCellule et CYX
A.2.2.3. la classe CVectoriser
A.2.2.4. DilaterImage()
A.2.2.5. SegmentIntersection()
A.2.2.6. Les classes CZone et CTache
A.2.3. Fentre et projections
A.2.3.1. La classe CWind
A.2.3.2. La classe CProjection
A.2.3.3. La classe CMolodensky
A.2.4. Documents et cartographie
A.2.4.1. La classe CCarte
A.2.4.2. Les classes CODD
A.2.4.3. Les classes Cgroupe et CSelection
A.2.4.4. La classe CCadre
A.2.4.5. La classe CCartExplorateur
A.2.4.6. Les classes CDessin
A.2.4.7. La classe CLegende
A.2.4.8. La classe CPaletteSavane
A.2.4.9. La classe CPerspective
A.2.5. Exemples doprations dans un cadre
A.2.5.1. XQuestUnion()
A.2.5.2. XQuestJoinGeo()
A.2.5.3. XCrisCalcul()
A.2.5.4. XTri()

A.3. Savamer
A.3.1. La classe CAmers
A.3.2. La classe CSysteme1
A.3.3. La classe CTessel

A.4. Savedit
A.4.1. La classe CArc
A.4.2. La classe CSaveditDocument

Sommaire XI
Table des illustrations
fig. 2.1 : exemple de prise de points damers avec SAVAMER
fig. 2.2 : exemple de constitution de mosaque dimages go-rfrences
fig. 2.3 : la saisie sur cran avec le module SAVEDIT
fig. 2.4 : lcran principal de SAVANE avec une carte contenant un cadre
fig. 2.5 : une image satellite mise en perspective grce un modle numrique de terrain
fig. 2.6 : lcran principal dune application de type SavAtlas
fig. 4.1 : coordonnes godsiques, et projection dun point sur un ellipsode de rvolution
fig. 4.2 : un thodolite et son utilisation en godsie
fig. 4.3 : dformation du gode terrestre, lchelle 10000
fig. 5.1 : les diffrents niveaux de description
fig. 5.2 : jointure entre zones et points sur la qualification d(O1,O2)=0
fig. 5.3 : jointure entre zones sur la qualification d(O1,O2)=0
fig. 5.4 : hirarchie en feuilles et region quadtree associ
fig. 5.5 : dcoupage en k-d tree et arbre binaire associ
fig. 5.6 : le dialogue pour la gestion des relations
fig. 5.7 : le dialogue de cration dune relation
fig. 5.8 : le dialogue de gestion du schma des attributs dune relation
fig. 5.9 : le dialogue de cration dun attribut
fig. 5.10 : les dialogues de lintgration graphique
fig. 5.11 : les diffrents dialogues de lintgration descriptive
fig. 5.13 : structure de limage raster associe une relation zonale
fig. 5.14 : la cration dun masque partir des points dune relation et dune distance ces
points
Fig. 5.15 : un masque rsultat de la diffrence de deux masques
fig. 5.16 : dialogue de restriction par formule
fig. 5.17 : dialogue de restriction sur un attribut nominal
fig. 5.18 : une qui-jointure spatiale zone-zone
fig. 6.1. : le dialogue de cration dune relation mosaque
fig. 6.2. : le dialogue de cration dun attribut dune relation mosaque
fig. 6.3 : structure interne des relations mosaques
fig. 6.4 : un modle numrique de terrain
fig. 6.5 : linterface graphique du module SAVAMER
fig. 6.6 : exemple de prise de points damers dans une zone commune deux images
fig. 6.7 : le dialogue de redressement de SAVAMER
fig. 6.8 : triangulation obtenue partir des points dappui
fig. 6.9 : le dialogue dintgration dune image dans une mosaque
fig. 6.10 : le choix des pixels intgrer : mthode par polynme
fig. 6.11 : exemple de constitution de mosaque dimages gorfrences
fig. 7.1 : Simplicit des arcs
fig. 7.2 : Extra-simplicit des arcs
fig. 7.3 : Fermeture dun ensemble darcs
fig. 7.4 : connexit dun ensemble darcs
fig. 7.5 : test de simplicit sur un arc
fig. 7.6 : test de fermeture dune zone

XII Sommaire
fig. 7.7 : visualisation de la fermeture par remplissage en couleur
fig. 8.1 : interrogation sur cran des objets prsents dans le cadre gographique
fig. 8.2 : statistiques univaries sur un attribut dune collection dobjets
fig. 8.3 : exemple de reprsentation des carts par rapport une distribution donne
fig. 8.4 : le dialogue de cration dattribut par calcul numrique ou logique
fig. 8.5 : le dialogue de cration dun attribut dune mosaque
fig. 8.6 : le calcul dun indice de vgtation (NDVI) partir des canaux 3 et 4 dune image
Thematic Mapper
fig. 8.7 : le menu de classification de SAVANE
fig. 8.8 : dialogue de dfinition des classes par quantiles
fig. 8.9 : le choix de lopration dagrgation descriptive
fig. 8.10 : dessin et histogramme de la rpartition de lorientation de failles gologiques,
calcule partir de la gomtrie des objets
fig. 8.11 : exemple de go-agrgation de points dans des zones : calcul de laltitude moyenne
par lot partir de points cots (moyenne, d < 100 m)
fig. 8.12 : la page finale du dialogue de go-agrgation par distance
fig. 8.13 : exemple de go-agrgation de zone zone sans ambiguit : agrgation de la
population dlots aux quartiers (somme, d=0)
fig. 8.14 : un masque (cultures et paturages) et le pourcentage de la surface dans un
dcoupage (cantons)
fig. 8.15 : calcul de la moyenne dun indice radiomtrique (TM, canal 1) dans des zones
prdfinies (quartiers) par go-agrgation pondre par la surface
fig. 8.16 : pente et orientation calcules partir dun modle numrique de terrain
fig. 8.17 : Donnes ponctuelles, mailles, et go-agrgation dans les mailles
fig. 8.18 : le dialogue du choix de lopration dinterpolation
fig. 8.19 : rsultat de linterpolation barycentrique partir de courbes de niveau
fig. 8.20 :exemple dinterpolation barycentrique sur tous les points de rfrence (classe par
quantiles)
fig. 8.21 : vectorisation aprs classification dune mosaque (image TM)
fig. 8.22 : cration de zones partir de points : tesslation de Vorono
fig. 8.23 : deux dilatations partir des objets initiaux (5 m, 20 m). Lobjectif est ici de
diminuer ou de remplir lespace interstitiel en ville
fig. 8.24 : cration de zones par dilatation partir de lignes ou de points
fig. 8.25 : Courbes de niveau initiales, interpolation, puis cration de courbes de niveau par
vectorisation (en rouge, superposes aux courbes initiales en bleu)
fig. 8.26 : Cration de points centraux (en bleu) partir dun semis de points (provenant des
lots, en rouge) et de lappartenance au quartier (attribut cr par go-appartenance)
fig. 8.27 : occurrence des nuds dans un rseau de lignes de bus
fig. 9.1 : une carte ralise avec SAVANE
fig. 9.2 : la fentre principale de SAVANE est un diteur graphique
fig. 9.3 : dialogue de proprits dun cadre gographique
fig. 9.4 : dialogues de dfinition dune couleur et de choix dans une palette
fig. 9.5 : le dialogue principal de lexplorateur cartographique
fig. 9.6 : les trois possibilits de figurs en implantation ponctuelle : symboles, valeurs,
diagrammes sectoriels
fig. 9.7 : la reprsentation par symbole selon deux caractres
fig. 9.8 : la reprsentation par diagramme sectoriel suivant trois attributs descriptifs

Sommaire XIII
fig. 9.9 : les dialogues pour le trac en implantation zonale
fig. 9.10 : proprits de dessin pour les relations de type ligne
fig. 9.11 : reprsentation dun mnt par valeur ou par illumination
fig. 9.12 : diffrents types de lgendes gnres partir de lexplorateur cartographique et des
dialogues de proprits de lgende
fig. 9.13 : dialogues pour crer une vue en perspective
fig. 9.14 : reprsentation en perspective cavalire des valeurs daltitude dun mnt

Introduction

Les systmes d'information gographique (SIG) regroupent diffrentes mthodes


et techniques informatiques, permettant de modliser, de saisir sous forme
numrique, de stocker, de grer, de consulter, d'analyser, de reprsenter des objets
ou des collections d'objets gographiques, avec la particularit essentielle de prendre
en compte les caractristiques spatiales de ces objets au mme titre que les attributs
descriptifs qui y sont attachs. En fait, la dnomination SIG recouvre une grande
varit de ralisations logicielles construites suivant des choix techniques diffrents,
aux fonctionnalits et aux performances trs diverses.
Les systmes dinformation gographique ont la particularit de faire appel de
nombreux domaines scientifiques et techniques et de nombreuses mthodes, allant
de la godsie aux systmes de gestion de bases de donnes, en passant par le
traitement dimages, lalgorithmique gomtrique, la modlisation et linterpolation
gomtrique, la statistique, la cartographie automatique, lanalyse spatiale, etc.
Construire un systme dinformation gographique sans sloigner de la rigueur
scientifique est une tche complexe, aussi bien en terme de dfinition des concepts,
dorganisation
fonctionnelle,
darchitecture
logicielle,
dalgorithmique,
dergonomie.
Cet ouvrage prsente un travail de recherche et de dveloppement informatique
visant apporter une rponse concrte la question suivante : comment construire
un systme dinformation gographique complet et oprationnel, en suivant les
principes thoriques de la gestion de donnes et en les adaptant aux donnes
gographiques . Il a pour vocation de dcrire lensemble des connaissances
rsultant de cette exprience, ainsi que de prsenter les principes du systme
informatique oprationnel qui en rsulte, que lon trouvera dans le CDROM
accompagnant ce livre avec des exemples de base de donnes permettant de mettre
en uvre les exemples prsents dans louvrage.
Lobjet de cet ouvrage est donc de montrer sur un exemple concret limplication
des principes thoriques dans la ralisation pratique dun logiciel de type SIG. Il a
pour objectif de prsenter de faon complte et dtaille l'architecture et la

Introduction

ralisation dun systme d'information gographique oprationnel le systme


SAVANE - partir des nombreux concepts, techniques et algorithmes ncessaires
cette ralisation, den expliquer les choix informatiques et les contraintes qui en
dcoulent, en fonction des objectifs recherchs. Travail de recherche, de synthse,
darchitecture, dalgorithmique, et de dveloppement logiciel, laspect tudi rside
plus dans la synthse des principes thoriques, dans la recherche de larchitecture
dun ensemble complet et oprationnel - la fois systme de gestion de donnes et
programme dapplication - que dans ltude dun thme particulier de cet ensemble.
Cet ouvrage reprend la dmarche que nous avons suivie tout au long de ce
travail, savoir :
- exposer avec prcision tous les aspects concernant la dfinition et lutilisation
de linformation gographique ;
- exposer et dvelopper les principes de la gestion de donnes (modle
relationnel et objet) pour les tendre aux donnes localises ;
- dvelopper ou mettre en uvre les algorithmes ncessaires limplantation de
ces principes dans un systme dinformation ;
- construire un systme oprationnel, mettant en uvre les principes thoriques
et rpondant un cahier des charges fonctionnel couvrant lensemble des besoins
ncessaires lutilisation de ce systme dans le cadre de projets appliqus,
notamment en gographie et dans le cadre de la recherche pour le dveloppement.
En effet, et cest une autre caractristique de ce travail, il a t effectu dans un
cadre oprationnel et non dans un laboratoire de recherche classique. Le cadre
gnral est celui de lIRD (Institut de recherche pour le dveloppement,
anciennement ORSTOM), et le cadre oprationnel est celui de projets de recherche
ou de dveloppement dans divers pays ou rgions de la zone tropicale. Notre
objectif a donc toujours t double : concilier le dveloppement ou lapplication de
principes thoriques pour la gestion de donnes gographiques et la construction
dun logiciel oprationnel dans le cadre de projets de recherche ou de
dveloppement. Le cahier des charges fonctionnel a t fortement influenc par cet
impratif, le systme construire devant rpondre plusieurs objectifs parmi
lesquels on peut notamment souligner :
- la ncessit dune gestion efficace, et donc la construction dun moteur BD
relationnel interne tendu aux donnes localises (gestion intgre des attributs
descriptifs et de localisation), avec indexation primaire sur la localisation, en plus de
procdures de connexion des moteurs BD externes ;
- la ncessit dun systme pouvant grer un nombre important dobjets
(typiquement de plusieurs millions) sans dgradation de performance, dans un cadre
oprationnel ;

Introduction

- la ncessit de conserver la meilleure prcision possible en fonction de la


modlisation de la ralit en objets gographiques, ce qui implique un systme
double structure interne (vecteur, raster) permettant la gestion intgre de limagerie
arienne et satellitale et de la troisime dimension ;
- la ncessit dune gestion souple et de fonctionnalits volutives, et donc la
mise en uvre de lapproche objet avec la gestion de mthodes, aussi bien au niveau
du schma des donnes que du dveloppement et de limplmentation ;
- la ncessit dassurer la prennit des bases de donnes, et donc la rflexion sur
la documentation de linformation et la gestion des mta-donnes dans une approche
orient-objet ;
- la ncessit dune fiabilit complte au niveau de la saisie des donnes, et donc
la dfinition et la mise en uvre concrte de multiples contraintes dintgrit
spatiale lors de la saisie graphique ;
- une ergonomie permettant lapproche exploratoire et empirique multiutilisateur, et donc la gestion dtats temporaires par utilisateur sans modification de
la base de donnes ;
- la ncessit de fonctionnalits intgres permettant lanalyse, et donc la
dfinition et la mise en uvre doprations propres aux donnes gographiques :
analyse spatiale, statistique, gostatistique ;
- des fonctionnalits de dessin et de cartographie automatique permettant
daboutir des produits ddition cartographique professionnels.
Nous allons dans cet ouvrage reprendre lensemble des travaux effectus, en
dcrivant chaque aspect ncessaire la construction du systme et en expliquant les
choix effectus. Nous rappellerons les principes de base, nous dvelopperons
certains domaines lorsque la thorie actuelle nest pas adapte aux types de donnes
traits. L'expos des mthodes sera souvent suivi de la prsentation d'algorithmes et
de leur ralisation concrte dans le systme d'information gographique que nous
avons dvelopp, de manire construire peu peu un systme oprationnel
complet. Des rfrences renverront frquemment le lecteur une annexe contenant
limplantation effective des structures et des algorithmes, directement en langage de
programmation (C++).
Il se divise en plusieurs parties :
- premire partie : Introduction. Rappels sur les SIG et prsentation gnrale des
diffrents modules du systme SAVANE ;
- seconde partie : modlisation, mesure, gestion et SGBD, go-rfrencement et
intgration d'images, contraintes d'intgrit spatiale et saisie ;
- troisime partie : exploitation des donnes, requtes, analyse spatiale et
reprsentation cartographique.

Introduction

La premire partie donne un panorama gnral des SIG, puis prsente le systme
SAVANE. Aprs une brve introduction sur les objectifs gnraux des SIG, nous
rappellerons rapidement l'histoire du dveloppement des systmes d'information
gographiques, ainsi que les fonctionnalits actuellement rencontres dans les
systmes du commerce. Le second chapitre prsente de faon gnrale le systme
SAVANE : architecture gnrale, fonctionnement et possibilits des diffrents
modules.
La seconde partie expose les caractristiques des donnes gographiques :
modlisation de la ralit, reprsentation informatique, modes d'acquisition,
prcision et qualit, description et documentation, mta-donnes. Nous dtaillerons
le mode de reprsentation utilis dans le SIG SAVANE pour tous les objets
gographiques. Nous prsenterons l'aspect base de donnes dans les SIG, en
commenant par rappeler l'ensemble de la thorie des SGBD relationnels et objets.
Nous proposons ensuite des extensions du modle de gestion relationnel et objet aux
donnes localises, et nous prsenterons limplmentation de ces nouvelles
oprations dans SAVANE. Nous prsenterons de nombreux algorithmes
gomtriques concernant la saisie et le contrle de la qualit des donnes
gomtriques, le redressement dimages, les jointures gomtriques, etc.
La troisime partie concerne les mthodes utilisant plus spcialement la
localisation des objets dans les SGBD gographiques. Il s'agit de l'analyse spatiale
dont nous donnerons de nombreux exemples et algorithmes de rsolution
(traitements vectoriels, traitements matriciels, distances et proximit, changements
d'implantation spatiales, modles numriques et interpolation, etc.). Nous
prsenterons enfin les modules de cartographie automatique de SAVANE.
Lannexe regroupe les principales structures et algorithmes du systme. Ils
seront donnes, lorsque cela est possible et facilement comprhensible par le lecteur,
directement en langage de programmation.

Un systme dinformation gographique rpondant nos objectifs est la fois un


systme de gestion de donnes et un programme dapplication, et cest bien ce
mlange des genres qui en fait la complexit, au-del du caractre particulier d la
dimension gomtrique des donnes grer et traiter. En tant que programme
dapplication, le systme construit nest pas complet, certains domaines ntant pas
ou peu abord (lanalyse de rseaux et la recherche oprationnelle par exemple). Il
na dailleurs pas vocation ltre, mais sa structure volutive devrait lui permettre
de continuer se dvelopper, et cest dailleurs un de nos principaux
objectifs initiaux : fournir la base logicielle au dveloppement de nouvelles
fonctionnalits - aussi bien dans un cadre universitaire que dans un environnement

Introduction

oprationnel - et implmenter ces fonctionnalits en tant que mthodes, soit


directement dans le systme, au niveau des classes de bases, soit en tant que classes
dobjets drives qui seront la disposition du concepteur de base de donnes. Nous
donnerons, en conclusion, quelques lments de rflexion sur ce thme.

Premire partie : introduction et prsentation du systme


SAVANE

Chapitre 1

Les systmes dinformation gographique 9

Chapitre 1

Prsentation gnrale des systmes


d'information gographique

Depuis plus de vingt ans, le dveloppement de l'informatique a entran des


modifications importantes pour la gographie et la cartographie. La production de
donnes s'est acclre, grce de nouvelles mthodes de collecte et d'acquisition.
Le traitement des donnes localises s'est largement dvelopp, avec la saisie
numrique des donnes graphiques, cartes et plans, avec les systmes de gestion de
bases de donnes et les capacits de stockage des systmes informatiques. Enfin, de
nombreux aspects de la cartographie ont t automatiss et les techniques de
production compltement modifies, avec en corollaire une acclration de la
diffusion et de l'utilisation de donnes gographiques.
Un systme d'information gographique (SIG) est avant tout un systme de
gestion de base de donnes capable de grer des donnes localises, et donc capable
de les saisir, de les stocker, les extraire (et notamment sur des critres
gographiques), de les interroger et analyser, et enfin de les reprsenter et les
cartographier. L'objectif affich est essentiellement un objectif de synthse,
permettant la fois la gestion des donnes comme l'aide la dcision.
Si l'informatique a d'abord permis des progrs dans l'automatisation de la
production cartographique, les SIG vont bien au-del d'une simple fonction de
stockage et de restitution graphique. Par leurs possibilits de modlisation et de
gestion, par leurs fonctions d'analyse et d'interrogation, par les possibilits de mises
en relation des objets les uns par rapport aux autres, par leurs capacits stocker et
traiter de gros volumes d'information, les SIG ont profondment boulevers les
mthodes traditionnelles d'analyse et de gestion de l'espace. Grce aux possibilits

10

Chapitre 1

de modlisation et de calcul, l'informatique et les SIG n'ont pas seulement permis


l'amlioration de techniques existantes, ils ont remis en cause bon nombre de
concepts classiques de la gographie et renouvel la dynamique de cette discipline.
1.1. L'apport de l'informatique pour la gographie et la cartographie
L'informatique intervient depuis plusieurs dizaines d'annes dans beaucoup de
domaines et, depuis plus de vingt ans, son dveloppement a entran des
modifications importantes pour la gographie et la cartographie. Parmi les secteurs
qui nous intressent, on peut citer la gestion de donnes, le stockage numrique, la
statistique, de nouvelles formes d'expression et de communication. De plus, de
nouveaux moyens d'acquisition de donnes se sont dvelopps : la tldtection
spatiale et le positionnement par satellite en sont les principaux exemples. La
gographie et la cartographie se sont construites peu peu sur la base de possibilits
techniques qui, pendant longtemps, n'ont pas volu. Depuis une vingtaine d'annes,
beaucoup de ces fondements sont les uns aprs les autres remis en cause ou modifis
par des possibilits techniques indites.
Chaque domaine a d'abord t touch, mais indpendamment des autres. Par
exemple, les logiciels de dessin ont remplac peu peu des travaux manuels longs et
fastidieux, des techniques de structuration et de gestion de donnes et de nouveaux
moyens de stockage ont permis de mettre en uvre de nouveaux moyens de
traitement et d'analyse, notamment statistiques, des logiciels de prsentation de
donnes et d'images permettent d'envisager de nouvelles formes d'expression
cartographique.
L'originalit des SIG, c'est d'essayer de runir toutes les nouvelles techniques de
traitement de donnes localises, tous les nouveaux moyens d'expression dans un
seul et unique environnement, dcuplant en cela l'efficacit de chaque domaine et
permettant de nouvelles avances conceptuelles, impossible concevoir dans la
sparation des techniques : c'est donc aux fondements de la gographie qu'il faut
retourner, pour ne pas conserver des limitations conceptuelles lies des
impossibilits techniques maintenant dpasses ou en passe de l'tre. Cette remise en
cause, cette renaissance conceptuelle ne peut tre mene que dans le cadre des SIG,
et c'est bien ce qui fait la force de ce courant, qui ne doit pas tre conu ou interprt
uniquement sous l'aspect de l'avance technique qu'il apporte : il doit fournir aux
gographes et aux informaticiens l'occasion de rflchir de nouveau sur l'espace
gographique, sur la manire de le concevoir, de le traiter, de le reprsenter.
Mais le concept de SIG n'a pas t dfini directement, au dbut des annes 60. Il
s'est construit peu peu, au fur et mesure de l'introduction de l'informatique dans

Les systmes dinformation gographique 11


l'ensemble des mthodes lies l'analyse et la reprsentation de donnes spatiales.
Nous pouvons faire rapidement l'historique de ce champ d'activit.
1.2. Les SIG comme synthse de ces domaines : historique et volution
Lhistorique du dveloppement des SIG peut tre divis en trois priodes : les
annes 60-70, reprsentant les dbuts et les premires ralisation, les annes 80 pour
la consolidation et lapparition des premiers logiciels commerciaux, et les annes 90
pour la diffusion gnrale des outils et de la technologie SIG.
1.2.1. Les dbuts : les annes 60-70
Les applications militaires et l'intrt croissant des gouvernements pour la
gestion des ressources sont l'origine du dveloppement des systmes d'information
gographique. Prenons par exemple le Canada, qui a dvelopp l'un des premiers
systmes dans les annes 1960 : pour la premire fois, un tat avait le sentiment que
ses ressources naturelles n'taient pas sans limites, et son gouvernement a peru la
ncessit d'intervenir au niveau de la planification et de l'utilisation des ressources.
L'chelle utile pour une telle planification varie entre le 1:20000 et le 1:250000 : sur
un pays de la taille du Canada, il fallait utiliser entre 200 et 3000 coupures de carte,
pour chaque thme d'tude. Manuellement, le travail de lecture et d'analyse de
l'information cartographique aurait pris au minimum trois ans et plus de cinq cent
techniciens.
Dans les annes 60, le concept mme de SIG n'tait pas encore dvelopp et les
mthodes de stockage et d'analyse d'un nombre important de cartes taient
inexistantes. Les ordinateurs avaient de faibles mmoires et des vitesses de calculs
largement dpasses par les plus petits micro-ordinateurs d'aujourd'hui.
L'informatique graphique en tait ses dbuts, aussi bien pour le matriel que sur la
thorie et les algorithmes [PAL 75]. C'est entre 1960 et 1970 qu'ont t dvelopps
les premires tables digitaliser, les scanners, les tables traantes, ainsi que les
techniques de base de l'informatique graphique : algorithmique graphique, topologie
informatique, traitement d'image et reconnaissance des formes, modlisation bi- ou
tri-dimensionnelle. L'interactivit est alors inexistante , et les possibilits de
restitution graphique trs limite. Les cots sont importants : par exemple, un cran
graphique - alors basse rsolution- cote environ 10000 USD en 1967.
La plupart des systmes d'analyse spatiale dvelopps pendant les annes
soixante et soixante dix utilisent des structures de donnes trs simples, qui sont
bass sur des grilles arbitraires, maillage de l'espace qui ressemble ce qu'un
gographe peut faire manuellement sur une petite surface [DAN 81]. C'est

12

Chapitre 1

principalement le cot lev des tables digitaliser qui est l'origine de ce choix,
surtout dans les universits, o certains tudiants devaient remplir la main les
mailles en fonction de la carte d'origine SYMAP, MIADS, GRID, MLMIS,
GEOMAP sont des exemples de systmes de ce type. D'un autre cot, les systmes
de dessin automatis se dveloppent, mais sans la notion de base de donnes. C'est
ainsi que se dveloppent les premiers systmes d'information urbain la fin des
annes 60, et ils s'apparentent plus des systmes de dessins automatiques qu' des
systmes de gestion de l'information (DIME, GRDSR) [DIM 70].
Dans les annes qui suivent, la perception de la ncessit d'une gestion gnrale
des ressources et des potentialits est de plus en plus rpandue. Elle implique des
moyens de traitement de l'information volu, notamment dans le domaine de
l'information spatialise. D'autre part, les progrs de la technologie informatique
sont importants et rapides ; l'interactivit se dveloppe et les cots des matriels
graphiques sont en baisse, mme s'ils restent encore levs. Les systmes de gestion
de bases de donnes sont en pleine volution. Le nombre de systmes en
dveloppement est important, mais peu d'innovations voient le jour, la plupart des
dveloppements se font dans le domaine du dessin automatique ou de la
cartographie automatique. Les universits sont dsormais nombreuses s'intresser
ce domaine, et des socits commerciales commencent voir le jour alors qu'elles
taient inexistantes durant les annes 60 : ESRI, GIMMS, INTERGRAPH,
COMPUTERVISION
On ne parle pas encore de SIG proprement dit, et le dveloppement est plutt
tourn vers les systmes de dessin et de conception assiste par ordinateur, systmes
que l'on essaye d'adapter aux besoins de la cartographie. Le dveloppement des
matriels graphiques est d'ailleurs essentiellement d au dveloppement de la CAO
(conception assiste par ordinateur), en pleine expansion et beaucoup plus porteur
l'poque que celui de l'information gographique. Ce type de matriel reste
nanmoins trs coteux.
Si le dveloppement logiciel est important,
le nombre des systmes
d'information gographique couvrant de larges territoires reste trs faible. Les
systmes sont conus soit pour stocker, soit pour grer, soit pour traiter, mais aucun
n'est encore vraiment capable non seulement d'archiver, mais aussi de grer et de
traiter un important volume d'informations spatialises. Les techniques volues de
gestion de donnes sont d'ailleurs peu dveloppes, et les modles utiliss
conviennent mal aux donnes gographiques. Par contre, l'algorithmique graphique,
la reconnaissance des formes, le traitement d'image sont des secteurs en plein
dveloppement en sciences de l'information.
Le dbut des annes 70 va galement voir le dveloppement rapide de la
tldtection spatiale et des mthodes de traitement d'image associes. Ces

Les systmes dinformation gographique 13


technologies restent alors spares des SIG, mais elles vont contribuer favoriser
l'essor gnral de l'infographie. Il faudra nanmoins attendre les annes 80 pour voir
s'esquisser un rapprochement entre la tldtection spatiale et les SIG, par une
intgration rciproque d'information de sources multiples.
1.2.2. La consolidation : les annes 80
Les annes 80 sont une priode de dveloppement des mthodes de gestion de
donnes. La saisie et la gestion de larges bases de donnes sont maintenant les
principaux problmes thoriques et pratiques. Les problmes dus au volume des
donnes sont souvent mal perus ou mme ignors par les administrateurs : un
systme contenant une dizaine de cartes sera bien diffrent d'un systme contenant
5000 coupures ou plus. Voici quelques chiffres donnant une ide du volume de
donnes de SIG potentiels :
- les 359 coupures de carte de l'United States Geological Survey (utilisation des
sols) contiennent approximativement 68 millions de points,
- les cartes topographiques sont beaucoup plus riches : il existe environ 40000
coupures de la carte topographique de l'USGS au 1:25000, ce qui reprsente environ
4000 millions de points.
Pour raliser de telles bases de donnes, il faudra dvelopper des mthodes de
gestion et d'organisation de donnes de plus en plus efficaces. Le dbut des annes
80 a vu une avance importante dans les techniques de gestion de donnes : les
systmes de gestion schma relationnel sont plus performants, ils structurent
l'information de faon plus rigoureuse et amliorent la rsolution des problmes
d'administration de donnes. Dans ces systmes, les relations spatiales entre entits
gographiques sont malheureusement inexistantes, aussi bien sur le plan thorique
que sur le plan pratique : la spatialisation n'est pas gre en tant que telle, et les
concepts thoriques ne sont pas adapts aux donnes multidimensionnelles, si bien
qu'il est impossible de les faire entrer dans le schma des systmes de gestion de
bases de donnes relationnelle classique. De nombreux efforts seront donc entrepris
pour tendre le modle relationnel aux donnes gographiques, mais il faudra
attendre la prochaine dcennie pour voir les ralisations pratiques de ces
dveloppements [FRA 81] [DAN 81]
Paralllement, l'interactivit graphique se dveloppe. Les stations de travail
apparaissent, et sont parfaitement adaptes ce type d'application. Le matriel
graphique (traceur, imprimante couleur, table digitaliser, scanner) reste nanmoins
encore coteux, et le SIG n'est pas encore une application disponible sur microordinateur et accessible du grand public.

14

Chapitre 1

1.2.3. La diffusion : les annes 90


Les annes 90 vont transformer ce panorama, et permettre une large diffusion de
la technologie. Les micro-ordinateurs, de plus en plus puissants, remplacent peu
peu les stations de travail. Les accessoires graphiques deviennent galement
accessibles au grand public. L'offre commerciale s'toffe, avec des logiciels plus
complets et moins chers. On assiste donc une large dmocratisation de l'usage des
SIG, avec de nombreux projets qui se dveloppent sans trop de difficults du fait du
modeste volume de donnes traites. Mais les mthodes n'voluent pas beaucoup : la
plupart des logiciels commerciaux sont l'manation directe de produits conus au
dbut des annes 80. Les logiciels commerciaux les plus rpandus sont d'ailleurs
parfois trop simples, et cherchent ne pas emmener l'utilisateur non averti sur des
chemins trop complexes Mais la baisse des cots des matriels de traitement et de
restitution va peu peu mettre le SIG la porte de tous [WOR 95].
1.2.4. Les volutions actuelles
Le dveloppement de l'Internet pousse l'ensemble des produits commerciaux
offrir une solution pour l'interrogation du SIG et la conception de cartes via Internet.
Mais cette offre met l'accent sur une consultation simple, au dpend de procdures
d'analyse plus complexes. La gestion du temps est encore peu effective dans les
SIG, mme si le cadre thorique est bien pos. Le problme des multireprsentations spatiale d'un mme objet doit galement faire l'objet de
dveloppements, au niveau de l'implmentation des objets comme au niveau des
contraintes d'intgrit. La gostatistique se dmocratise peu peu, mme si elle reste
encore sous-utilise dans de nombreux domaines dapplication.
L'volution vers des SIG 3D est galement sensible, avec des techniques de
reprsentation et de visualisation qui suivent les capacits de matriels graphiques
en forte volution. L'introduction de mthodes issues de la vision par ordinateur, de
la reconstruction 3D, de techniques d'animation devrait fortement pousser ce secteur
en pleine volution.
1.3. Les SIG : objectifs gnraux
Avant de prsenter les principes et fonctionnalits du systme SAVANE que
nous allons dcrire tout au long de cet ouvrage, nous dressons un panorama gnral
des principaux objectifs des systmes d'information gographique [TOM 76] [DAN
83] [LAU 93] [SCHO 96] [SOU 86].

Saisie et stockage numrique de plans et de cartes :

Les systmes dinformation gographique 15


Le premier et principal objectif des SIG reste le stockage numrique de donnes
gographiques, bi- ou tridimensionnelles. Mais il y a beaucoup de diffrences entre
un systme qui va conserver des objets, avec une description aussi bien graphique
que descriptive, et un systme qui va seulement conserver un dessin sans contenu
smantique.

Structuration de l'information :
Comme tout systme de gestion de bases de donnes, un SIG qui gre une base
de donnes demande une modlisation du monde rel et une structuration de
l'information. Cette structuration est souvent plus complexe, car elle touche des
objets qui peuvent avoir de multiples reprsentations, aussi bien graphiques que
descriptives, essentiellement en fonction de l'utilisation qui en sera faite.

Calculs mtriques (distances, surfaces), calculs techniques (visibilit,


volumes, recherche oprationnelle), positionnement et projections
gographiques :
Les SIG permettent de calculer facilement surfaces, distances et volumes partir
des donnes de localisation des objets. Les calculs et les changements de projections
gographiques sont facilement accessibles. La recherche oprationnelle
(essentiellement calculs de chemins dans des graphes) trouvent dans les SIG toutes
les donnes dont elle a besoin.

Gestion et traitement des collections d'objets :


C'est l'un des objectifs principaux des SIG. Une fois l'information structure, elle
doit tre saisie et gre par le systme. Souvent, les SIG laissent la gestion des
donnes descriptive des SGBD relationnels classiques (comme ACCESS,
ORACLE, SQL Server, DBase, etc.), et ne grent eux-mmes que la localisation des
objets et les liens entre graphique et description. Comme tout systme de gestion de
base de donnes, le SIG doit assurer la bonne gestion des flux d'informations, des
modifications, des mises jour, et notamment pour la partie graphique des objets.

Gestion administrative et partage de donnes entre utilisateurs :


Lorsque les donnes sont partages entre plusieurs utilisateurs, comme c'est
souvent le cas pour les applications administratives de type cadastre, le SIG a pour
objectif de grer ce partage et d'optimiser l'accs des donnes entre utilisateurs.

Gestion et analyse spatiale :


Les SIG ont vocation grer tout type d'objet gographique, du point au pixel,
en passant par les zones, les rseaux, etc. L'objectif atteindre est la constitution
d'une base de donnes go-rfrences, permettant la mise en relation des diffrents
objets de la base, quels que soient les types de ces objets. Cette mise en relation doit

16

Chapitre 1

permettre l'analyse spatiale, c'est--dire la prise en compte de la localisation dans


l'analyse des donnes. De nombreuses procdures faisant appel la localisation des
objets sont donc implantes dans les SIG (slections d'objets sur des critres de
distances, recherche oprationnelle, agrgations spatiales et changements d'chelle,
go-jointures, interpolations, vectorisations, classifications par proximit, etc.).

Gestion spatio-temporelle :
Lintroduction du temps dans les SIG permet deffectuer des interrogations
mlant espace et temps, de manire pouvoir grer la fois lhistorique dun objet
et ltat dun ensemble dobjet une date donne. Les SIG ont donc galement
vocation grer les volutions des objets gographiques. Mais les ralisations
concrtes sont peu rpandues, car la gestion de lhistorique des modifications de la
localisation dun grand ensemble dobjets est complexe, aussi bien du point de vue
informatique que de celui de la gestion des flux dinformations.

Statistique et gostatistique :
La constitution d'une base de donnes gographiques a souvent pour objectif
l'tude d'un territoire dans toutes ses composantes, et le SIG doit alors permettre
l'accs facile au calcul statistique, qu'il soit exploratoire ou mthodologique.
Certains SIG comportent un module statistique, d'autres grent l'interface avec un
logiciel spcialis. L'utilisation de mthodes de la gostatistique doit galement tre
l'un des objectifs du SIG, puisqu'en grant la localisation, il facilite
considrablement l'utilisation de ces mthodes d'analyse ou d'interpolation spatiale.

Simulation et modlisation :
L'objectif d'un SIG peut galement tre l'utilisation d'un modle pour la
simulation d'un processus. Le SIG doit alors faciliter l'interface entre le programme
de modlisation ou de simulation et la base de donnes gographiques, et doit
prendre en charge l'ensemble de l'accs l'information spatiale dont a besoin le
programme d'application.

Tldtection, go-rfrencement et traitement d'image :


Les SIG ont vocation grer tout type d'objet gographique. La tldtection
arienne ou spatiale offre une source privilgie de donnes gographiques. Les SIG
doivent donc galement grer et traiter de type de donnes, souvent volumineuses.
Ils doivent en assurer le bon go-rfrencement, permettre l'accs aux traitements
propres ce type de donnes, et permettre leur mise en relation avec l'ensemble des
autres donnes localises gres par le systme.

Dessin et dition cartographique, cartographie automatique, 3D :

Les systmes dinformation gographique 17


Comme tout systme de gestion de donnes, les SIG ont pour objectif l'dition
des donnes rsultats d'une requte. Cette dition est souvent graphique puisque l'on
traite de donnes localises. Les modules de cartographie automatique partir des
donnes gres par le systme sont donc fondamentaux pour l'utilisateur. De plus en
plus, les systmes intgrent la troisime dimension, et permettent l'dition de
donnes en perspective. Mais la saisie et la maintenance de la troisime dimension
est plus complexe.

Internet et accessibilit distante :


L'Internet offre depuis plusieurs annes de nouvelles perspectives d'accs distant
aux donnes. Les SIG doivent donc permettrent cet accs, en grant la complexit
de structure de l'information localise, de manire fournir aux utilisateurs des
mthodes simples de consultation et de cartographie via Internet.
1.4. Conclusion
Commenc il y a maintenant plus de 30 ans, lintroduction de linformatique
dans le champ de la gographie a profondment renouvel la dynamique de cette
discipline. Ce renouvellement nest pas d au seul dveloppement des SIG : les
nouveaux moyens de mesure ou dobservation de la Terre y participent aussi
largement. La dnomination SIG recouvre une grande varit de ralisations
logicielles construites suivant des choix techniques diffrents, aux fonctionnalits et
aux performances trs diverses.
Le lien entre dveloppement de nouvelles technologies et mergence de
nouveaux paradigmes de recherche est indniable. Et inversement, le
questionnement mthodologique se nourrit en permanence de lapplication
thmatique des mthodes et des outils quelle conoit. Toutes ces technologies vont
dans le mme sens : celui dune prise en compte toujours plus importante de la
localisation dans la gestion ou lanalyse des phnomnes, des prcisions qui
permettent de dvelopper de nouveaux objectifs de recherche et damliorer
considrablement les rsultats obtenus dans les tudes qui en dcoulent.

18

Chapitre 1

Les systmes dinformation gographique 19

Bibliographie

[DAN 81] DANGERMOND J., Some trends in the evolution of GIS technology, Marble Ed.,
1981, Kensington Workshop, p. 25-57
[DAN 83] DANGERMOND J., Classification des lments logiciels utiliss habituellement dans
les systme dinformation gographique, fascicule n 96 du comit franais de cartographie,
1983, p. 7-20
[DIM 70] DIME, Technical description of the DIME System, U.S. Bureau of Census : Census
and study, the DIME Geocoding System, Report n 4, Washington D.C., 1970, p. 25-30
[FRA 81] FRANCK A., Application of DBMS to Land information systems, CH 1701-2, IEEE
81, 1981, p. 448-453
[GUP 95] GUPTILL S.C., MORRISON J.L.,
Pergamon/Elsevier Science, 1995

Elements

of

Spatial

Data

Quality,

[LAU 93] LAURINI R., MILLERET-RAFFORT F., Les bases de donnes en gomatique, Paris,
Ed. Herms, 1993
[PAL 75] PALMER J.A.S., Computer Science aspects of the mapping problem, from Davis and
Mc Cullagh, Display and analysis of spatial Data, New York, John Wiley and Sons, 1975
[SCH 96] SCHOLL M., VOISARD A.,
Thomson Publishing France, 1996

ET

TOUS, SGBD Gographiques, Spcificits, Paris,

[SOU 86] SOURIS M., Systmes dinformation gographique et bases de donnes, Colloques
et Sminaires sur le Traitement des donnes localises, Paris, Editions de lORSTOM, 1986,
p. 29-87
[TOM 76] TOMLINSON, CALKINS AND MARBLE, Essential part of a geographic information
system, Computer Handling of geographic Data, UNESCO Press, Paris, 1976
[WOR 95] WORBOYS M. F., GIS, a Computer Perspective, Taylor and Francis, 1995

Chapitre 2

Prsentation du systme SAVANE

Cette prsentation du systme SAVANE a pour objectif de dcrire rapidement


les principes gnraux de sa conception et de situer ce logiciel dans lensemble des
systmes dinformation gographique. Il prsente les concepts gnraux du systme
et ses spcifications fonctionnelles.
2.1. Le systme SAVANE : principes gnraux
Le systme SAVANE prsent dans cet ouvrage est dabord un systme de
gestion de base de donnes relationnelle tendu aux donnes localises, avec des
fonctionnalits de type objet. Son objet est de grouper, grer, traiter, cartographier
des donnes gographiques de diverses origines et diffrents types, comme des
donnes d'enqutes, des cartes thmatiques, des donnes topographiques, des
rseaux, des images satellites, des photographies ariennes, des modles numriques
de terrain, etc. Le systme SAVANE possde les principales fonctionnalits des SIG
: multiples sont les possibilits de croisement, de mise en relation, de regroupement,
d'agrgation de donnes gographiques d'origines diverses. Il n'y a pas dans
SAVANE de sparation entre la localisation et la description, entre le dessin et
l'information : chaque objet est conserv avec tous ses attributs, qu'ils soient
graphiques ou descriptifs : c'est le systme qui gre l'ensemble. Le systme
SAVANE possde son propre systme de gestion de base de donnes, de type
relationnel tendu aux donnes localises dans l'espace.
la fois systme de gestion de bases de donnes relationnelles, systme
d'analyse et d'aide la recherche en gographie, systme de cartographie et de
dessin automatique, SAVANE va de la constitution d'une base de donnes l'dition

22

Chapitre 2

: il offre ainsi la matrise de toute la chane cartographique de la conception de


l'information au produit cartographique. Bien sr, la constitution et l'exploitation
d'une importante base de donnes localises n'est pas chose simple et fait appel de
nombreux concepts, de la structuration et gestion de base de donnes l'laboration
cartographique, en passant par la statistique, la godsie, le traitement d'image.
Nous prsentons dans ce chapitre une description rapide des principes et des
fonctionnalits du systme, sans rentrer dans la description de la structure interne ou
des algorithmes de rsolution, que nous prsenterons tout au cours de cet ouvrage.
Le systme comprend cinq modules principaux (saisie graphique, gorfrencement d'images, administration des bases de donnes, exploitation des bases
de donnes et cartographie, prsentation datlas). Les bases de donnes
gographiques sont gres par un moteur de gestion de donnes bi-dimensionnel,
avec indexation primaire base sur la localisation. Nous prsenterons dans les
chapitres qui suivent l'architecture dtaille du systme, la structure des bases de
donnes, les mthodes de gestion et d'exploitation, ainsi que les principales
fonctions, modules et algorithmes correspondants. Le logiciel est crit en Visual
C++ et fonctionne avec tout systme d'exploitation Win32.
2.1.1. Les concepts gnraux de SAVANE
Le sujet principal de notre travail, cest de montrer comment construire un
systme rpondant aux objectifs gnraux des SIG tels que nous les avons prsents
dans lintroduction de cet ouvrage, savoir principalement : une gestion efficace
dobjets localiss, une gestion volutive, une ergonomie permettant lapproche
exploratoire, des fonctionnalits permettant lanalyse spatiale, et des fonctionnalits
de dessin et de cartographie automatique.
De nombreux choix peuvent tre effectus pour construire un logiciel de type
SIG, aussi bien pour larchitecture gnrale du systme, pour les structures de
donnes, pour les algorithmes de rsolution, les mthodes dindexation, de gestion,
etc. Nous allons ici expliciter globalement ces choix, avant dy revenir en dtail au
cours des chapitres qui suivent.
A lorigine de la construction du SIG, il y a deux objectifs majeurs : grer des
objets gographiques, en assurant la prennisation et le partage de linformation, et
avoir la possibilit de mettre ces objets en relation les uns avec les autres en utilisant
leur localisation. Mettre en relation, comme pouvait le faire simplement le
gographe lorsquil superposait deux cartes thmatiques, pour vrifier ou mettre en
vidence des corrlations spatiales. Lide initiale est donc simple : grer des objets
tels quils apparaissent sur des cartes, par thmes indpendamment les uns des
autres, et utiliser cette localisation, considre comme universelle entre tous les

Prsentation du systme SAVANE 23


objets localiss, pour les relier les uns aux autres. Bien sr, il faudra faire attention
conserver cette universalit lors de la mesure de la localisation : datum et
projections cartographiques seront largement discuts au chapitre 4. Pour viter tout
problme li au rfrentiel, nous avons choisi dans notre systme de conserver les
coordonnes indpendamment de la projection cartographique, et dimposer un
mme datum pour lensemble des objets dune base de donnes. Cest la solution la
plus simple au niveau du systme de gestion, mais elle requiert davoir les capacits
de transformer toute coordonne pour la ramener dans ce rfrentiel : il nous faudra
donc dvelopper changements de projection et changements de datum.
Grer des objets suivant des collections thmatiques, et pouvoir les mettre en
relation grce un attribut, tout cela rappelle la gestion relationnelle pour les bases
de donnes classiques. Les objets y sont grs par collections dobjets de mme
type, et ils sont mis en relation sur un attribut commun par une qualification de
jointure sur cet attribut. Le modle relationnel permet dassurer au mieux cohrence
et intgrit dune base de donnes, en laissant des oprations de restriction ou de
jointure le soin de rpondre une requte. Lide de base de la construction du
systme que nous prsentons, cest dtendre le mode de gestion relationnel aux
objets localiss, avec la possibilit dune jointure sur lattribut donnant la
localisation des objets pour les mettre en relation, entre objets de collections
diffrentes. Dans une premire tape, il faut analyser le problme de la
reprsentation des objets gographiques dans une base de donnes, dans loptique
de les grer en collections dlments dcrits par les mmes attributs. Car une carte
reprsente effectivement un ensemble dobjet, linverse de la description dun
paysage ou dun quartier, qui, en gnral, ne reprsente quun seul objet et na pas
pour objectif une tude comparative avec dautres objets du mme type. Lide de la
collection est donc omniprsente dans notre approche : si lon cherche regrouper
les objets en collections dcrits par les mmes attributs, cest pour pouvoir bien les
grer, les comparer entre eux, les comparer aux objets dautres collections. La
localisation dans lespace doit tre un lment fondamental de cette comparaison.
Partir du modle relationnel pour la gestion de base de donnes permet dutiliser
un modle qui donne satisfaction dans la gestion dobjets dcrits par des attributs
simples (nominaux ou numriques de dimension 1). Mais la prise en compte de
lattribut de localisation savre plus complexe, car des questions indites se posent
pour des attributs de dimension suprieure 1 : comment dcrire et reprsenter des
sous-ensembles de dimension un ou deux ? Comment conserver la structure
mtrique de lespace ? Est-il possible dutiliser les systmes existants, ou faut-il
construire un nouveau moteur de gestion de donnes ? Faut-il stocker des cartes, ou
revenir sur la schmatisation et la modlisation qui a dj t effectue par le
gographe ou le cartographe ?

24

Chapitre 2

Dans la conception du systme que nous proposons, le point de dpart de


linformation reste la carte ou la mesure directe de terrain, comme dailleurs dans la
grande majorit des SIG. Mais la carte nintervient que comme support dun
ensemble dobjets correspondant une mme entit du monde rel, non plus
cartographique mais gographique, dpouille de toute reprsentation smiologique.
La modlisation ne retient que la schmatisation gomtrique utilise pour rendre
compte des phnomnes dans lespace, avec, pour forte contrainte, lunicit dun
phnomne dans lespace et le temps : dans une collection, on ne peut avoir deux
objets au mme endroit et au mme moment (si lon prend en compte le temps). Le
respect de cette contrainte est fondamental pour assurer la validit conceptuelle de la
modlisation de la ralit. A partir de ce choix (une reprsentation gomtrique des
objets base sur une description cartographique), plusieurs possibilits existent pour
conserver la description de cette reprsentation gomtrique dans un systme
informatique. Il est ncessaire de dfinir des types diffrents suivant le type de
localisation, ponctuelle ou ensembliste, de dimension 1 ou de dimension 2. Dj, on
pressent quun systme de gestion de base de donnes classique ne peut convenir
pour stocker efficacement cette description, pour peu que lon veuille lutiliser dans
sa structure despace mtrique. Rien nempche dutiliser des tables classiques pour
stocker des points (x,y), mais un systme classique sera incapable de reconstituer un
contour, deffectuer des tests dappartenance, ou une interrogation sur la distance
entre les objets : lincapacit des SGBD classiques grer lattribut de localisation
dans sa structure est vidente. On peut alors sparer graphique et descriptif, utilisant
un systme particulier pour grer lattribut de localisation, et un systme classique
pour grer lensemble des attributs descriptifs, en tablissant un lien entre les deux
systmes par une cl de jointure pour reconstituer les objets. Cette solution ne nous
satisfait pas, pour deux raisons essentielles : il est alors impossible dindexer les
objets sur leur localisation, alors que ce critre est de loin le plus discriminant, et la
gestion spare de deux ensembles dattributs, correspondant un mme objet, est
source dincohrence dans les bases de donnes et de perte de performance ds que
le nombre dobjet devient grand. Lorsque les objets sont localiss, lattribut de
localisation devient en effet le plus efficace en terme dindexation : nous souhaitons
mettre en uvre une indexation de type squentiel index base sur la localisation,
ce qui impose aux valeurs descriptives dtre stockes dans lordre des objets si lon
veut bnficier des performances de lindexation sans avoir maintenir des index
denses. Ceci ne peut se faire que dans un systme grant la fois le descriptif et le
graphique.
Lautre objectif principal du systme que nous proposons de construire, cest de
prenniser linformation, de faon centralise, et den permettre la consultation et
lexploitation dcentralise, avec une dmarche exploratoire. En effet, si
linterrogation dun SGBD classique utilise habituellement un langage de requte
permettant dexprimer en une phrase la demande faite la base de donnes, le
processus dinterrogation de donnes gographiques et la dmarche du gographe

Prsentation du systme SAVANE 25


relve bien souvent dune approche exploratoire, sans la dfinition formelle du
cheminement des oprations permettant de rpondre une question qui peut ellemme varier en fonction du cheminement. Il est essentiel de conserver cet aspect
interactif dans le processus de requte, ce qui implique concrtement la cration
temporaire lors de linterrogation de nouveaux attributs ou relations. Le systme
doit donc maintenir des tats temporaires, par utilisateur : il ne pouvait tre question
de permettre la modification de la base de donnes par un utilisateur sous peine de
remettre en question lobjectif fondamental de prennisation et de centralisation de
linformation.
Pour toutes ces raisons, nous avons choisi de construire un systme possdant
son propre moteur BD, permettant lindexation primaire sur la localisation,
permettant le stockage et la gestion de la gomtrie reprsentant la localisation des
objets, regroups en relations, en fonction dune modlisation de lespace respectant
le principe dunicit de cl pour la localisation. Cette modlisation doit prendre en
compte les diffrents types dimplantation spatiale : zone, ligne, points, pixels.
Nous avons galement choisi de sparer ladministration de lexploitation : le
module dinterrogation doit permettre lapproche exploratoire et la gestion dtats
temporaires lors dune requte, mais il ne peut pas modifier la base de donnes,
droit rserv au module dadministration. Nous avons galement choisi de sparer
lexploitation de la saisie graphique et de la vrification des contraintes dintgrit.
Pour le choix des structures internes de reprsentation de la localisation, nous
privilgions systmatiquement la simplicit des structures sur la simplicit des
algorithmes de traitement : ainsi, nous choisirons de conserver des arcs frontires,
quitte avoir reconstituer le contour des zones, plutt que de conserver un contour
ferm imposant un sens dans le stockage des arcs. Des structures plus simples pour
la reprsentation de la localisation permettent de rduire les contraintes dintgrit
sur cet attribut.
A partir de la modlisation en collections thmatiques, lextension du modle
relationnel aux donnes localises devient naturelle. Les oprations de lalgbre
relationnelle (restriction, projection, jointure) sont tendues la localisation en
utilisant des critres de distance ou dappartenance, la place dune relation dordre
ou dgalit. Malheureusement, on saperoit rapidement que cet attribut de
localisation, que nous avions qualifi duniversel, ne lest pas vraiment. Il varie
considrablement, aussi bien dans sa conception, dans la manire de le reprsenter,
que dans la prcision de sa mesure. La jointure spatiale, extension de la jointure
classique et opration formelle correspondant la mise en relation par
superposition, ne tient pas compte de la validit ou de lchelle de description. Dans
de nombreux cas, elle savre donc inutilisable en ltat : il va falloir grer des
transferts dchelle pour mettre effectivement en relation des objets de validit ou
dimplantation spatiale diffrente. La conception de notre systme est-elle encore
valide, si son principal objectif, savoir mettre les objets localiss en relation grce

26

Chapitre 2

leur localisation, ne peut tre atteint efficacement ? Grer ensemble des collections
dobjets en conservant lambigut sur la validit de lattribut de localisation est-il
possible ? Pour rpondre positivement cette question, il est ncessaire dintroduire
de nouvelles mthodes de gestion et dexploitation, au-del dune jointure dont
lobjectif initial retrouver les valeurs dun point de lespace partir de collections
distinctes doit tre analys en fonction de la modlisation du monde rel. La
premire rponse, cest lintroduction de procdures permettant de grer les
transferts dchelle, la fois par des procdures dagrgation, par des procdures de
changement de type dimplantation spatiale, par des procdures dinterpolation, par
des procdures dextrapolation. Lautre rponse, complmentaire, consiste
documenter les bases de donnes par lintroduction systmatique de mta-donnes
permettant lutilisateur de revenir la gense de linformation et dviter les
cueils dune utilisation errone. Elle consiste galement introduire dans le schma
de la base de donnes des mthodes dutilisation de ces donnes, de manire
proposer lutilisateur un ensemble de mthodes dexploitation qui dpendent non
seulement du type des objets, mais galement de leur contenu smantique et de leur
prcision gographique.
Enfin, lergonomie du logiciel est importante : elle doit permettre la fois
lapproche exploratoire et la reprsentation cartographique des rsultats, chaque
tape de la requte. Ces deux objectifs sous-tendent la conception de lergonomie
du module dexploitation.
2.1.2. Architecture gnrale de SAVANE
Le systme SAVANE se caractrise donc par une stricte application de la
logique et des concepts des base de donnes, notamment relationnelles et objets, aux
objets gographiques localiss. Il y a d'abord le concept d'objet, qui est l'entit de
base gre par le systme : une zone dans une carte, un individu dans un
recensement, un tronon de rseau, etc. Chaque objet est dcrit par un certain
nombre d'attributs, comme un nom, des coordonnes, des valeurs numriques. Le
systme gre des objets et les valeurs des attributs qui les dcrivent. On regroupe les
objets qui sont dcrits par les mmes attributs dans des collections, que l'on appelle
relations ou tables : le schma d'une relation, c'est l'ensemble des attributs servant
dcrire les objets de la relation, ainsi quun ensemble de mthodes pouvant tre
appliques ces objets. L'ensemble des schmas des relations donne le schma de la
base de donnes, qui est constitue quant elle des objets de toutes les relations. Le
systme stocke et gre les objets en s'appuyant sur cette structure de relation collections d'objets du mme type - et traite les objets grce leur description par
attributs - variables dont les valeurs dcrivent l'objet : le systme SAVANE est
construit sur le principe des systmes de gestion de donnes relationnels [SOU 87].

Prsentation du systme SAVANE 27


Lorsqu'un objet est gographique, il est souvent localis, c'est--dire que l'on
tient compte de sa position dans l'espace en deux ou trois dimensions, et cette
position sert aussi dcrire l'objet. On parlera d'attribut de localisation comme on a
parl d'attribut de description. Le schma d'une relation dont les objets sont localiss
- on dira une relation localise - comporte donc toujours un attribut de localisation :
c'est la gestion de cet attribut qui fait la diffrence entre un SIG (systme
d'information gographique) et un simple SGBD (systme de gestion de base de
donnes). Le systme SAVANE tend la gestion relationnelle lattribut de
localisation : il utilise la localisation pour mettre les objets dune collection en
relation avec les objets dune autre collection.
La localisation d'objets gographiques peut tre zonale (l'objet est une zone; une
collection de zones donne une relation zonale, ou de type zone), linaire (l'objet est
une portion de ligne, et la relation correspondante est dite linaire), ponctuelle (la
localisation est donne par un point, la relation est dite ponctuelle), ou encore
donne sous forme d'image numrique go-rfrence (les objets sont alors les
pixels qui forment l'image). La localisation peut tre donne sous forme vectorielle
(des contours, des arcs) ou sous forme matricielle (des pixels) : de toutes les faons,
le systme SAVANE cre partir des vecteurs une reprsentation matricielle
lorsqu'il en a besoin, lors de l'exploitation des donnes. Il peut galement crer des
vecteurs partir de pixels dune image. Ces diffrents types de localisation
correspondent des types de base pour les objets : zone, ligne, point, pixel. A
chaque type correspondent des mthodes particulires (par exemple, la surface pour
les zones), mthodes accessibles directement dans les menus de SAVANE. Ce
modle de donnes reprend donc la schmatisation cartographique de la ralit
gographique.
La saisie et le stockage de la localisation des objets gographiques impliquent
des procdures tout fait spcifiques ces objets, et l'administration d'une base de
donnes gographiques ncessite aussi quelques connaissances en cartographie (les
projections, le redressement, les chelles, la prcision gographique, la
gnralisation, etc.).
La structuration des donnes dans SAVANE correspond au modle relationnel
des systmes de gestion de base de donnes tendu aux donnes gographiques
localises. Il s'oriente galement vers le modle objet par l'introduction de classes
d'objets et de mthodes sur ces classes. L'architecture gnrale est celle d'un
calculateur base de donnes simplifi : il possde un dictionnaire des donnes,
indiquant les relations, attributs, mthodes, ainsi que leurs caractristiques (types,
dfinition du schma interne associ), un dictionnaire des accs permettant de grer
les niveaux externes (par l'allocation de droits et la dfinition de l'accs aux
donnes), un langage de commande permettant d'interroger et de manipuler les

28

Chapitre 2

donnes suivant une structure client/serveur. Chaque opration utilise ces trois
structures pour accder au niveau interne et au systme de gestion de fichier.
Le systme SAVANE cre et administre ses propres bases de donnes, intgrant
dans un mme ensemble l'information descriptive et l'information de localisation,
contrairement la plupart des SIG qui utilisent un SGBD classique pour les donnes
descriptives et crent le lien entre descriptif et graphique au moment de
l'exploitation des donnes. L'information de localisation est conserve dans sa forme
originale, vectorielle ou pixel selon la modlisation d'origine. Le systme se charge
de l'ensemble des oprations de changement de type (vecteur-raster ou rastervecteur notamment) en fonction des besoins de l'utilisateur : il privilgie toujours
l'aspect fonctionnel l'aspect technique. Tous les points sont dcrits par leurs
coordonnes gographiques dans un datum unique. La projection gographique de
restitution peut tre choisie par l'utilisateur lors de l'interrogation des donnes.
Les relations localises sont indexes sur la localisation par la notion naturelle de
feuille, chaque feuille correspondant une coupure de carte. Toute recherche dans
une relation localise passe par la recherche des feuilles concernes par le territoire
d'tude. Chaque relation localise possde son propre ensemble de feuilles, puisque
cette indexation dpend essentiellement de la densit des objets propre une
relation donne. Cette indexation sapparente donc un dcoupage en grille
adaptative.
Lexploitation des bases de donnes est multi-utilisateur. Linterrogation se fait
sous forme de requtes, dans une dmarche exploratoire. Le systme gre les
requtes de chaque utilisateur en crant des tats temporaires, propres lutilisateur,
sans modifier la base de donnes.
Lextension du modle relationnel sur la localisation permet de joindre les objets
de la base sur la localisation, lors dune requte, partir dune gestion en relation.
Mais la gestion seule est insuffisante pour rpondre aux besoins danalyse qui sont
omniprsents lors de lexploitation de donnes gographiques. Le systme
comprend donc de nombreuses fonctionnalits danalyse. De plus, les diffrences de
prcision dans la localisation, dues aux diffrences dchelle de description des
objets, rduisent le caractre universel de la localisation en tant quattribut de
jointure. Nous avons donc dvelopp dans le systme SAVANE de nombreuses
procdures pour rpondre aux besoins de jointures spatiales lorsque la simple mise
en relation sur la localisation ne peut tre utilise. Lextension du modle relationnel
se fait donc plusieurs niveaux : dune part par lextension des oprations
classiques de lalgbre relationnelle lattribut de localisation, et dautre part par
lintroduction de fonctionnalits permettant de rsoudre les problmes de transfert
dchelle.

Prsentation du systme SAVANE 29


2.1.3. Administrer une base SAVANE
Le schma d'une base comprend la dfinition des relations, des attributs, et des
mthodes. Contrairement aux SGBD classiques, chaque relation a ici un type, qui
dfinit le type des objets contenus dans la relation, et permet dassocier des
mthodes de base uniquement lies au type dimplantation gographique (comme le
primtre ou la surface pour les zones, ou la longueur pour les lignes, etc.). La
structuration et la gestion interne sont galement propres chaque type dobjet. Les
types supports par SAVANE correspondent aux objets habituellement rencontrs
en gographie : zone, ligne, point, pixel, non localis. Tous les objets d'une mme
relation sont donc du mme type. La localisation des objets gographiques est
conserve dans le repre d'un datum commun, en coordonnes sphriques et hauteur
au-dessus du gode. Le schma d'une base est conserv dans un dictionnaire de
donnes ; tous les modules du systme accdent ce dictionnaire pour lire le schma
et utiliser une base de donnes. Les bases de donnes sont cres et administres par
le module dadministration, qui est spar des modules dexploitation. Ce module
gre galement les vues externes, qui permettent aux modules d'exploitation d'avoir
une vision diffrente de la base, par le choix ou le regroupement logique de
relations, d'attributs et de mthodes. Il gre galement les mta-donnes, pour les
relations, attributs et mthodes.
L'administration d'une base de donnes est un travail en soi ds que la base
atteint des dimensions importantes. Pour grer une base de donnes gographiques
avec le systme SAVANE, et comme pour toute base de donnes, il faut rflchir
la structuration des donnes, leur organisation, leur gestion, la manipulation
des donnes, ainsi qu' la formation des utilisateurs : c'est l'administrateur de la base
de donnes qui en aura la charge, poste fondamental pour le bon fonctionnement du
systme. En revanche, un utilisateur du systme d'information n'a pas se
proccuper de l'administration de la base de donnes, ni de celle de la machine sur
laquelle il travaille. Il se consacrera uniquement l'exploitation des donnes, en
supposant la base fiable, mise jour, prte l'emploi.
D'une manire gnrale, l'administration d'une base SAVANE, de sa cration
son exploitation, peut se rsumer en plusieurs grandes tapes : dcrire, saisir,
intgrer, modifier :

Dcrire ...
Pour crer une base de donnes il faut, avant tout, dcrire cette base, dcrire les
donnes, indiquer comment se regroupent les objets, quels sont les attributs, leurs
types, etc. C'est la premire tape, celle de la rflexion, de la structuration, de la
schmatisation, de la description, pour crer ce que l'on appelle le schma de la base
de donnes.

30

Chapitre 2

Une fois cr le schma de la base, l'administrateur pourra dfinir des utilisateurs


et leur allouera des droits d'utilisation.

Saisir ...
Une fois dfini le schma d'une collection d'objet, nous savons quels sont les
attributs qui dcrivent chaque objet. Il faut donc saisir, pour chaque objet, la valeur
de ces attributs. Si les objets sont localiss, et que l'on a dcid dans le schma de
prendre en compte cette localisation, il faut galement saisir la partie graphique des
objets, en fonction du type de la relation.
Cette tape, dans le cas de grandes bases de donnes, est contraignante, longue
et lourde, et il convient de la grer avec le plus grand soin car elle est bien sur trs
importante.

Intgrer ...
La saisie des donnes se fait, disons, par morceaux. Les donnes peuvent tre
htrognes : diffrences de formats, de codages... S'il s'agit de gographie et de
localisation, les problmes sont plus nombreux. Entre la saisie et la base de donnes,
il y a donc une phase d'intgration des morceaux dans l'ensemble homogne que
constitue une base de donnes SAVANE. Intgrer, c'est donc lire des donnes
(graphiques ou descriptives) dans des fichiers pour les rcrire dans un ensemble la base de donnes proprement dite - qui se constitue peu peu. Il est important de
noter que cette phase d'intgration lit des donnes pour crer ou modifier une base
de donnes qui sera indpendante de ces fichiers (qui ne serviront plus dans
SAVANE aprs l'intgration). Les fichiers contiennent soit des donnes descriptives
(des valeurs qualitatives, des valeurs quantitatives, des dates, etc.), soit des donnes
graphiques provenant de la saisie graphique ou d'images.

Modifier...
Une fois la base constitue, il faut pouvoir la modifier pour corriger
d'ventuelles erreurs ou intgrer les volutions et modifications dans linformation.
Ces modifications se font grce des diteurs propres SAVANE, pour la partie
graphique comme pour les donnes descriptives. Ces diffrentes oprations ne
s'effectuent pas une fois pour toute. Il est courant de crer une base petit petit, de
modifier le schma pour rajouter des relations, des attributs, etc. Il est important,
pour l'administrateur de la base, de bien connatre toutes les phases indiques plus
haut, dans l'ordre comme chaque opration spare.

Prsentation du systme SAVANE 31


2.2. Prsentation fonctionnelle des diffrents modules
Le systme est compos de plusieurs modules, sparant les trois oprations
fondamentales que sont l'administration et la gestion, la saisie, l'exploitation.
2.2.1. SAVATECA : administration des bases de donnes
Le module SAVATECA regroupe lensemble des oprations de gestion et
dadministration des bases de donnes, indpendamment de leur exploitation. Il gre
la configuration du systme global (emplacement des bases de donnes,
emplacement des utilisateurs), les dictionnaires des bases de donnes, les vues
externes. Son utilisation est en principe rserv ladministrateur de la base de
donnes : un mot de passe permet den restreindre laccs.

2.2.1.1. Principes gnraux dadministration


Nous dcrirons plus tard lorganisation prcise des donnes graphiques et
descriptives dune base de donnes gre par SAVANE. Nous pouvons ds
prsent indiquer lorganisation gnrale du systme :
- Bases de donnes : tous les fichiers internes dune mme base de donnes
SAVANE (donnes, mthodes, accs, dictionnaire) sont regroups dans un seul
rpertoire, lexception des relations de type mosaque dont lemplacement peut
tre distinct (pour pouvoir les partager entre plusieurs bases de donnes). Le
rpertoire de la base peut se trouver nimporte o sur le rseau local. Le systme
SAVANE permet de grer plusieurs bases de donnes. Le schma dune base de
donnes est dcrit dans un fichier spcial (le fichier base), les vues externes
(description daccs aux relations, aux attributs et aux mthodes) sont dcrites dans
le fichier nomm fpacc.
- Utilisateurs : pour exploiter une base de donnes SAVANE, il faut tre un
utilisateur dclar du systme SAVANE. Lors de lexploitation, de nombreux
fichiers temporaires sont crs : ils seront stocks dans un rpertoire propre
lutilisateur. De mme, ce rpertoire de lutilisateur permet de stocker les cartes et
mthodes cres par cet utilisateur. Le rpertoire de lutilisateur peut se trouver
nimporte o sur le rseau.

32

Chapitre 2

- Excutables : les excutables peuvent tre installs nimporte o sur le rseau


local. Lors de la premire utilisation de SAVATECA, un rpertoire admin est cr.
Ce rpertoire contient les fichiers de configuration du systme.
Toute utilisation de lun des modules dexploitation que nous dcrirons plus loin
(SAVEDIT, SAVAMER, SAVANE) ncessite les trois paramtres suivants : nom
de la base, nom de lutilisateur, vue externe.
2.2.1.2. Configuration du systme
Le systme conserve dans le rpertoire admin les fichiers contenant les
informations relatives la configuration gnrale :
- Le fichier fpconf conserve le nom des bases de donnes dclares, avec
lemplacement physique du rpertoire contenant les fichiers de la base de donnes.
- Le fichier fpuser conserve le nom des utilisateurs avec lemplacement du
rpertoire propre chaque utilisateur.
2.2.1.3. Organisation dune base de donnes SAVANE : principe gnraux
Les objets sont regroups en collections, ou relations, suivant le principe des
bases de donnes relationnelles. Chaque individu d'une collection est dcrit par un
certain nombre de critres, ou attributs. Bien sr, ces critres sont les mmes pour
tous les objets d'une mme relation. Il existe dans Savane cinq types de relation,
suivant la dfinition gographique des objets : zones, lignes, points, pixels, non
localiss. Un objet est dcrit par des attributs descriptifs, plus un attribut graphique
dans le cas de relations localises.
On rencontre de nombreux types d'attributs descriptifs, parmi lesquels les plus
courant sont :
Nominal ou qualitatif : ceux qui prennent des valeurs nominales (une chane de
caractres). Certains attributs nominaux jouent un rle particulier : une cl est un
attribut dont chaque valeur correspond un seul objet (par exemple le numro
d'immatriculation est une cl de la relation voiture; le nom du propritaire n'est pas
une cl, car un mme propritaire peut avoir deux voitures).
Ordinal : ceux qui prennent des valeurs nominales que l'on veut pouvoir
ordonner,
Entier : ceux qui prennent des valeurs numriques entires,
Rel : ceux qui prennent des valeurs numriques quelconques (comme un prix).
Couleur 8 bits, 16 bits, RVB : la valeur de l'attribut correspond au codage d'une
couleur. Avec 8 bits, on peut coder 256 couleurs, avec 16 bits 64000. Une couleur
RVB comprend un niveau de rouge, un niveau de vert, un niveau de bleu, chaque
niveau tant cod sur 8 bits (256 valeurs possibles pour chaque niveau, soit 16
millions de couleurs possibles).

Prsentation du systme SAVANE 33


Date : ceux qui prennent la valeur dune date,
Son : la valeur de l'attribut correspond la description d'un son,
image : la valeur de l'attribut correspond une image ou une collection
dimages (album de photographies, documents scanns,),
vido : la valeur de lattribut correspond une squence vido,
graphe : la valeur de l'attribut correspond la description d'un graphe en deux
dimensions.
Chaque objet d'une relation localise est donc dcrit par un ensemble de valeurs
d'attributs descriptifs ainsi que par la valeur de l'attribut de localisation. L'attribut de
localisation napparat pas dans la liste des attributs d'une relation, il est sous-jacent
la dfinition mme de la relation et est gr directement par le systme. En fait, on
dfinit implicitement l'attribut de localisation lors de la cration de la relation, en
indiquant le type des objets (zone, ligne, point, pixel, non localis).
Dfinir des types d'objets en fonction de leur type de localisation revient en fait
se rapprocher du modle objet : nous avons cinq grandes classes d'objets, les zones,
les lignes, les points, les pixels, les objets non localiss, et chaque classe
correspond diffrentes fonctions de description, de stockage, d'intgration,
d'exploitation. Le systme SAVANE propose galement quelques types drivs des
types de base : ces types proposent dj la dfinition d'un certain nombre d'attributs
descriptifs.
A chaque relation sont associs des fichiers qui contiennent les valeurs des
objets. La description de la localisation est diffrente suivant le type de la relation.
Pour les relations de type zone, la localisation des objets est donne par les arcs
constituant la frontire de chaque objet : un fichier conserve la description de tous
les arcs de la relation, un autre fichier conserve les valeurs des attributs descriptifs,
et un troisime fichier donne lindexation primaire suivant la localisation. Pour les
objets de type ligne, la structure est presque identique, mais la localisation ne fait
pas rfrence la notion de frontire, et la localisation dun objet est dcrite par des
arcs qui nappartiennent qu un seul objet. Pour les objets de type points, la
localisation est donne directement par les coordonnes, et est conserv dans le
fichier des valeurs descriptives : ce type de relation ne comprend donc que deux
fichiers, lun pour la localisation et les donnes descriptives, lautre pour
lindexation gographique. Nous reviendrons en dtail sur lorganisation interne
dune base SAVANE dans le chapitre 3.
Le module SAVATECA permet de grer lensemble de lorganisation dune
base, que ce soit pour la description des relations, pour la gestion des fichiers
associs chaque relation, pour la gestion des objets de chaque relation, pour la

34

Chapitre 2

gestion des vues externes, ou pour la gestion des utilisateurs et lutilisation en


rseau.
2.2.1.4. Cration dune base de donnes
Le module SAVATECA permet de crer une base de donnes SAVANE. Lors de
la cration, lutilisateur doit indiquer le nom de la base, son emplacement sur le
rseau, lespace gographique concern. Cette dclaration va crer lensemble de la
structure ncessaire une base de donnes : un rpertoire lemplacement indiqu,
et dans ce rpertoire, le dictionnaire de la base (fichier base), le fichier des vues
externes (fichier fpacc). La description de la fentre gographique de la base (espace
gographique concern par cette base) est stocke dans le dictionnaire de la base.

2.2.1.5. Gestion du schma


Le schma dune base de donnes contient la description des relations, des
attributs, et des mthodes. Cette description est conserve dans le fichier base : cest
le dictionnaire de la base. Pour chaque relation, ce dictionnaire comprend :
- le nom de la relation
- le type de la relation (zone, ligne, point, image, non localis)
- le nombre dattributs descriptifs
- le nom des fichiers associs (objets et valeurs descriptives, objets graphiques
associs)
- la description des attributs

Prsentation du systme SAVANE 35

Pour chaque attribut, la description comprend :


- le nom de lattribut
- le type de lattribut (nominal, ordinal, entier, numrique, date, RVB, etc.)
- le nombre de valeurs nominales (dans le cas dun attribut nominal)
- ladresse de la premire valeur nominale dans le fichier des valeurs dattributs
(dans le cas dun attribut nominal).
La lecture du dictionnaire permet au systme de charger le schma des donnes
et lensemble des paramtres permettant daccder aux objets (donnes graphiques
et descriptives). La classe CDico permet dencapsuler lensemble des oprations de
lecture et dcriture du dictionnaire de la base de donnes (A.1.3.).
2.2.1.6. Gestion des vues externes
Une vue externe permet de donner lutilisateur une autre vision de la base de
donnes. Il est possible dexclure un certain nombre de relations, dattributs ou de
mthodes, de modifier lordre des relations ou des attributs, et de prsenter relations,
attributs et mthodes en groupes. La vue externe est donc un ensemble dindirection
entre le schma interne de la base et le schma externe prsent lutilisateur.
Les vues externes sont conserves dans le fichier nomm fpacc, qui se trouve
dans le rpertoire de la base de donnes. Le programme SAVATECA permet de
grer les vues externes : cration, modification (ajout ou suppression de relations,
dattributs ou de mthodes, ordre, regroupement), suppression. Une classe
CFpaccV8 encapsule lensemble des manipulations de ce fichier (A.1.4.).
2.2.1.7. Intgration dobjets
La constitution dune base de donnes se fait par intgrations successives
dobjets dans la base. Pour les objets localiss, lintgration se divise en deux phases
distinctes : la premire phase consiste crer les objets en intgrant lattribut de
localisation (saisi ou import dans le module SAVEDIT) et un identifiant pour

36

Chapitre 2

chaque objet. La seconde phase permet dintgrer les valeurs descriptives des objets
en utilisant lidentifiant comme attribut de jointure. Ces valeurs descriptives peuvent
provenir dun fichier classique ou dune base de donnes relationnelle classique. Les
valeurs des attributs des objets sont alors lues dans ces fichiers et recopis dans la
base Savane.
Pour les relations localises, chaque phase de cration cre un groupe dobjets
dont ladresse et la position gographique en deux dimensions sont conserves par
le systme et quil utilise lors de lexploitation de la base comme indexation
primaire, dans une structure squentielle indexe en deux dimensions.
Une fois des objets intgrs dans la relation, il est bien sr possible de modifier
le schma de la relation en ajoutant ou supprimant des attributs. Il est galement
possible de modifier les valeurs des objets. Ces oprations modifient le contenu de
la base de donnes.
Les attributs sont grs diffremment suivant leur type. Par exemple, les valeurs
des attributs nominaux sont codes et les modalits sont conserves dans un fichier
(fpvaleurs) spar des fichiers conservant les valeurs des objets.
Nous verrons en dtail dans le chapitre 5 lorganisation du stockage des objets et
les principes de leur indexation dans une base de donnes Savane.
2.2.1.8. Gestion des utilisateurs
Le systme SAVANE est conu pour tre multi-utilisateur et pouvoir tre utilis
dans un rseau local dordinateur. Comme de nombreux fichiers temporaires sont
crs lors de lutilisation du systme, chaque utilisateur doit avoir un espace de
travail distinct pour stocker ses propres fichiers temporaires. Le module
SAVATECA permet donc dadministrer ces utilisateurs (cration, modification,
suppression). La description des utilisateurs (nom, rpertoire de stockage) est
conserve dans le fichier fpuser, qui se trouve dans le rpertoire spcial admin. Le
rpertoire de stockage dun utilisateur peut se trouver nimporte o sur le rseau
local.
2.2.2. SAVAMER : go-rfrencement dimages et constitution de mosaques
Le systme comporte deux modules de saisie graphique, lun pour les images,
lautre pour les donnes vectorielles. Le module SAVAMER permet de gorfrencer des images raster et de les intgrer dans une relation de type image.
Pour tre intgrs dans une relation de la base de donnes, les pixels dune
images doivent tous tre go-rfrencs : la position de chaque pixel doit tre

Prsentation du systme SAVANE 37


connue. Bien souvent, limage que lon souhaite intgrer dans une base nest pas en
conformit gographique avec la ralit, et il faut la redresser, cest--dire modifier
la position dun certain nombre de ses pixels pour les remettre leur position
gographique correcte. Limage dorigine doit donc tre dforme.
Les objets dune relation de type image sont des pixels dfinis sans ambigut,
pour leur position comme pour leur taille. Pour affecter une valeur un objet pixel
de la relation partir dune image, il faut donc savoir quels sont les pixels de
limage qui participent la dfinition de la valeur de lobjet pixel de la relation.
Lopration de go-rfrencement consiste donc en une opration de redressement
(repositionnement des pixels dans lespace) et une opration de r-chantillonage
(modification de la taille des pixels de limage).
A partir dune image non go-rfrence, le module SAVAMER cre donc une
nouvelle image, par redressement et r-chantillonage. Les paramtres de cette
nouvelle image sont alors compatibles avec les paramtres de la relation qui doit
recevoir les valeurs (projection gographique, taille de pixel). Une fois cette
opration effectue, le module SAVAMER permet dintgrer les valeurs de limage
un attribut de la relation.
2.2.2.1. Le go-rfrencement
Le go-rfrencement a pour objet la mise en conformit gographique de
limage. Lopration a donc pour objet de placer chaque pixel de limage dorigine
sa position gographique exacte. Comme il nest pas possible dindiquer
manuellement la position exacte de chaque pixel de limage, on utilise des fonctions
de dformation globales ou semi-locales. Le choix de la fonction de dformation
dpend de la dformation suppose de limage. Certains paramtres de dformation
sont intrinsques au type de capteur, comme la position et le type de capteur dun
satellite ou lobjectif dun appareil de prise de vues ariennes. Les autres paramtres
doivent tre calculs partir de points dappui entre image et position dans le plan
de projection, et par lutilisation dun modle numrique pour la prise en compte de
la dformation due aux diffrences daltitude.
Le module SAVAMER permet la saisie de points dappui (fig. 2.1) et le
redressement, en donnant le choix de la fonction de redressement : similitude,
projection centrale, fonction polynomiale de degr 1 ou 3, tessellation, etc.
Plusieurs fonctions de redressement peuvent tre combines : il est courant
deffectuer une transformation globale (de type projective ou de degr1) suivie de
transformations locales (par exemple, redressement de degr 1 dans les triangles
issues dune tessellation partir de points dappui).

38

Chapitre 2

fig. 2.1 : exemple de prise de points damers avec SAVAMER

2.2.2.2. Le r-chantillonage
Les pixels dune relation sont dfinis sans ambigut, taille et position. La taille
de ce pixel peut tre diffrente de celle -suppose- des pixels de limage dorigine.
Pour savoir quelle valeur affecter un pixel de la relation partir des pixels dune
image, il faut calculer, par go-rfrencement, quels pixels de limage dorigine
participent par leur position la dfinition de la valeur du pixel de la relation, puis,
par une opration de r-chantillonage, il faut affecter une nouvelle valeur partir
de ces pixels.
Plusieurs mthodes peuvent tre employes pour effectuer cette opration. La
plus simple consiste prendre la valeur du pixel de limage dorigine le plus proche
(plus proche voisin), mais il est galement courant de faire une moyenne sur les
pixels voisins, par un calcul bilinaire ou bicubique. Ces trois oprations de rchantillonage sont implants dans le module de redressement de SAVAMER.
2.2.2.3. Le mosaquage et lintgration
Lopration de mosaquage permet dintgrer une image go-rfrence un
attribut dune relation de type pixel. Le systme SAVANE gre ces attributs de
manire permettre des ensembles de pixels plus complexes que des images
rectangulaires. Lopration dintgration consiste donc, partir dune image gorfrence, crer des objets pixels dans une relation (si ces objets nexistent pas
dj), et affecter les valeurs des pixels de limage un attribut dans cette relation.
On constitue ainsi une mosaque (fig. 2.2) dont la gestion est entirement la

Prsentation du systme SAVANE 39


charge du systme, et dont la structure externe est identique celle des autres types
de relation.

fig. 2.2 : exemple de constitution de mosaque dimages go-rfrences

Nous verrons en dtail dans le chapitre 6 lorganisation du stockage des objets


pixels, les principes de leur gestion dans une base de donnes Savane, ainsi que les
algorithmes utiliss pour le redressement et le r-chantillonage.
2.2.3. SAVEDIT : saisie vectorielle sur cran avec gestion des contraintes
dintgrit
Le module SAVEDIT permet la saisie et la correction de lattribut de
localisation pour les objets dont la localisation est donne sous forme de zone, de
ligne, ou de point, partir de plans ou de cartes. Il permet galement limportation
de documents provenant dautres logiciels (format ShapeFile ou DXF). La saisie est
dite vectorielle car le rsultat est stock sous forme discrte densembles de points,
permettant de schmatiser les contours des zones ou les arcs des lignes.
2.2.3.1. Principes gnraux
La saisie se fait sur cran avec une souris. Le support de la digitalisation peut
tre une carte ou un plan, go-rfrenc (grce au module SAVAMER) et visualis
sur lcran. Lutilisateur peut galement visualiser lensemble des objets dj
intgrs dans une base de donnes. De nombreuses options permettent de choisir
lespace gographique affich lcran.

40

Chapitre 2

Contrairement aux logiciels de saisie graphique (de type AUTOCAD) qui


permettent la saisie, dans un mme document, dobjets de diffrents types (des
zones, les lignes, du texte, des symboles, etc.), un document SAVEDIT ne doit
contenir que les objets dune mme collection, destins tre intgrs dans une
mme relation. La saisie se limite, pour chaque objet, la description de la
localisation, et la saisie dune valeur propre chaque objet (un identifiant, ou cl)
qui sera utilis par la suite comme cl de jointure pour lintgration des valeurs
descriptives de lobjet. Aucun attribut de dessin (couleur, type de trait, symbole,
etc.) nest indiqu lors de la saisie (fig. 2.3). Ces attributs de dessin seront affects
par la suite chaque objet en fonction de leurs attributs descriptifs, dans le
processus dinterrogation et dexploitation de la base de donnes effectus grce au
module SAVANE.

fig. 2.3 : la saisie sur cran avec le module SAVEDIT

Puisque la saisie suit la schmatisation du rel en collections, cette saisie doit


satisfaire de nombreux contrles de cohrence lies cette description. Par exemple,
les zones doivent tre fermes ; les zones dune mme relation ne doivent pas avoir
dintersection ; les arcs ne doivent pas se croiser ; etc. Nous verrons en dtail dans le
chapitre 6 les contraintes dintgrit qui psent sur lattribut de localisation, et les
algorithmes employs dans le module SAVEDIT pour vrifier ces contraintes et
produire des document exempts derreurs.
Le module SAVEDIT prsente galement de nombreuses fonctionnalits propres
amliorer les performances de lopration de saisie graphique. Par exemple :
gestion de la prcision et de la connexit entre arcs ; jointure automatique darcs ;
division automatique darcs en cours de saisie sur lintersection ; vrification

Prsentation du systme SAVANE 41


permanente de la fermeture des zones ; suppression automatique darcs en double ;
etc. Nous prsenterons en dtail dans le chapitre 7 (contraintes dintgrit spatiale)
la mise en uvre et les algorithmes utiliss par SAVEDIT.
Chaque point saisi sur lcran est transform en coordonnes gographiques
(longitude, colatitude) selon le datum et la projection gographique utiliss. Tous les
points sont donc conservs en coordonnes sphriques. Le datum dun document
peut tre modifi : dans ce cas, lutilisateur a le choix de transformer ou non les
coordonnes des points saisis. Ceci peut tre ncessaire car tous les objets dune
base de donnes SAVANE doivent tre exprims dans le mme datum.
2.2.4. SAVANE : exploitation des bases de donnes et cartographie
Le module dexploitation SAVANE est le principal module du systme. Il
intgre un ensemble tendu de fonctionnalits pour linterrogation, le traitement et
la reprsentation des informations contenues dans une base de donnes
gographiques. Lutilisation de SAVANE ne rclame pas lapprentissage dun
langage de commande spcifique. Linterface rassemble dans un environnement
ergonomique une grande varit doutils de consultation, de cartographie, de
recherches multicritres, danalyse statistique, de superpositions, go-jointures,
lissages, danalyses ditinraires et de voisinage, de modlisation. Le logiciel est un
outil polyvalent et intgr qui permet dapprhender rapidement toutes les facettes
du travail dexploitation dun SIG.
2.2.4.1. Cartes, cadres et requtes
Le document de base du logiciel SAVANE est une carte, cest--dire une feuille
de papier destine contenir une reprsentation graphique de donnes
gographiques. A lentre dans SAVANE aprs avoir indiqu le nom de la base,
lutilisateur et la vue externe - apparat donc une feuille de papier sur lcran. Cette
feuille contient par dfaut un cadre gographique (fig. 2.4).
Un cadre gographique correspond au rsultat dune requte sur la base de
donnes : SAVANE utilise le principe de la requte pour linterrogation dune base
de donnes. Il faut enchaner les oprations, le rsultat de lune pouvant servir
dentre la suivante. Une interrogation, une requte, est donc compose dun
ensemble doprations que lon dclenche grce au menu principal, et que lon peut
conserver sous forme de macro-commande.
Un cadre peut donc tre vu comme une fentre sur la base de donnes contenant,
un moment donn, un tat temporaire de la base correspondant une interrogation
et aux oprations effectues (calculs, cration de nouvelles variables, croisement et
jointure dobjets, etc.). Ltat temporaire de la base li au cadre est conserv avec la

42

Chapitre 2

carte qui contient le cadre, ainsi que la macro-commande correspondant toutes les
oprations effectues dans ce cadre. En plus de la requte et de ltat temporaire de
la base, au cadre sont attachs des paramtres qui lui sont propres (espace visualis,
projection gographique, chelle de trac, visualisation des amorces gographiques
ou de projection, type de dessin pour le bord, position dans la carte).

fig. 2.4 : lcran principal de SAVANE avec une carte contenant un cadre

Une carte peut contenir simultanment jusqu dix cadres diffrents. Elle doit en
contenir un au minimum. Un cadre doit tre slectionn dans la carte pour avoir
accs aux menus des commandes dinterrogation de la base de donnes. Le cadre
correspond un espace gographique, dlimit par le bord du cadre. La requte lie
au cadre utilise par dfaut cet espace gographique pour slectionner les objets de la
base, mais lutilisateur peut spcifier une fentre gographique diffrente pour la
requte, ou modifier lespace de visualisation du cadre sans modifier la fentre
gographique de la requte. Dans un cas, la fentre de la requte correspond une
opration de slection des objets de la base de donnes, dans lautre cas, lespace de
visualisation du cadre correspond un espace de dessin dans la carte, une chelle
donne par lutilisateur.
Un certain nombre de classes correspondent ces objets : la classe CCarte
(A.2.4.1.) pour encapsuler lensemble des variables et des oprations correspondant
la carte dessine sur lcran, la classe CCadre (A.2.4.4.) pour les cadres
gographiques, les classes CWind (A.2.3.1.) et CProjection (A.2.3.2.) pour
dcrire la fentre gographique de travail et la projection gographique utilise dans
un cadre, et la classe CSchema (A.2.1.2.) pour dcrire ltat de la base de donne
correspondant la requte effectue dans un cadre.

Prsentation du systme SAVANE 43


Nous allons ici dcrire rapidement les classes CCarte et CCadre. Les autres
classes essentielles seront dcrites en dtail dans les chapitres 4 (CProjection et
CWind) et 5 (CSchema, CRelation, CAttribut).
2.2.4.2.1. La classe CCarte
Comme nous lavons dj dit plus haut, le document de base du logiciel
SAVANE est une carte : une feuille de papier destine contenir une reprsentation
graphique de donnes gographique. Il nexiste quun seul objet de type CCarte par
session de travail dans SAVANE (on ne peut avoir plusieurs cartes ouvertes en
mme temps, il faut fermer une carte pour en ouvrir une autre). La classe CCarte
encapsule toutes les informations et oprations propre une carte (A.2.4.1.).
Les seuls membres lis la base de donnes sont les pointeurs des objets de type
CCadre (CCadre* m_pCadre[NB_MAX_CADRES]). Tous les autres membres et

mthodes de cette classe sont lies la reprsentation graphique de la carte, sur


lcran ou sur limprimante. Outre des cadres, une carte peut contenir des objets
graphiques provenant du dessin direct effectu lcran. Ces objets sont grs par la
classe CODD (A.2.4.2.). Les ODD reprsentent des classes propres chaque type
dobjet graphique (texte, ligne, polyligne, polygone, rectangle, rectangle dgrad,
cercle, ellipse, symbole, chelle graphique, bitmap). Par exemple, la classe
CODD_Symbole encapsule toutes les informations ncessaires la manipulation des
objets graphiques de type symbole (A.2.4.2.). Les objets graphiques sont conservs
dans la carte par le tableau des pointeurs des objets de type CODD correspondants.
Toutes les coordonnes des objets sont conserves en mm/100 dans le repre de
la carte (origine : point bas-gauche de la feuille, unit mm/100). Plusieurs
procdures permettent de passer des coordonnes carte aux autres repres
prsents dans le systme : vue (cran ou imprimante), cadres, coordonnes
gographiques, projection gographique, coordonnes dans la base de donnes
(A.2.4.).
2.2.4.2.2. La classe CCadre
La classe CCadre (A.2.4.4.) est essentielle : elle encapsule toutes les donnes et
mthodes lies une interrogation de la base de donnes et la reprsentation
graphique du rsultat obtenu. La classe regroupe toutes les donnes et mthodes
permettant de dcrire, stocker et dessiner le rsultat dune requte. La description et
le stockage de ltat de la base de donnes utilise les classes CSchema (description
de ltat de la base de donnes, voir chapitre 3), CWind et CProjection
(description de lespace dtude et de la projection gographique utilise dans le
cadre, voir chapitre 4), CMacro (gestion des oprations relationnelles effectues
dans le cadre, A.2.1.4.). La description des paramtres de reprsentation graphique

44

Chapitre 2

du rsultat de la requte du cadre est conserve dans un objet de la classe


CCartExplorateur (A.2.4.5.), que nous prsenterons au chapitre 9.
2.2.4.2. Principales oprations de manipulation de donnes
Les principales oprations concernent linterrogation relationnelle des donnes
gographiques dans un cadre. Toutes ces oprations sont accessibles par les menus
et les dialogues :
- restriction, par formule, par valeur, ou sur un espace gographique,
- suppression de relations ou dattributs, correspondant lopration
relationnelle
de projection,
- jointures (classique, semi-jointure, jointures gomtriques, semi-jointures
gomtriques),
- agrgations,
- regroupement thmatique dobjets dune mme relation,
- go-jointures suivies dagrgations.
Outre les oprations relationnelles utilisant la localisation comme cl de jointure,
des oprations sont spcifiques la localisation des objets :
- calculs mtriques (longueurs, primtres, surfaces),
- cration de zones tampons,
- calculs de distance entre objets,
- calculs de proximit ou faisant intervenir les voisins (comme par exemple les
calculs de texture dans une relation de type pixel),
Plusieurs oprations permettent de changer de type dobjet gographique,
comme par exemple :
- procdures dinterpolation, permettant de passer dun type ligne ou point un
type pixel,
- procdures de rasterisation, permettant de passer dun type zone un type
pixel,
- procdures de vectorisation, permettant de passer dun type image un type
zone ou ligne.
De nombreuses autres oprations sont disponibles. Elles concernent
essentiellement la cration de nouveaux attributs partir des attributs dune relation,
et lexploration statistique des attributs. Par exemple, on peut crer de nouveaux
attributs dans une relation :

Prsentation du systme SAVANE 45


- par calcul numrique ou logique entre les autres attributs de la relation. Il suffit
dindiquer la formule, qui peut contenir des oprateurs logiques (and, or, xor, not)
comme des oprateurs numriques.
- par agrgation statistique (moyenne, somme, cart-type, etc.) dun attribut
numrique par rapport un attribut nominal,
- par combinaison, comparaison, tri, etc.,
- par classification, pour crer un attribut nominal partir dun attribut
numrique (classifications par intervalles, par quantiles, par progression, par
moyennes embotes, etc.).
Nous prsenterons toutes ces oprations partir du chapitre 5, aprs avoir dcrit
en dtail la structure et lorganisation des bases de donnes SAVANE.
2.2.4.3. Masques et distances
La cration de zones tampon, ou masques, permet de grer agrablement les
oprations de semi-jointures gomtriques. Un masque est dfini comme une zone
gographique sans attribut dont lobjectif est lutilisation ultrieure dans des
oprations de slection sur la localisation (appartenance ou non dun objet au
masque, lors dune opration impliquant lobjet). Les masques peuvent tre crs
directement en dessinant sur lcran, ou par rapport aux objets dune relation (avec
une distance permettant de crer un tampon autour de ces objets). Le systme
SAVANE permet de combiner des masques entre eux grce une algbre de
masques : intersection, union, union exclusive, diffrence, inversion. Il permet
galement les oprations morphologiques drosion et de dilatation. Les masques
sont conservs par le systme la fois sous forme vectorielle et sous forme
matricielle. La forme matricielle est recalcule chaque changement despace
gographique de travail.
2.2.4.4. Macro-commandes et mthodes
Toutes les oprations ralises pendant une session de travail dans un cadre sont
conserves dans une structure de macro-commande, lie au cadre.
Cette macro-commande peut tre excute de nouveau pour actualiser ltat de la
base de donnes li au cadre, et donc li la requte associe.
Une macro-commande peut galement tre cre directement par lutilisateur, en
enregistrant une partie dune requte. Cette macro-commande peut ensuite tre
excute de nouveau, et tre intgre dans la structure de la base comme une
mthode sur les relations de la base. La base de donnes initiale peut donc senrichir
peu peu de mthodes dutilisation des donnes. Une mthode est soit lie une
relation, si les procdures utilises ne font appels quaux seuls attributs de cette

46

Chapitre 2

relation, soit lie directement la base, si elle fait appel aux attributs de plusieurs
relations.
Le schma des donnes, initialement relationnel (mis part les types dobjets
lies la localisation), se rapproche donc du modle objet, en encapsulant donnes
et mthodes dans une mme structure. On bnficie ainsi la fois de la gestion de la
localisation (SIG) et de la gestion objet (BDOO) dans un mme systme.
2.2.4.5. Edition cartographique et impression
Puisque le systme gre et manipule des donnes localises, il faut pouvoir
reprsenter le rsultat dune requte, exactement comme lon peut choisir les
attributs graphiques dune liste de valeurs (police, taille des caractres, largeur des
colonnes, etc.) pour les imprimer sous forme de tableau. Pour des donnes bidimensionnelles, le processus est plus complexe puisque le rsultat dune requte
peut tre lui-mme bi-dimensionnel, et le processus de reprsentation sapparente
alors une cartographie.
Le systme comporte donc naturellement un certain nombre de possibilits de
reprsentation visant associer valeurs (nominales ou numriques) ou types dobjet
des attributs graphiques : couleur, trame, symbole, type de trait, paisseur, etc.
Evidemment, les possibilits sont diffrentes en fonction du type dobjet
gographique : par exemple, on peut reprsenter une zone par son contour, ou
remplir lintrieur de la zone par une couleur et une trame, mais on ne peut
reprsenter un point que par un symbole.

Prsentation du systme SAVANE 47


Cette association ne se fait quau moment de reprsenter sur une carte le rsultat
dune requte dans un cadre. Pour cela, lutilisateur dispose dun explorateur
cartographique qui lui permet de choisir les relations dessiner dans le cadre, ainsi
que tous les paramtres permettant dassocier les valeurs dun attribut une
reprsentation graphique. Les lgendes sont un moyen dafficher ces paramtres : le
systme permet galement de dessiner les lgendes sous des formes classiques en
cartographie (caissons, symboles superposs ou contigus, etc.). Bien sr, la requte
peut tre vide : lutilisateur dessine alors les objets en fonction de leurs attributs
dorigine. Cest la dmarche habituelle lorsque lon utilise le SIG uniquement des
fins dexploration des objets.
Lexplorateur cartographique permet galement de dessiner des masques (en
indiquant couleur et trame), des images gorfrences, ainsi que des fonds
graphiques. Les fonds graphiques sont des fichiers contenant exclusivement du
dessin, sans la notion dobjet ou dattribut descriptif. Les fichiers au format DXF
sont un exemple de ce type de document. Le systme SAVANE permet
lutilisateur dafficher ce type de dessin dans un cadre, condition bien sr que les
coordonnes soient compatibles : le repre doit tre connu. Le dessin na pas
forcment besoin dtre dans la mme projection gographique que le cadre, le
systme se charge de la transformation de projection si un fichier dcrivant la
projection du document a t cr.
Le systme permet galement la reprsentation en trois dimensions si les
donnes sy prtent (fig. 2.5). Dans ce cas, limage calcule en perspective peut tre
colle dans la carte, ou sauvegarde comme un fichier image part.

fig. 2.5 : une image satellite mise en perspective grce un modle numrique de terrain

48

Chapitre 2

2.2.4.6. Utilisateurs et partage des bases de donnes


Chaque utilisateur doit avoir un espace de travail rserv car de nombreux
traitements crent des fichiers temporaires qui ne doivent pas tre mlangs entre
diffrents utilisateurs. De mme, les cartes et tous les objets graphiques quelles
contiennent sont stocks dans un rpertoire de lutilisateur qui les a produites. Cet
espace de travail est cr lors de la cration de lutilisateur avec le module
SAVATECA.
Les bases de donnes peuvent tre partages par tous les utilisateurs du systme.
Chaque module actualise le schma de la base ds quune modification a t
effectue par ladministrateur avec le module SAVATECA. Les tats temporaires
des bases de donnes sont stockes dans les cartes correspondantes, et se trouvent
donc dans le rpertoire de lutilisateur.
2.2.4.7. Vecteur et raster
Cest une question qui tait pose pendant de nombreuses annes aux
concepteurs de systmes dinformation gographique : vecteur ou raster ? La
question concernait le mode de stockage de linformation de localisation (par arc ou
par pixel) et, donc, implicitement, le mode de rsolution et la prcision de certaines
procdures impliquant la localisation, notamment pour les mises en relation spatiale.
Dans le systme SAVANE, le stockage des donnes gographiques est
rsolument vecteur, pour tout ce qui est point, ligne, ou zone. Le type pixel
sapparente un stockage raster, mais la rsolution (la taille du pixel) est variable et
est directement lie la prcision de la donne : il ny a pas de dgradation de
linformation due au stockage. Par contre, le systme cre une matrice raster pour la
rsolution rapide de certaines oprations impliquant des relations zonales ou des
masques, lorsque la prcision de cette matrice est suffisante pour lopration en
question, ainsi que pour amliorer les temps daffichage sur cran. Cette opration
de rasterisation est transparente pour lutilisateur.
2.2.5. SavATLAS : prsentation datlas et de donnes
Ce petit module permet de prsenter une srie de cartes et de notices associes,
sous forme dun atlas lectronique. Plusieurs chemins de lecture peuvent tre
associs la srie de cartes (fig. 2.6). Lutilisateur peut consulter les donnes
correspondantes aux objets reprsents dans une carte en cliquant directement sur
lcran. Les valeurs sont alors recherches dans la base de donnes.

Prsentation du systme SAVANE 49

fig. 2.6 : lcran principal dune application de type SavAtlas

2.2.6. SavLIBRARY : librairie de dveloppement C++


Cette librairie de classes C++ permet lintgration de fonctions de consultation
ou dinterrogation dune base de donnes SAVANE dans un programme C++. Elle
sinspire des objets de type DAO (DataBase Access Object) de la MFC (Microsoft
Fundation Class). Elle comprend notamment les classes suivantes :
- CSavaneDatabase : pour ouvrir une base de donnes Savane,
- CSavaneRelation : pour dcrire et utiliser une relation de la base de donnes
ouverte,
- CSavaneAttribut : pour dcrire et utiliser un attribut dune relation de la
base de donnes ouverte,
- CSavaneWind : pour dcrire et utiliser lespace gographique
dinterrogation, et pour grer les projections gographiques,
- CSavaneLecture, CSavaneRecordset, CSavaneArc, etc.
2.2.7. SavSERVEUR : serveur de requtes via Internet
Cette application permet dimplmenter une architecture client/serveur en
recevant les requtes de type SAVANE et en renvoyant sur le client le rsultat
obtenu. Linterrogation se fait via une liaison TCP/IP, et peut donc tre effectue via
Internet.

50

Chapitre 2

2.3. La constitution et lexploitation dune base de donnes avec SAVANE


2.3.1. La constitution d'une base de donnes gographiques
2.3.1.1 Mthodes de mise en place, d'administration, et d'exploitation
Comme pour tout systme dinformation, la mise en place dun SIG important
est une opration dlicate qui demande une approche rigoureuse et lvaluation
prcise des besoins et des moyens disponibles. Lanalyse gnrale dcrite ci-dessous
doit aboutir la dcision de faisabilit et au calendrier de mise en place. Elle se
compose de trois tapes principales :
- la rdaction dun cahier des charges dcrivant les objectifs et les besoins de
lapplication, lvaluation des donnes ncessaires au fonctionnement ainsi que les
flux dacquisition ;
- lvaluation des spcifications du systme et de ses objectifs, en fonction du
cahier des charges, puis ltude des systmes existants sur le march ; cette tape
doit dboucher sur une valuation de la faisabilit de lopration et des cots quelle
implique (matriel, fonctionnement) ;
- lvaluation finale des diffrents choix possibles en termes de bnfice et de
cots, en prenant en compte lensemble des conclusions des deux premires tapes.
A partir des dcisions dacquisition, lorganisation logique de la mise en place
et de lexploitation sera dcompose en sous-systmes suivant une analyse
organique prcise :
- un organe de mise en place et dadministration gnrale du systme, qui aura la
charge de rpondre aux besoins humains et financiers tout au long de la priode de
dveloppement et de mise en place, dtablir les plans de formation et dassistance
aux utilisateurs, de grer lvolution future en fonction des rsultats dexploitation.
Il aura galement la charge de rassembler et grer la documentation technique de
lensemble des sous-systmes ;
- un organe dacquisition de donnes qui va permettre de grer les divers flux
dinformations. Les flux peuvent tre rguliers ou propres une application prcise.
Il aura la charge dvaluer et de dcrire les sources dinformations, les modalits
daccs, les procdures dacquisition, et de construire et grer lensemble des mtadonnes. Cet organe est le plus important pour le fonctionnement rgulier dun
systme dinformation. Il devra galement guider et renseigner les utilisateurs en
insistant sur les contraintes imposes par un systme dinformation gographique :
conception uniforme des donnes, cot et dure de la saisie, cot de lexploitation,
etc. ;
- un organe de saisie et dintgration de donnes : structuration,
homognisation, validation, codage, saisie, contrle, correction et intgration des
donnes suivant les techniques requises par le systme dinformation et de manire

Prsentation du systme SAVANE 51


produire des informations directement exploitables. Les diffrents problmes de la
saisie graphique seront traits par cet organe ;
- un organe dexploitation et danalyse de donnes assurant la rponse aux
demandes des utilisateurs. Cet organe pourra tre conu de manire faire participer
les usagers lutilisation interactive des logiciels en fournissant assistance, conseils
et documentation. Il pourra galement tre conu comme un bureau d tude et
fournir les rponses aux questions poses en se chargeant de lensemble de la
procdure dexploitation et de mise en forme dfinitive des rsultats.
La nomination dun responsable ayant la direction de lensemble de ces organes
est essentielle : ladministration dune base de donnes est un poste de haute
responsabilit.
2.3.1.2 Difficults
Si les apports et possibilits dun systme bien gr sont trs importantes, les
contraintes dutilisation sont galement nombreuses. Pour peu quune mauvaise
analyse initiale ait oubli de spcifier tous les moyens ncessaires une bonne mise
en place, notamment en ce qui concerne les flux de donnes, alors commencent
retards et difficults dexploitation qui peuvent facilement mener des bilans
financiers dsastreux.
Les besoins doivent galement tre analyss avec le plus grand soin, car il faut
viter de mettre en place un systme complexe lorsque cela ne simpose pas. Dans de
nombreux cas, la consultation de documents cartographiques ou graphiques, sans
notion de base de donnes, peut tre suffisante : les moyens mettre en uvre
seront alors bien diffrents, et beaucoup plus lgers et faciles grer.
2.3.2. SAVANE : de la cration d'une base de donnes son exploitation
Nous allons dcrire ici rapidement les principes de mise en place dune base de
donnes gographiques avec le SIG SAVANE.
2.3.2.1 La cration d'une base de donnes : schma et mthodes
La base de donnes va tre cre partir de lanalyse des besoins et des flux
dinformations. Ladministrateur du systme va donc crer le schma de la base, en
spcifiant la structure de linformation en suivant les principes du modle
relationnel tendu la localisation. Le schma comprend la dfinition des relations,
des attributs, des regroupements de relations, des regroupements dattributs, des
mthodes, des vues externes.

52

Chapitre 2

Le schma peut voluer dans le temps : cest toujours ladministrateur qui aura
la charge de modifier ce schma, en ajoutant, supprimant, ou modifiant des lments
de ce schma, en principe toujours en fonction des prvisions tablies dans le cahier
des charges et dans lanalyse fonctionnelle du systme.
Lensemble de ces oprations sont effectues avec le module dadministration
SAVATECA.
2.3.2.2 La digitalisation et l'intgration dans la base de donnes
La digitalisation des documents graphiques seffectue avec le module SAVEDIT
aprs prparation des documents suivant le schma des donnes, ou par importation
partir de documents numriques digitaliss sous un autre format. La digitalisation
requiert plusieurs tapes :
- une homognisation des diffrents documents,
- leur transformation en image scanne, puis le redressement de ces images avec
le module SAVAMER,
- la saisie des lments correspondant la schmatisation,
- le contrle et la correction des erreurs.
La saisie graphique peut bien sr tre rpartie en plusieurs postes. Il faut alors
grer la qualit et la vitesse des diffrents oprateurs pour satisfaire le
chronogramme tabli pour la phase de saisie graphique et assurer la qualit des
rsultats.
Le contrle et la correction des erreurs doivent tre effectus au fur et mesure
et avec le plus grand soin. Le module SAVEDIT contient de nombreuses fonctions
permettant dassurer la cohrence graphique, topologique, smantique des objets
saisis.
Les documents saisis sont ensuite intgrs dans la base de donnes. Lintgration
cre les objets dans la base et les indexe en fonction de leur localisation. Les
donnes descriptives sont intgres dans une seconde phase, par jointure avec les
objets grce une cl de jointure descriptive. Toutes ces oprations se font sous le
contrle de ladministrateur de la base de donnes.
2.3.2.3 Cration et gestion de mthodes
Une fois dfini le schma des relations et attributs, ladministrateur peut
galement dfinir des mthodes dutilisation qui vont se placer dans le schma de la
base de donnes. La dfinition de ces mthodes peut intervenir tout moment :
certaines mthodes drivent directement de la dfinition des relations et attributs,
dautres peuvent tre constitues au fur et mesure de lutilisation de la base de

Prsentation du systme SAVANE 53


donnes et tre ajoutes dans le schma par la suite, de manire enrichir la
connaissance sur la base de donnes par lutilisation qui en est faite. Un utilisateur
peut donc proposer ladministrateur dintgrer une mthode dans la base, si cette
mthode correspond un besoin gnral ou permet denrichir la connaissance.
Sinon, lutilisateur conserve ses mthodes pour son propre usage, mais elles
napparaissent pas dans le schma de la base de donnes.
2.3.2.5 Vues externes et droits d'accs
Une fois le schma de la base de donnes constitu, ladministrateur peut dfinir
des droits daccs en constituant des vues externes sur la base de donnes. Ces vues
externes contrlent laccs aux relations, leurs attributs, ainsi quaux mthodes
dfinies dans le schma. Elles permettent galement davoir une vision hirarchique
de la base de donnes par la cration de dossiers.

54

Chapitre 2

Prsentation du systme SAVANE 55

Bibliographie

[SOU 87] SOURIS M., A Geographic Information System with relational architecture :
principles and example of use, in Primera conferencia sobre informatica y geografia, 1987,
San Jose, Costa Rica, pp 703-728
[SOU 90] SOURIS M., Le systme SAVANE, Manuels de rfrence, 1990-2002, IRD

Deuxime partie
gographique

Modliser

et

grer

linformation

58

Chapitre 3

Modliser 59

Chapitre 3

Modliser la ralit : cartographie, gographie,


gomtrie, et informatique

Lextension du modle relationnel utilise dans le SIG SAVANE est construite


sur la prise en compte de types de donnes provenant de la modlisation du monde
rel en deux ou trois dimensions, types qui ne sont pas ou mal grs par les systmes
de gestion de base de donnes classiques. Dans ce chapitre, nous allons donc tout
dabord rappeler les principes de cette schmatisation, avant de prsenter dans le
chapitre 4 les mthodes de mesure et dans le chapitre 5 les mthodes de
reprsentation et de gestion de ces types de donnes dans le cadre des systmes de
gestion de bases de donnes tendus aux donnes localises. Cette rflexion, trs
gnrale, nous servira de base dans lensemble de cet ouvrage. Elle nous permet de
revenir sur les concepts de base de la cartographie et de la gographie, et de montrer
comment llaboration de linformation gographique influence de manire dcisive
lutilisation qui en est faite dans les systmes dinformation gographique et dans
les procdures danalyse spatiale.
3.1. Prambule
Une des plus grandes difficults quait toujours eu affronter la gographie est
celui de la prcision de son observation et donc de la prcision de la description du
phnomne observ. La nouveaut tient dans le fait que nous disposons dune
avalanche dinformation de plus en plus abondante et varie qui modifie
considrablement notre perception du rel. Dans le mme temps, les limites dans la
gestion et le traitement de ce volume dinformation ont t repousses grce
lvolution de la technologie. Tout cela concourt faire de la gographie une

60

Chapitre 3

discipline en profonde mutation ; mutation dans sa perception du rel, mutation dans


ses concepts et mthodes. La mise en oeuvre et lutilisation des SIG oblige une
complte remise plat de nos certitudes et une rflexion approfondie sur
linformation gographique, sa schmatisation, son traitement et sa reprsentation.
La validit et la fonction de la carte, support privilgi la fois de la schmatisation
et de la reprsentation, sen trouvent profondment modifies.
Au fond, le souci de pouvoir profiter dune information sans cesse plus
abondante procde dune certaine suspicion lgard de celle-ci. Une mfiance qui
se justifie non pas tant parce quelle serait suspecte de manipulation mais plus
simplement parce quil nest pas dinformation qui ne soit labore en fonction
dune vision schmatique du rel. Do lide, parfaitement justifie, de multiplier et
confronter les points de vue par le traitement simultane dinformations dorigines
trs diverses. Mais, cest aussi tout le paradoxe de ce type dapproche, le regard
critique que nous portons sur linformation gographique et sur la validit de sa
localisation exige de brasser toujours plus dinformation. Et plus linformation est
abondante et diversifie, plus la ralit gographique nous apparat complexe et
inaccessible.
3.1.1. Quelques exemples
Nous sommes entours dinnombrables objets, des quantits dvnements se
produisent autour de nous, nous-mmes faisons partie et sommes acteurs de divers
mouvements et comportements. Pour mieux comprendre le monde qui nous entoure
et sur lequel nous agissons, nous avons donc depuis longtemps entrepris den faire
ltat des lieux, ou si lon prfre, linventaire. A la manire dune comptabilit
analytique ncessaire la bonne gestion de toute entreprise, cet inventaire implique
des rubriques et des critres. Si on introduit la localisation de ces objets dans leur
description, cest bien sr parce que lon suppose que cette localisation intervient de
faon essentielle dans la dfinition ou dans linterprtation de lobjet. Il faut donc
maintenant envisager la manire dont on dcrit celle-ci. A travers quelques
exemples nous montrerons que la description de la localisation et son niveau de
prcision sont indissociables de lobjet que lon souhaite dcrire, et donc, de la
question pose. Nous allons successivement envisager la description de plusieurs
objets gographiques : une rivire, un terroir villageois, un milieu, une rgion, une
ville.
Rivire ...
Plaons-nous au bord dune rivire avec lirrpressible envie de vouloir la
dcrire. Que peut-on faire ? Sans doute commencer par situer lendroit o lon se

Modliser 61
trouve ; puis, mesurer la largeur du lit, tablir un profil transversal au moyen de
mesures rgulires de la profondeur. Il sera sans doute utile de mesurer la vitesse du
courant afin de calculer un dbit. Une lgitime curiosit sur lactivit biologique de
cette rivire justifiera la mesure de la turbidit de leau ; des prlvements deau,
analyss en laboratoire, livreront des indications prcieuses sur labondance du
plancton...
Toutes ces observations faites, sommes-nous rellement en mesure de proposer
une bonne description de la rivire ? Evidemment non. Tout au plus, une bonne
description dun lieu sur la rivire en un lieu et un instant prcis. On ne sait rien de
sa longueur et de son trac, on ignore tout de sa source, de son embouchure, du
nombre daffluents qui lalimentent, des affleurements rocheux quelle franchit tout
au long de son cours et de la vgtation qui la borde... Bref, on sait fort peu de
choses de lobjet que lon prtendait dcrire. Autrement dit, lobjet gographique
ainsi apprhend ne peut en aucun cas tre la rivire en tant que totalit.
Mais la dmarche tait-elle la bonne ? ou est-ce au contraire la question qui
navait que peu de rapport avec la dmarche adopte ? Dire que je veux dcrire La
rivire cest dj percevoir celle-ci dans sa globalit et cest poser cette globalit
comme un objet en soi. On voit donc que le problme apparemment simple de
description dune rivire savre tre dans la pratique dune immense complexit.
Ainsi, pour apprhender cet objet complexe quest une rivire, sommes-nous dans
lobligation de mieux srier les questions, chacune delle impliquant une mthode
adapte la localisation de lobjet et rciproquement. Vouloir dcrire le trac de
cette rivire fait appel des descripteurs de localisation diffrents de ceux qui seront
employs pour localiser son embouchure ou tel ou tel confluent. Donner une
valuation du dbit total de la rivire implique la mise en oeuvre de protocoles de
mesures particuliers tout en sachant quon ne connatra jamais son dbit rel. Ainsi
pour tout objet gographique devons-nous nous poser les questions suivantes : quel
est lobjet que je veux vraiment dcrire ? de quel point de vue dois-je laborder pour
apprhender sa totalit ? Puis-je sparer cette totalit en lments simples ? Quel
degr dapproximation du rel me parait acceptable ?
Terroir ...
Changeons de continent et imaginons un de ces beaux villages de lAfrique
soudanienne, nich dans limmensit et la monotonie de la savane. Autour des cases,
harmonieusement regroupes dans des enclos, stendent les auroles des champs.
Du village jusqu ces derniers, de nombreux sentiers dessinent une sorte de toile
daraigne complique et irrgulire dont les fils finissent par se perdre mesure
que lon sloigne du centre et que lon pntre dans la savane. Les champs euxmmes se distinguent nettement en fonction de la proximit du village. Aux

62

Chapitre 3

parcelles soigneusement dlimites et parfaitement entretenues succdent, mesure


que lon se dirige vers la priphrie du terroir, des parcelles aux formes beaucoup
plus irrgulires et aux limites dautant plus floues que les plantes adventices
colonisent les bordures des champs.

Dores et dj, un terroir villageois sannonce donc comme un objet


singulirement complexe, et ce dautant plus que lon souponne aisment quil
existe un rapport troit entre les habitations (et donc ses habitants), les champs, les
sentiers et la savane qui a t dfriche pour permettre linstallation de ce village.
Tous les descripteurs du terroir villageois sont localisables. On peut videmment
dcrire sparment chacun des lments constitutifs du terroir et lon sent bien que
chacun deux renvoie une classe dobjets de nature diffrente mais galement
gographiques. Ainsi, un objet gographique localisable peut tre lui mme le
produit, ou le rsultat, dune combinaison de plusieurs objets gographiques de
nature diffrente mais galement localisables.
Poursuivons la rflexion et tenons-nous en la localisation de cette
combinaison, le terroir villageois. Vu sur une photographie arienne, le village, les
sentiers qui sen loignent et les parcelles gagnes sur la savane trancheront sur la
relative homognit de cette formation vgtale. A ce niveau, un terroir villageois
peut donc assez aisment tre dcrit comme une tache, de forme plus ou moins
circulaire, localise quelque part dans la savane soudanienne. Mais prciser la

Modliser 63
localisation de cette tache implique ncessairement de prciser la description de
lobjet. Quelle rfrence prendra-t-on ? le point sombre du grand manguier qui
constitue le centre du village - et, par extension du terroir ? le dtail du trac de
chacune des parcelles ? ou seulement la limite extrieure du terroir ?
En fait, la localisation nayant de sens que par rapport lobjet que lon analyse,
il va de soi que ces trois localisations sont admissibles, soit sparment soit
simultanment, mais que chacune, renvoyant une collection dobjets diffrents,
dpend de lobjectif vis et donc, de linformation descriptive quil sagira de
recueillir puis de traiter ;
- considrer le terroir comme un point sur une carte ne permet dutiliser la
localisation comme un descripteur supplmentaire que si lon rapporte ce terroir
dautres terroirs galement considrs comme des points. En effet, dans lhypothse
o lanalyse ne porte que sur un seul terroir on ne voit pas ce que peut apporter une
localisation aussi imprcise de lobjet. Dans ce cas de figure, la mention de la
localisation se rsumera lnonc, sans vritable intrt, des coordonnes
gographiques de ce point. Comme pour mieux assommer le lecteur, combien
douvrages ne commencent-ils pas ainsi : le village de ... se trouve situ par 4
38 45" de latitude Nord et 3 27 56" de longitude ouest ? Ds lors le village ne
peut plus tre considr comme un objet gographique. Il ne le redeviendra que si
lanalyste ne considre plus un seul terroir pris isolment sinon lensemble des
terroirs compris dans un espace donn. Chaque terroir, et donc chaque point, peut
alors tre compar tous les autres points. Des mesures de distance pourront tre
effectues, et des regroupements significatifs de villages ne manqueront pas de se
rvler.
- linverse nous pouvons considrer le terroir comme un objet en soi, en dehors
de tous les autres terroirs proches ou lointains. Nous pourrions croire que les choses
devraient sen trouver simplifies par la rduction du nombre dobjets (un terroir au
lieu de plusieurs). Cest pourtant le contraire qui se produit puisque la localisation
de cet objet unique ne peut plus tre assimile un point. Avec ses cases, ses
parcelles et ses sentiers, le terroir villageois est un objet complexe. Lobservateur
souhaitera sans doute tablir la relation entre les familles vivant dans chacun des
enclos et les parcelles cultives ; ces dernires, de forme et de surface diffrentes,
seront plus ou moins fertiles selon lexposition, la nature des sols et la proximit
dun cours deau. Il sera enfin tout aussi essentiel de mesurer le temps et la distance
parcourue par les femmes pour aller puiser de leau ou ramasser du bois et il sera
probablement justifi den mesurer les effets sur la gestion des activits agricoles
collectives. Enfin, la forme et laspect mme des parcelles loignes justifiera
certainement une question subsidiaire : toutes les parcelles appartiennent-elles la
mme classe dobjets ? Ou, au contraire, faut-il distinguer les champs cultivs en

64

Chapitre 3

permanence de ceux qui, du fait de leur loignement, sont priodiquement laisss en


jachre ?
A chaque entit, enclos familial, parcelle, sentier, seront donc associes un
certain nombre dobservations localises dans lespace et dans le temps. Les
dplacements seront associs des objets gographiques linaires, les sentiers ; la
fertilit des sols et la production agricole sera ramene aux parcelles. Enfin, les
revenus tirs de cette production sera rapporte au chef de famille habitant la case
principale.
Rgion ...
Sil existe un objet gographique la fois aussi vident mais en mme temps
aussi incertain et controvers, cest bien celui de rgion. Nous voulons parler ici
dune forme plus complexe dorganisation de lespace qui se construit delle-mme
et connat de constantes modifications au gr des dynamismes locaux et des
concurrences interrgionales.
En premire analyse la rgion fait partie de ces espaces intermdiaires entre le
niveau local dune ville ou dune commune et le niveau plus englobant de la nation
toute entire. Nous disons bien, en premire analyse, car, comme pour compliquer
les choses, bon nombre de rgions conomiques et culturelles nexistent que par leur
position frontalire, et dans ce cas, cest bien souvent la limite du territoire qui
donne vie la rgion ...
Dans les pays de vieille tradition urbaine, chaque rgion intgre une ou
plusieurs grandes villes et tout un semis de bourgs et de petites localits. Il y a bien
longtemps que les gographes ne sarrtent plus la question de lhomognit de la
rgion. A moins dvoquer des rgions qualifies (rgion agricole, rgion de savane,
rgion de montagne, ...), la principale caractristique de la Rgion serait au contraire
dassocier une grande diversit despaces -de micro rgions si lon prfre- plus ou
moins complmentaires en terme dactivits agricoles, industrielles
et
commerciales. Toute rgion est enfin traverse par un grand nombre de flux, les uns
centriptes et orients vers la ou les villes principales, les autres centrifuges,
destination dautres rgions, proches ou lointaines.
A une toute autre chelle que le terroir villageois, la rgion sapparente elle aussi
un objet gographique complexe compos dobjets gographiques eux-mmes
simples (parcelles, usines, quipements, ...) ou complexes (villes). Cest la
complexit mme de lobjet qui rend difficile la description de sa localisation. La
rgion, telle que nous prtendons lapprhender ici, serait plutt ranger dans la
catgorie des objets zonaux. Pourtant la difficult quil y a identifier des frontires

Modliser 65
prcises et incontestables montre bien que nous ne sommes pas dupes de notre
propre schmatisation, mme si celle-ci est le plus souvent passe sous silence.
Cest tout le problme de la plupart des objets gographiques complexes que nous
assimilons -faute de mieux- des zones. Or, toute dlimitation zonale introduit
lide dune continuit interne et dune discontinuit externe.
Milieu ...
La notion de milieu naturel , suppose dabord quil en existe une infinie
varit. Cest la premire discontinuit que nous introduisons dans le monde qui
nous entoure car il va de soi que ce vocable ne serait pas employ si, pour dcrire
lenvironnement, nous ntions pas dans lobligation de slectionner et sparer les
objets qui le composent. La notion de milieu naturel est lexemple mme de la
rduction du rel continu des objets gographiques discontinus beaucoup plus
simples.
Dans son acception la plus large, le milieu naturel correspond chez les
gographes et lensemble des naturalistes une entit gographique considre
comme homogne, au niveau danalyse choisi, et rsultant dune combinaison
particulire dans un espace donn ; combinaison entre certains caractres
climatiques, topographiques, pdologiques, gologiques, hydrologiques et
botaniques. Cette approche intgre fort mal la dimension temporelle et pose au
contraire lhypothse dune grande permanence dans le temps. Un milieu naturel se
caractrise donc plutt par sa moyenne que par ses carts. Do son nom : mi-lieu.
On le dfinit par un rgime climatique moyen, par des sols qui dans lensemble
sont plutt de tel type, une vgtation dominante , etc.
Linformation la plus prcise dont disposent les chercheurs pour mettre en
vidence la diversit des milieux provient pour lessentiel des relevs et
observations de terrain quils ralisent ; profils pdologiques, transects, stations
mtorologiques, sondages, etc. Cette information ponctuelle, donc facile
localiser, est ensuite tendue par des mthodes dinterpolation ou dextrapolation.
On attribue donc les rsultats dune observation localise un objet gographique
zonal beaucoup plus vaste. Dans la mesure du possible le chercheur aura cur
deffectuer de nouvelles mesures sur le terrain afin de valider cette extension de
lobservation localise. Il nen demeure pas moins, comme souvent pour les objets
gographiques zonaux et malgr lincertitude des limites, que lon est amen crer
des objets gographiques supposs continus partir dune information que la
prcision de la localisation ne devrait pas autoriser, sans sentourer de nombreuses
prcautions.

66

Chapitre 3

Ville
La ville est un objet formidablement complexe. Un systme, qui pour tre dcrit
en terme dobjet gographique, doit tre dcompos en sous ensembles dobjets plus
simples : immeubles, monuments, siges sociaux; quartiers, arrondissements,
commune ; rseaux de transport, deau de gaz, dlectricit, dgouts ; commerces,
industries, banques, services ; rocades, boulevards, avenues, rues, impasses ;
ouvriers, fonctionnaires, cadres, ...

Bien sr une ville cest cela, mais cest beaucoup plus que cela. Cest surtout
linterrelation et linterdpendance de lensemble de ces objets et de bien dautres
encore. Ds lors, la description dune agglomration urbaine ne peut se rduire la
seule analyse de ses lments matriels stables et visibles.
3.1.2. Prcision et description
De la grande diversit des objets gographiques voqus titre dexemple
tentons maintenant de dgager quelques conclusions. Certaines paratront
parfaitement videntes, mais il nest pas inutile de les rappeler tant elles sont lourdes
de consquences, qui, elles, napparaissent que lorsque lon cherche modliser ou
reprsenter la ralit avec un ordinateur.
La perception visuelle dun objet dpend la fois de sa dimension et du point de
vue de lobservateur. Un observateur plac au bord dune rivire se trouve dans
limpossibilit de voir la totalit de cette rivire. Pour contourner cette difficult, la

Modliser 67
seule solution consiste sloigner de cet objet. Ainsi, plus la dimension des objets
gographique est importante plus il faut sen loigner pour en apprhender la
totalit. Ainsi, on sait quon apprhende mieux les formes, les proportions et
laltitude dune montagne vue dune certaine distance que lorsquon a le nez coll
la paroi rocheuse.
Quel que soit le point de vue de lobservateur, la perception dun objet
gographique reste toujours fragmentaire et partielle. En effet, plus on sloigne de
la montagne pour lapprhender dans sa totalit plus sestompe le dtail de sa
vgtation, de ses valles et ravines, mais plus les principaux lments structurants
de cette montagne apparaissent clairement. Ainsi, toute distance par rapport
lobjet correspond un niveau particulier de schmatisation de cet objet.
Toute description dun objet gographique se traduit par une schmatisation de
sa dimension, de sa forme, de sa distance, de sa localisation, de son comportement.
La perception de tout objet est fonction de lobjectif poursuivi par lobservateur. Il
nexiste en soi ni prcision absolue, ni bonne ni mauvaise prcision. Dans la
mesure o lobjet gographique nexiste que par rapport lobservateur, une
montagne ou une rivire nont ni plus ni moins de ralit quune rgion, une nation
ou toute autre abstraction cre pour les besoins de telle ou telle cause. Ce que bien
souvent on nomme chelle correspond une certaine description dun objet
gographique. Contrairement la notion dchelle en cartographie (cest--dire le
rapport entre un objet rel et sa reprsentation sur la carte), lchelle de description
correspond une modlisation du rel, un niveau de description qui lie troitement
la prcision de la localisation et les autres critres de la modlisation.
3.2. Pourquoi et comment modliser le monde rel
La ralit gographique se rvle donc tre bien difficile modliser : une
multitude dobjets, des regards et des points de vue diffrents, une imbrication
hirarchique de diverses descriptions, des dtails quil convient doublier pour
avoir une vision globale, des limites floues, des interactions multiples entre
diffrents lments, une reprsentation multiforme. Loin dune schmatisation
naturelle ou universelle, voici le lecteur prvenu : il entre dans le territoire des
monstres.
3.2.1. Comment apprhender et reprsenter la ralit pour la traiter avec un
ordinateur ?
La cartographie et la gographie se sont construites peu peu sur la base de
possibilits techniques qui, pendant longtemps, nont pas beaucoup volues.

68

Chapitre 3

Depuis une trentaine dannes, tous ces fondements sont les uns aprs les autres
remis en cause par des possibilits techniques indites apportes par le
dveloppement de linformatique et le pouvoir de modlisation et de calcul des
ordinateurs. Il est donc utile de revenir sur des concepts de bases et notamment sur
la question de la schmatisation et de la modlisation du monde rel, lobjectif tant
de rpondre un problme donn en utilisant un ordinateur, cest--dire
fondamentalement une machine capable de reprsenter et de traiter des
connaissances. Laspect calcul de lordinateur est ici secondaire : il doit dabord tre
considr comme une machine permettant de conserver et de traiter une
reprsentation formelle dune ralit.
Face une ralit et un dsir dtudier ou de grer cette ralit dans un certain
but, il faut schmatiser cette ralit et exprimer cette schmatisation de manire
pouvoir grer les objets qui en dcoulent. Linformation gographique nexiste pas
en tant que telle : ce nest que par rapport une vision du monde et face un objectif
donn que lon peut modliser le monde rel, en fonction de cet objectif, et que lon
va passer de la ralit linformation gographique. La description ne peut tre
universelle : elle seffectue toujours par rapport un objectif, avec une prcision
donne et des descripteurs qui sont dfinis par rapport cet objectif et cette
prcision. Et cest bien souvent la difficult premire laquelle est confront
lutilisateur dun SIG : comment les donnes quil va utiliser ont-elle t conues,
comment ont-elles t structures, dans quel but, avec quelle prcision, quelle
validit, etc. Pour ne pas rendre un SIG inefficace, ou mme dangereux utiliser, il
faut pouvoir rpondre ces questions. Il faut pouvoir affirmer que la ralit est
devenue information ou connaissance sans que cette transformation ne la vide du
sens qui va lui tre donn. Car les transformations sont nombreuses, de la ralit
lcran : une interprtation par rapport un contexte, soit culturel, soit procdural,
une modlisation par rapport un objectif, une structuration par rapport un
modle, une reprsentation en rapport avec des possibilits techniques, une
utilisation par rapport un problme donn.
Bien sr, de nombreuses reprsentations du rel nous paraissent naturelles,
tellement elles font parties de notre socit ou de notre culture. Nous essayerons
mme plus tard den rpertorier un certain nombre, de manire les proposer,
comme un canevas initial, au concepteur dune base de donnes adhrant cette
vision du monde ou devant rpondre un problme relativement universel. Ces
classes dobjets, comme nous les appellerons, correspondent la vision habituelle
dune structuration de lespace, en fonction de la prcision des donnes initiales et
de lchelle des cartes qui servent habituellement les reprsenter graphiquement.

Modliser 69
3.2.2. Ralit et connaissance
Nous sommes tout instant confronts une ralit dont notre vision est
fortement contextuelle. Nous ne voyons ce qui nous entoure quavec nos
possibilits techniques et que par rapport nos besoins, ou plutt nous ne retenons
de ce que nous voyons que ce qui sert nos besoins, suivant une schmatisation, un
apprentissage, une reprsentation interne naturelle quil est bien difficile de
connatre. Lhomme se sert de son fort pouvoir dabstraction et de sa facult
doublier, dune faon quasi inconsciente et automatique mais extrmement
efficace.
Lorsque lon cherche apprhender une ralit, non plus de faon inconsciente,
mais suivant des critres et des objectifs donns, nous sommes amens essayer de
faire ce mme travail de modlisation et de reprsentation dune ralit par le
raisonnement et pour le raisonnement. Par le raisonnement, car il nous faut choisir
un nombre fini de critres, de relations, de schmas ncessaires la description et
oublier le reste. De plus, on cherche reprsenter et schmatiser non pas seulement
des faits, mais des connaissances, puisque un fait rel (incertain) devient un objet de
connaissance travers la vision de lhomme (vision qui nest bien sr pas unique, et
qui dpend la fois de lhomme et de son contexte). Pour le raisonnement, puisque
le but de toute reprsentation du rel est laccs au raisonnement, non plus instinctif,
mais structur. Si lon cherche ainsi reprsenter les connaissances, cest
essentiellement pour tablir un lien entre des concepts du monde rel ainsi exprims
et des modles thoriques permettant davoir accs au raisonnement.
3.2.3. Modliser la connaissance
La connaissance comprend ds lors des faits (des objets) et des procdures pour
les interprter (des mthodes). Le problme de la dfinition dun modle de
reprsentation de la connaissance est donc fondamental. On distingue laspect
dclaratif (les concepts ou les objets et leurs descriptions), et laspect procdural (les
procdures permettant dinterprter et dutiliser les concepts et les objets). Un
schma conceptuel de reprsentation de la connaissance comprend ncessairement
les deux aspects. Les connaissances dclaratives semblent naturellement plus faciles
exprimer que les connaissances procdurales, mais elles nont en soi aucune valeur
smantique. Cest un interprteur procdural (un homme ou un programme, plus
gnralement une mthode) qui exprime la faon dont elles vont tre utilises, car
toute connaissance est contextuelle, mme si de nombreux efforts ont de tout temps
t entrepris pour rendre la connaissance universelle.
Plusieurs modles de description de la connaissance ont t proposs [GAR 83]
[SCH 89] [DAV 91]. Voici un rapide rsum des principaux :

70

Chapitre 3

- le modle smantique reprsente la connaissance sous forme dun rseau,


ensemble de nuds (concepts) et darcs exprimant les relations qui peuvent exister
entre ces nuds. Larc est orient et reprsente laction dont lacteur est le nud de
dpart, agissant sur le nud darrive. Linterprtation du rseau permet de dcrire
des hirarchies dactions entre les concepts. Les concepts peuvent reprsenter des
objets rels, comme des situations ou des actions. Mais les concepts ne sont pas
dcrits par des attributs ou des variables : ce sont uniquement les nuds et arcs du
rseau qui dcrivent la connaissance. Le modle smantique sert surtout dfinir et
organiser les concepts et les relations entre concepts.
- le modle entit-association dcrit les galement des concepts et des
associations entre concepts, mais chaque concept comme chaque association est
dcrit par des attributs, qui peuvent tre considrs comme des concepts atomiques.
Le concept devient lobjet.
- le modle objets complexes est trs proche du modle entit-association. La
reprsentation des connaissance est base sur des structures dinformations bien
organises, les schmas, en essayant de se rapprocher au maximum du
fonctionnement suppos de la mmoire humaine. On distingue alors le prototype
(description du schma), des objets eux-mmes, ralisations particulires des
prototypes. Un prototype est caractris par un certain nombre dattributs, qui
caractrisent les objets et dfinissent ses relations smantiques avec les autres objets.
Le modle orient objet est une extension du modle objets complexes enrichi
dans laspect procdural. Un objet, en terme dinformation, sera donc par dfinition
laspect dun concept dcrit par un nombre fini de critres. Le modle orient objet
introduit des relations procdurales entre les objets, qui conversent donc entre eux
par des procdures.
Les critres retenus pour dcrire un objet peuvent sapparenter de simples
donnes mesurables, peuvent prendre leur valeurs dans des espaces plus complexes
(un espace mtrique par exemple), comme tre eux-mmes dautres objets, des
associations entre objets, ou des vnements qui sappliquent aux objets sous
certaines conditions. En fait, il faudra la plupart du temps dfinir de nombreux
objets et relations entre ces objets pour dcrire la connaissance que lon cherche
reprsenter.
3.2.4. Collection dobjets et gestion
Lors de ltude ou de la gestion dun problme, on est amen identifier ou
mieux dfinir des objets composant ou dcrivant ce problme. Souvent, la dfinition
porte non pas sur un ou plusieurs objets, mais sur des ensembles dobjets, tous les
objets dun mme ensemble tant par dfinition dcrits par les mmes critres. On a
alors tudier ou grer non pas des objets isols, mais des collections dobjets.

Modliser 71
Cest mme ce que lon sefforce de faire la plupart du temps : sachant que lon ne
peut dcrire et tudier tous les lments un un, on cherche une description
minimale suffisante pour ltude envisage et avec laquelle on pourra dcrire tous
les lments composant le problme tudier. On constitue donc des ensembles
dobjets qui sont dcrits par un nombre fini de critres identiques.
On cherche galement dcrire et modliser la ralit non pas seulement pour
dcrire et caractriser des objets, mais surtout pour comparer et diffrencier
plusieurs objets ayant le mme schma de description. Dailleurs, on modlisera
souvent la connaissance de manire reprsenter avec un mme schma un
ensemble dobjets distincts, sil semble plus simple de regrouper les objets qui se
ressemblent en catgories (mais est-ce bien la dmarche naturelle de la mmoire ou
de lintelligence ?). On passe donc de la notion dobjet celle densemble dobjets,
en introduisant de nouvelles contraintes lies la gestion de ces objets devenus
lments. Il devient alors souhaitable de ne considrer que des ensembles dobjets
homognes, afin de pouvoir contrler la cohrence des objets les uns par rapport
aux autres et afin deffectuer des oprations ensemblistes de manire efficace. Au
problme de la reprsentation des connaissances et de description des objets,
sajoute donc le problme dune gestion efficace dun ensemble dobjets.
Les systmes de gestion de base de donnes sont chargs de la gestion dun
ensemble dobjets, et les mthodes employes sont bien sr fonction du modle de
reprsentation des objets. Suivant les contraintes que lon simpose pour la gestion,
on sera amen choisir tel ou tel modle de reprsentation de la connaissance. Ce
sont souvent les contraintes de gestion qui amnent choisir un modle de
reprsentation, et non linverse : il est donc fondamental de connatre ces contraintes
avant de choisir un modle de reprsentation.
Plus la description des objets est complexe, plus une collection dobjets sera
difficile grer : toutes les thorie des systmes de gestion de base de donnes, que
nous verrons au chapitre 5, reposent sur cette ide. Soit on impose de simplifier la
description des objets, et on pourra alors assez facilement les grer, mais au risque
de trop simplifier la modlisation du rel ou davoir dfinir de nombreux objets
distincts et davoir effectuer de nombreuses oprations entre ces objets pour
retrouver une description acceptable de la ralit. Soit on essaye de conserver une
modlisation plus complexe, quitte avoir des difficults de gestion et une faible
marge de manuvre dans les traitements. Modle de description et modle de
gestion sont donc intimement lis. Cest encore une fois essentiellement
lapprhension de la ralit et lutilisation de cette modlisation qui va nous amener
utiliser un modle de description et de gestion plutt quun autre.

72

Chapitre 3

3.3. La schmatisation du monde rel : de la ralit la gographie


La prise en compte de la localisation rpond deux proccupations majeures :
reprer pour se reprer, reprer pour dcrire et interprter. Pourquoi l et pas ailleurs
? Comment expliquer la distribution spatiale dun objet ? Comment expliquer la
distribution des objets les uns par rapport aux autres ? Ces questions sont,
implicitement, au cur de toute question gographique.
3.3.1. La localisation comme attribut : lobjet gographique
Nous avons plusieurs reprises employ le terme objet gographique , sans
en avoir encore donn une dfinition formelle. Mais de ce qui prcde, nous
pouvons dgager un besoin gnral : modliser la ralit pour tudier des situations
ou des phnomnes ayant une composante spatiale. Implicitement, on suppose
mme que la localisation dans lespace est lune des causes du phnomne tudier,
et non une consquence de ce phnomne. Nous appellerons donc dans cet ouvrage
objet gographique un objet modlisant un phnomne du monde rel pour
lequel la localisation dans lespace a valeur de causalit : autrement dit, on ne pourra
avoir au mme endroit deux objets gographiques correspondant deux
phnomnes de la mme catgorie. On assure ainsi une dpendance fonctionnelle de
lespace et du temps sur le phnomne. Cette schmatisation ne peut tre applique
aux objets localiss que sils sont regroups en catgories, que nous appellerons
plutt collections. Un objet ne devient donc gographique au sens o nous
venons de le dfinir que sil appartient une collection. Cette dfinition de se veut
pas gnrale au sens de la gographie, car elle serait alors beaucoup trop simpliste :
elle est directement lie notre besoin de modlisation en vue dune gestion
relationnelle par collections dobjets du mme type, et est guide par lobligation du
respect de la contrainte dunicit : on ne peut avoir deux objets dune mme
collection au mme endroit et au mme moment.
Le terme collection utilis ici recouvre le concept densemble dobjets dun
mme type. Ces objets sont dcrits, en fonction de linterprtation de lobservateur,
par des variables lmentaires, appels attributs. Un objet gographique a la
particularit dassocier une localisation gographique et quelquefois temporelle
lensemble des attributs qui constituent la description non localise de cet objet.
Lattribut donnant la localisation est appel attribut de localisation, pour le
distinguer des autres attributs qui constituent linformation descriptive.
Il est important de noter quil ny a pas de diffrence thorique entre
information graphique et information descriptive, toutes deux constituent lensemble
des attributs qui servent dcrire un objet de la collection dtermine par
lobservateur ou le modlisateur. Par contre, la modlisation impose une
dpendance fonctionnelle de lune vers lautre qui motive cette distinction
smantique et qui se traduit souvent dans les SIG par la sparation physique et

Modliser 73
conceptuelle du graphique et du descriptif. En effet, la localisation gographique et
temporelle dun objet va dterminer lensemble des valeurs des autres attributs de
cet objet : implicitement, on ne peut avoir, au mme moment et au mme endroit,
des valeurs descriptives diffrentes pour un mme objet dune collection.
Nous verrons un peu plus loin dans ce chapitre comment dcrire cet attribut de
localisation. Nous pouvons nanmoins dj souligner son caractre relativement
universel, puisquil correspond toujours la description dun lieu, dans un espace
qui est unique pour tous les objets rencontrs. La difficult, pour modliser le
monde rel, se trouve bien dans les rapports entre la description, la schmatisation,
la prcision de la localisation dune part, et le contenu smantique de lobjet et les
attributs qui servent dcrire ce contenu dautre part.
3.4. La schmatisation de la localisation : de la gographie la gomtrie
A partir dune ralit gographique complexe, le besoin de reprsentation
graphique rend ncessaire la schmatisation de la localisation. : la transition devient
frontire, le lieu devient point... La gomtrie remplace la description gographique,
dans un processus de schmatisation trs radical.
3.4.1. Gographie et cartographie : une union agite
La ralit gographique est donc complexe, souvent diffuse, et elle est le plus
souvent dcrite en utilisant la cartographie. Jusqu prsent, en effet, la carte reste
encore le procd le plus efficace de reprsentation puisquil permet de prsenter sur
un mme document visuel une reprsentation de lobjet gographique qui combine
la fois sa localisation et son contenu. Cependant, comme toute modlisation, la
cartographie consiste rduire le rel des faits simplifis et un nombre fini de
critres. Le problme qui se pose donc est celui des hypothses et des techniques qui
aboutissent cette double schmatisation de la localisation de lobjet et de
linformation descriptive qui sy rapporte. Aussi, on ne peut oublier que lobjet
gographique est beaucoup plus riche que la carte qui est cense le schmatiser. Il
est donc absolument essentiel de comprendre et connatre pas pas les tapes de
cette schmatisation, puisque le degr de validit du modle en dpend.
La gographie n'a pas toujours su se faire comprendre des cartographes. Cette
incomprhension relve bien d'une contradiction fondamentale. Au del de la
description du rel qui, chez le gographe, s'exprime le plus souvent par des cartes,
celui-ci recherche aussi des modles. Le cartographe quant lui recherche la
prcision de la mesure, et ce souci le conduit toujours un choix douloureux entre
lirrpressible dsir d'une mesure parfaite et l'invitable altration de la ralit

74

Chapitre 3

induite par la reprsentation cartographique de cette ralit. Dans le mme temps, et


c'est pour cette raison que les disciplines sont spares, le gographe, sans que son
collgue s'en soit vritablement rendu compte, est pass tout autre chose. Sauf cas
rares, il ne cherche plus localiser de faon trs prcise et trs exacte un
phnomne, mais en donner une vision simplifie, ou plutt schmatise, qui
permette que soit compris sa nature et son fonctionnement dans un espace donn.
Les SIG, comme nous le verrons tout au cours de cet ouvrage, permettrons en partie
de runir ces deux disciplines, et cest bien ce qui fait lune des forces de ces
nouveaux outils.
3.4.2. Cartes de localisation et cartes thmatiques
La vertu de toute carte de localisation bien faite est de ne prter le flanc aucune
critique en terme d'interprtation. Elle runit sur un plan des objets facilement
reprables, donc visibles, localiss les uns par rapport aux autres en fonction de leur
distance relative et de leur position par rapport au nord gographique. Ce type de
carte introduit une premire relation entre deux informations : la nature de l'objet et
sa position dans l'espace.
La plupart des cartes sont porteuses d'autres enseignements que la seule
localisation. Il est apparu de plus en plus utile de dresser des cartes dont la finalit
premire n'est plus de se reprer pour mieux suivre un itinraire, mais plutt de
reprer un phnomne dans l'espace pour mieux l'apprhender. Nous en arrivons
ainsi la carte thmatique.
L'abondance et la varit des cartes thmatiques est telle aujourd'hui qu'il semble
qu'on passe sans distinction claire de la carte descriptive la carte interprtative qui
prtend avoir valeur de modle. Les premires seraient rapprocher des cartes de
localisation dans la mesure o la principale proccupation semble tre de reporter
scrupuleusement les observations faites sur le terrain. Les cartes gologiques, celles
des sols ou de la vgtation en fournissent de trs beaux exemples. Bien
qu'labores par des spcialistes, le choix d'une reprsentation cartographique
n'implique pas systmatiquement la recherche de phnomnes complexes qui
seraient relier leur position particulire dans l'espace. En effet, le premier
objectif, mais aussi la principale qualit de ce type d'entreprise semble tre de
restituer au lecteur toute l'information recueillie, qui, l'tat brut, sous forme de
carnets de notes et d'chantillons, reste videmment impossible interprter par un
non spcialiste.

Modliser 75
3.4.3. La reprsentation gomtrique de la localisation gographique
Il va de soi que nous n'aurions nullement besoin de nous interroger sur la
reprsentation gomtrique de la ralit gographique si nous n'avions pas fait
auparavant le choix de reprsenter cette modlisation par une carte. Mais ds que ce
choix est fait nous sommes bien obligs de nous demander comment nous allons
figurer et reprsenter les diffrents objets gographiques que l'on souhaite dcrire.
Et ce choix va de nouveau fortement influencer notre modlisation du monde rel :
par rapport la diversit et la complexit des formes de localisation que prennent les
diffrents objets (ville, rgion, terroir, paysage, ...) nous nous trouvons
extraordinairement limits dans nos choix puisque selon l'objet, et donc selon
l'objectif poursuivi, nous devrons nous rsoudre assimiler celui-ci un lment ou
un ensemble dlments gomtriques : un point, une ligne, une zone.
Prenons l'exemple des villes. Pour simplifier l'explication on peut, trs
schmatiquement, prendre trois orientations diffrentes :
- donner une image trs prcise de chaque ville en mettant en vidence sa
diversit interne, la spcificit socio-conomique de chaque quartier (1) ;
- comparer les attributs descriptifs de l'ensemble des villes d'un territoire
(population, activit, etc.) (2) ;
- tudier les rapports et les flux (de transports de biens, de personnes,
d'information) qui s'tablissent entre l'ensemble des villes d'un territoire (3).
(1) Dans le premier cas, ce qui nous intresse est ce qui se passe dans la ville.
Cette notion contient deux implications fortes. La premire est qu'on suppose
l'existence de fortes diffrences entre ce qui se passe l'intrieur de la ville et ce qui
se passe au dehors. Dedans, dehors, la notion de fermeture est implicite et introduit
ipso facto la notion de zone. La ville aurait donc une enveloppe, une frontire et cet
objet se distingue fondamentalement de ce qui l'entoure. A ce niveau, on pose
l'hypothse d'une certaine homognit interne qui contraste avec la priphrie de la
ville, suppose galement homogne. Cependant, si nous nous arrtions l, il est
vident que le problme pos ne serait pas tant celui de la description de la ville que
ce qui la diffrencie de la campagne. On pourrait donc numrer, voire reprsenter
graphiquement les diffrences qui opposent ville et campagne, sa population, ses
comportements dmographiques et sociaux, etc.
Mais, et nous en arrivons la seconde implication, la prcision de la localisation
des contours de la ville aurait-elle vritablement un sens ? Ne pourrions-nous pas
tout aussi bien reprsenter cette enveloppe par un cercle au centre d'un grand
rectangle qui lui, reprsenterait la campagne ? En fait la rponse est plus complexe
qu'il y parait car elle est en grande partie fonction de l'intrt port l'objet
campagne. Mais, si nous nous en tenons la ville, la prcision choisie pour le trac

76

Chapitre 3

de ses limites n'a de sens que si on considre la ville comme un ensemble lui-mme
constitu de sous-ensembles, les quartiers, les rues, .... Comme tout objet auquel
nous attribuons une reprsentation zonale, la ville est un ensemble htrogne qui
interdit de le considrer comme une zone ; mais parce que c'est aussi un ensemble
homogne par rapport ce qui l'entoure on est galement autoris considrer la
ville comme une zone.
Autrement dit, ou bien je considre la ville dans son contexte englobant et mon
objet mrite d'tre assimil une zone, ou bien je ne considre que la ville, son
contexte m'indiffre, et je n'apprhenderai celle-ci que comme un ensemble d'objets
zonaux, linaires ou ponctuels. La question des limites de la ville ne sera pas pose
mais la rponse me sera malgr tout donne par la densit et la proximit des objets
que j'aurai reprsentes sur la carte.
(2) Si, dans une approche comparative, mais dj trs proche de la notion de
rseau urbain , je souhaite reprsenter sur une carte les divers attributs socioconomiques associs aux villes d'un territoire national la question de la localisation
change radicalement. La seule question qui mrite d'tre pose est : o se situent les
villes dans l'espace national et comment se situent-elles les unes par rapport aux
autres ?
La forme de chaque ville, sa surface et ses limites ne nous intressent gure, et,
supposer que ces attributs descriptifs nous soient d'une quelconque utilit pour cette
approche comparative il serait tout fait possible de les ajouter la liste des
descripteurs socio-conomiques et de les reprsenter pareillement. La localisation de
ces villes sera rapporte sans difficult une liste de points reprs par leurs
coordonnes. Pourquoi sans difficult ? Tout simplement parce que la question
pose est d'une double nature gographique puisqu'elle s'interroge la fois sur
l'ensemble des villes (objets ponctuels) dans le territoire national, objet zonal.
(3) Supposons maintenant que cette approche soit juge insuffisante pour
dcrire et reprsenter la multiplicit des relations qui unissent les villes entre elles et
font de cet ensemble un ensemble hirarchique, un rseau... La nature des liens
unissant chaque ville ses voisines est largement fonction de son rang (capitale,
mtropole rgionale, villes secondaires, bourgs, ...) et de sa localisation. L'vocation
de ces liens fait immdiatement rfrence de nouveaux objets qui, en la
circonstance, pourront tre des routes, des lignes de chemin de fer, des flux
d'nergie et d'information. Aux objets ponctuels que sont les villes dans l'espace
national seront alors associes des lignes (arcs, segments) reprsentant ces liens.
Points et lignes, lieux et liens seront donc les deux reprsentations d'un nouvel objet,
le rseau. Notons que dans ce cas de figure le point est aussi un nud. Une mme
localisation peut donc renvoyer des objets diffrents ; un point peut tre la

Modliser 77
reprsentation d'une ville, mais ce peut tre aussi la reprsentation d'un carrefour
routier d'un rseau urbain.
Comme ces exemples l'ont montr, la reprsentation cartographique de la ralit
gographique introduit d'normes contraintes et, parfois, d'excessives rductions au
regard de notre perception, intuitive ou non, de l'objet. Si bon nombre dobjets
gographiques sont modliss en utilisant la cartographie, lavnement de
linformatique et en particulier le pouvoir de modlisation des ordinateurs
permettent de remettre en question cette schmatisation excessive. Faut-il employer
la cartographie pour modliser la ralit ? Na-t-on pas maintenant les moyens
techniques, grce linformatique, de revenir sur une schmatisation excessivement
rductrice de la ralit ?
Malheureusement, les SIG nont pas vraiment remis en cause la modlisation de
la ralit par la cartographie. Ils se sont contents de reprendre les bases de cette
schmatisation pour lamliorer, mais sans vraiment remettre en cause le passage de
la gographie la gomtrie, en conservant comme base de la schmatisation de la
localisation absolue la reprsentation des objets en zones, lignes, ou points [BOU
82] [SCH 89] [ROU 91] [VOI 92]. Le SIG Savane nchappe pas cette rgle.
La reprsentation multi-chelle est la seule avance tangible [SCH 92] [WOR
95]. Elle permet dassocier plusieurs descriptions de la localisation pour un mme
objet, sans en changer les attributs descriptifs, et de choisir la description en
fonction de la prcision recherche. Elle permet de rsoudre un certain nombre de
problmes dutilisation et de reprsentation cartographique, mais ne change pas
fondamentalement la description de la localisation des objets en zone, ligne, ou
points. Dans le SIG Savane, nous ne conservons quune seule reprsentation de la
localisation pour un objet, quitte multiplier les collections dobjet. Nous tentons
plutt dapporter des solutions procdurales en dveloppant de nombreuses
procdures de transfert dchelle et de changement de type dobjet, lors de
lutilisation des objets. Nous verrons ces procdures dans la troisime partie de cet
ouvrage.
3.4.4. Dcrire la localisation
La localisation peut tre dcrite de manire absolue (par exemple de faon
analytique, par des coordonnes dans un espace vectoriel), de manire relative (un
objet par rapport un autre, en exprimant des relations spatiales en les objets grce
des proprits topologiques ou ensemblistes, comme ladjacence, lintersection), ou
de manire indirecte (comme des adresses) [SCH 96]. Nous ne nous intresserons
ici qu la description absolue de la localisation. La description relative ou indirecte
nest utilise que pour amliorer lefficacit de la reprsentation, et retrouver

78

Chapitre 3

facilement la localisation absolue dun objet partir de la localisation absolue dun


autre objet.
Lutilisation dune schmatisation cartographique de la localisation absolue nous
amne reprsenter cette localisation par des zones, des lignes, ou des points. Nous
laissons ici volontairement de cot linformation reprsente des pixels, cest--dire
des lments dimage : nous consacrerons un chapitre spcial ce type dobjet
(chapitre 6).
Dtaillons le passage dune description formelle une reprsentation
gomtrique de la localisation. Llment de base de lespace rel est le point (au
sens mathmatique), de RnxR, (n=2 ou 3 pour lespace, plus une composante pour le
temps) et chaque objet gographique devrait donc logiquement tre un point de
RnxR. Cette description formelle est bien sr impossible, car nous sommes
confronts des objets physiques, et il est ncessaire de changer despace de
reprsentation et dintroduire la notion de prcision. Comme nous lavons vu plus
haut, ce passage est la base des problmes de validit et des difficults de
traitement de linformation localise : la description dun objet, si ce nest mme sa
dfinition, va tre en partie dtermine par les mthodes de reprsentation utilises.
Cest en fait exactement ce que fait implicitement le gographe lorsquil dcrit
un objet une certaine chelle. Il y a l bien sr confusion avec lchelle de
reprsentation cartographique des objets tudis, mais lon voit bien que le choix de
la description de la localisation, comme la prcision de cette localisation, est li aux
choix des attributs descriptifs, et que lobjet est lui-mme dfini par lensemble de
ces attributs. Comme dans tout problme informatique, le choix de lespace de
reprsentation et le codage de linformation influencent de manire dterminante la
nature mme de linformation reprsente et donc lutilisation qui en sera faite
[BEK 92] [GUP 95].
Tout le problme de la reprsentation de lespace est de dfinir un nouvel espace
de reprsentation qui permette de rduire la description des objets un nombre fini
dlments et de pouvoir grer la prcision gographique de cette reprsentation : il
faut passer dune description mathmatique (les lments ou ensembles de lespace
mathmatique) des sous-ensembles de cet espace et dcrire la localisation de ces
sous-ensembles avec un nombre fini de paramtres. Les entits auront alors comme
objets non plus des points, mais des ensembles de points, et les valeurs des attributs
descriptifs se rapporteront a ces ensembles. Dans ces conditions, il est vident que la
mthode de dfinition de ces sous-ensembles va influencer, sinon dterminer, la
dfinition des attributs descriptifs.
Comme nous lavons dj largement soulign, le cheminement de linformation
est plus complexe que le passage direct du point mathmatique la description

Modliser 79
informatique. Linformation est rarement donne directement en terme despace
mathmatique et de donnes brutes, mais seulement aprs ltape schmatisationextrapolation-cartographie : partir de linformation de terrain, la donne est
interprte, schmatise pour correspondre au modle du monde rel, puis elle est
reprsente sur une carte. Cette carte, reprsentation gomtrique, fait alors lobjet
dune reprsentation informatique. Mais si lon veut raisonner en terme de globalit
gographique, il est ncessaire de revenir un espace de rfrence qui ne peut tre
que lespace mathmatique.
Deux mthodes diffrentes sont utilises : la dfinition a priori des sousensembles, et la dfinition des sous-ensembles en fonction des objets de lentit.
Avec la premire mthode, la description de la localisation des sous-ensembles
est trs simple, car ils sont justement dfinis pour faciliter reprsentation et
description, en utilisant le moins de paramtres possible. Par contre, on perd une
partie importante de linformation descriptive, les objets ntant plus dfinis par les
valeurs descriptives des points mais uniquement par les paramtres de leur
localisation dans lespace. Par exemple, si lon prend comme dfinition des sousensembles les cellules dun maillage de lespace, cela revient dire que tous les
points (mathmatiques) dune mme cellule auront les mmes valeurs descriptives.
Cette mthode utilise principalement le dcoupage de lespace en polygones
rguliers : carrs, triangles, hexagones Ces polygones sont en gnral reprs
dans lespace par un systme de coordonnes propres leur dfinition (lignecolonne pour les carrs, etc.). Lattribution des valeurs descriptives au maillage
prdfini de lespace se fait en gnral par superposition dune grille une carte
classique, ou par saisie automatique grce un scanner.
Outre la facilit de description de la localisation, les avantages de cette mthode
sont essentiellement dus la facilit de traitement qui en dcoule : les oprations
ensemblistes se font sur des cellules dont la localisation est fixe pour tous les
objets. Les inconvnients sont par contre trs importants : perte dinformation
descriptive, taille des objets fixe a priori, important volume de donnes, mme sil
existe des mthodes permettant de rduire ce volume, par compactage ou structure
arborescente.
La seconde mthode de description gomtrique utilise est la dfinition des
objets en fonction des valeurs descriptives de lentit. On va ainsi crer des sousensembles que lon classe en zones, lignes, points [BOU 81] [DAV 91]. Les points
correspondent au point mathmatique : on assimile donc la localisation de lobjet
un point de lespace mathmatique. Les lignes sont des sous-ensembles de
dimension 1, les zones des sous-ensembles de dimension 2, ferms et borns. La
connexit nest pas requise dans cette dfinition. De mme, nous ne parlons pas ici
de polygone : cet lment nintervient en fait que dans la reprsentation

80

Chapitre 3

informatique de ces lments gomtriques, alors que nous ne sommes ici que dans
une reprsentation gomtrique de la localisation.
3.4.5. Les limites du modle gomtrique
La description gomtrique en zone, ligne, point est-elle suffisante pour dcrire
de manire satisfaisante les objets gographiques ? Oui et non. Si lon dcide de
modliser la ralit avec des cartes, oui. Mais lon a vu combien cette modlisation
peut tre rductrice et combien elle simplifie la ralit. La gomtrie introduit des
discontinuits dans la ralit, et la prcision ou lincertitude nest pas traite par ce
modle de description. Ds lors, les traitements appliqus aux objets gographiques
dans les SIG ne sont-ils pas trop sophistiqus par rapport la validit de la
schmatisation de la ralit ?
3.5. De la gomtrie linformatique : la reprsentation informatique de la
localisation
La description informatique se base sur la description gomtrique. Il sagit
maintenant de reprsenter cette description gomtrique par un ordinateur, et donc
par un nombre fini de descripteurs. Cest en effet ce qui caractrise cette nouvelle
tape : l o en mathmatique on peut nommer, en informatique il faut reprsenter.
Nous allons rappeler rapidement comment reprsenter des lments gomtriques
avec un nombre fini de paramtres, et quelles sont les structures informatiques qui
permettent de conserver efficacement cette reprsentation.
3.5.1. La reprsentation en maille
La reprsentation en maille est trs proche dune reprsentation informatique.
Cest dailleurs essentiellement pour cela quelle est employe. Comme le nombre
de maille peut tre lev, le seul vrai problme de la reprsentation par maille
consiste trouver des structures de reprsentation interne permettant de rduire
lespace de stockage. Nous aborderons rapidement cet aspect un peu plus loin.
3.5.2. La reprsentation vectorielle
On nomme reprsentation vectorielle la reprsentation informatique des zones,
lignes, et points qui conserve cette structure gomtrique.
La reprsentation de points est immdiate : ils sont dcrits tout simplement par
leurs coordonnes dans un systme de rfrence choisi (nous consacrerons

Modliser 81
nanmoins le chapitre suivant au simplement). Les coordonnes sphriques, qui
correspondent la longitude et latitude, sont souvent utilises. La prcision
informatique des coordonnes est un facteur important du codage, car il peut
influencer la validit des donnes graphiques.
Les lignes sont dcrites par un ensemble de points, appels sommets : la ligne est
alors reprsente graphiquement par lensemble des segments dfinis par ces
sommets. Bien sr, il y a perte dinformation entre la reprsentation mathmatique
de la courbe et sa reprsentation informatique. Ici, le nombre de sommets en
fonction du rayon de courbure dtermine la prcision du codage : elle dpend la
fois de la mthode de saisie (lopration qui permet de passer de la gomtrie
linformatique), des matriels utiliss et de loprateur, sil existe.
Les zones sont repres par leur contour, qui est considr soit comme propre
chaque zone, soit comme un ensemble de frontire. Dans le premier cas, la zone est
dcrite graphiquement par un ensemble de lignes fermes, appeles boucles. Si lon
conserve ces lignes telles quelles, il y a duplication dune partie de linformation
graphique, un contour tant en gnral commun deux zones : globalement, ces
lignes sont alors stockes deux fois. Le problme des trous et des zones incluses
imposent habituellement ce type de reprsentation de conserver le sens des arcs.
Dans le second cas, les contours sont considrs comme un ensemble de
frontires, chaque frontire tant dcrite par une ligne. Les extrmits de chaque
ligne sont appeles nuds, les lignes elles-mme tant nommes arcs. Chaque nud
appartient au moins deux arcs, et lensemble des arcs dune zone doit constituer
une courbe ferme. Notons quil est important de pouvoir reconstituer facilement le
contour dune zone partir de ses frontires. Nous prsenterons plus loin un
algorithme permettant deffectuer cette opration (A.2.2.6.).
Des entits plus complexes peuvent tre dfinies partir dentits dont les objets
sont des points, des lignes, ou des zones. Par exemple, on peut dfinir des entits
dont les objets sont des couples dlments dautres entits. La reprsentation de ces
objets est donc un peu plus complexe, car elle fait appel non seulement la
description graphique des lments, mais galement la description des relations
qui dfinissent les objets. Lexemple le plus courant est celui dune collection dont
les objets sont des couples ordonns de points (description de flux, migrations,
rseaux linaires, etc.). La description de la collection sapparente alors celle dun
graphe.
Les structures de reprsentation de linformation localise ne sont donc pas
simples : elles dpendent du type de lobjet, et pour chaque type, elles comprennent
la fois une description de la localisation absolue utilisant un nombre fini de points
de lespace et des relations entre ces diffrents ensemble de points [EGE 90].

82

Chapitre 3

3.5.3. Les structures de reprsentation de linformation localise


Nous reviendrons en dtail au chapitre 7 sur les modles de reprsentation de la
gomtrie. En effet, ces modles sont directement lis aux mthodes de saisie
graphique, ainsi quaux contraintes que lon impose pour assurer lintgrit de la
reprsentation. Ils sont mme pour la plupart construits pour permettre les contrles
de cohrence et dintgrit. Mais nous pouvons ds prsent dcrire les principes de
cette structuration.
Le choix de la structure de reprsentation se pose pour tout type de donne : il
doit tre effectu en fonction des besoins ultrieurs et leur tre adapt. Pour la partie
graphique de linformation gographique, cette structure est surtout fonction de trois
critres : facilit des manipulations (ensemblistes, mtriques et topologiques),
compacit, structuration.
Plusieurs niveaux de reprsentation peuvent ainsi tre ncessaires suivant les
traitements effectuer. Des procdures didentification et de reconnaissance
permettent de passer dun niveau de reprsentation un autre, suivant une hirarchie
doprateurs de reconnaissance (de lensemble des points au contour, de la courbe
la zone, de la courbe la forme caractristique, etc.), qui permettent galement de
passer dun ensemble de reprsentation infini un ensemble fini.
Le premier niveau de reprsentation que nous avons vu au paragraphe prcdent
correspond aux coordonnes des points de lespace dcrivant les objets (par
exemple, pour une ligne, lensemble des points qui permettent lapproximation des
lments graphiques une prcision donne). A un niveau suprieur, la
reprsentation des lments fait appel des relations entre ces lments, relations
qui doivent, en principe, donner lensemble de linformation ncessaire aux
problmes rsoudre ultrieurement [EGE 89]. On distingue ainsi :
- les relations unaires, ou formes primitives, qui donnent le type de llment et
ses paramtres (trait et longueur ou orientation, par exemple) ;
- les relations binaires, qui peuvent tre soit numriques (bases sur des indices
de ressemblance ou de dissemblance, ou sur des relations mtriques), soit
topologiques (bases sur les notions de voisinage, de position, etc.). La
reprsentation est souvent donne sous forme de graphe dont les sommets sont les
lments, et les arcs entre sommets crs si la relation est vraie. Dans le cas
numrique, les artes sont values par les distances entre les sommets. Si le nombre
de forme primitives est faible, le nombre de relations binaires ou n-aires possibles
pour dcrire les lments graphiques est trs grand : tout le problme consiste alors
choisir les bonnes relations permettant une description minimum, en fonction du

Modliser 83
but poursuivi. La description dlments caractre gographique utilise de
prfrence des relations invariantes par transformation isomtrique.
Voici par exemple un certain nombre doprateurs permettant dexprimer des
caractristiques ou des relations entre objets :
- des oprateurs ensemblistes : galit, appartenance, inclusion, intersection,
union, diffrence, cardinal ;
- des oprateurs topologiques : fermeture, frontire, voisinage, recouvrement,
compacit, connexit ;
- des oprateurs mtriques : distance, angle, longueur, primtre, surface,
centrode.
Le problme de la reprsentation se pose pour tous les types dobjets graphiques,
mais plus spcialement pour les lignes et pour les zones. Un objet de type ligne peut
en effet tre constitu de plusieurs arcs ; les extrmits des arcs peuvent jouer un
rle particulier dans la description de lobjet ; la position de chaque arc par rapport
aux autres galement. Un objet de type zone peut tre constitu de plusieurs
taches non connexes (composantes connexes) ; chaque tache peut comporter des
trous (genre). Ainsi, de nombreux systmes emploient la terminologie de
polygone , et il est courant de confondre zone et polygone dans un souci
de simplicit. Mais cest alors confondre la description dun modle (la zone
reprsente un objet), et la description de la reprsentation interne de la gomtrie
des objets. Et cest une trs forte limitation que dimposer aux zones dtre des
ensembles connexes de genre 1, limitation qui engendre souvent des problmes
concrets (les zones incluses disparaissent, par exemple).
3.5.4. Les mthodes de compactage
Un SIG peut contenir une grande quantit dinformations graphiques. Il est donc
important que la structure de reprsentation choisie permette de compacter cette
information pour pouvoir la stocker sur le moins de place possible, sans nanmoins
que lopration de transformation naltre les performances du systme [BOU 81].
Les mthodes de compactage sont videmment fonction des mthodes de
reprsentation de linformation graphique (maille ou vecteur), et doivent si possible
permettre dans la forme compacte des manipulations graphiques ou des calculs
mtriques lmentaires. Dautre part, linterrogation des donnes dans un SIG
consiste essentiellement en une opration de recherche et de slection sur la
localisation : slection dlments dans une fentre, dans le voisinage dun objet,
etc. Il est donc ncessaire dorganiser et de structurer les objets par rapport leur
localisation, de manire ce que ces oprations soient excutables en un temps
acceptable par lutilisateur. Ce sont ces trois critres (facilit de manipulation

84

Chapitre 3

graphique, compacit, structuration) qui vont guider le choix des mthodes de


reprsentation des lments graphiques.
Dans la reprsentation des objets en points, lignes, zones, nous avons vu que, si
les points ne posent pas de problmes particuliers (leurs coordonnes sont
conserves directement), pour deux les autres types dobjet les lments graphiques
prendre en compte sont des courbes, habituellement reprsentes par des suites de
points dont on connat les coordonnes. Les mthodes de compactage consistent
rduire lespace ncessaire au stockage direct des coordonnes de lensemble de
points. Dans la plupart des cas, le stockage direct sans compactage est nanmoins
maintenant une solution satisfaisante. Nous ne rappellerons ces mthodes de
compactage que par souci historique.
Les mthodes de compactage de reprsentation de courbes sont bases pour la plupart sur
un codage incrmental, appel encore codage en chane : les courbes sont approches par un
ensemble de points o chaque point est dduit du prcdent par la donne dun paramtre
(angle, distance, courbure, etc.). le plus connu de ce type de codage est celui de Freeman,
bas sur un ensemble de huit vecteurs cods de 0 7 [FRE 61]. Chaque point est dduit du
prcdent par translation dun de ces huit vecteurs. Le codage dune courbe comprend donc
les coordonnes du premier point puis la suite des codes de Freeman pour la meilleure
approximation. Des algorithmes trs usits ont t dvelopps pour calculer ces
approximations (par exemple lalgorithme de Bresenham pour les lignes droites). Dautres
codages en chane ont galement t employs : codage quatre directions, par incrment de
courbures, par vecteurs de type Freeman mais de norme variable. Ces codes induisent des
grammaires qui peuvent servir la gnration et la manipulation des lments cods.
Le principal inconvnient du codage en chane provient de son caractre relatif : les
coordonnes dun point doivent tre calcules partir du dbut de la chane. Ceci complique
ou rend impossible a priori les manipulations graphiques sur les lments cods (intersection,
inclusion, calculs topologiques et mtriques, etc.). Pour remdier cette difficult, on rajoute
des informations, notamment sur les caractristiques topologiques, le plus souvent sous forme
de relations binaires entre primitives graphiques (la courbe est frontire de telles zones, deux
zones sont connexes, etc.) [EGE 89]. Ainsi, dans le cas des courbes fermes, on peut indiquer
par pointeur les relations entre les arcs, ou reprsenter les inclusions de zones par un graphe,
ainsi que chaner les arcs pour retrouver rapidement la structure de courbe ferme. Le
systme DIME a t lun des premiers avoir incorpor des structures topologiques [DIM
70].
Dans le cas de courbes fermes, dautres mthodes ont t dveloppes, consistant ne
conserver que lintersection du contour avec un balayage horizontal : certaines oprations
mtriques sont rendues plus simples avec cette reprsentation [AMI 71] [AOK 79].

Modliser 85
La reprsentation de lespace gographique par un dcoupage arbitraire, qui est encore
utilise dans de nombreux systmes (dits raster), produit un important volume dinformation
car le nombre de cellules cres est grand, ds que lespace dtude devient significatif. Le
compactage consiste ici essayer de regrouper les cellules de mme valeur. La mthode
lmentaire de compactage dune grille de cellules consiste balayer cette grille ligne par
ligne, et pour chaque ligne de ne conserver que les squences de cellules de mme valeur. La
mthode peut tre amliore en testant plusieurs orientations de balayage, car les donnes
peuvent tre agences suivant une direction privilgie qui produira un compactage beaucoup
plus performant. La qualit du compactage dpend bien sr de la complexit de linformation
graphique, savoir le nombre de composantes connexes. De nombreux autres algorithmes de
compactage par compression ont t dvelopps ces dernires annes pour amliorer le
volume de stockage des images. On peut galement compacter les donnes raster en utilisant
des mthodes arborescentes par subdivision successive de lespace (quadtree) [ABE 84]
[SAM 80], ou en essayant de reprsenter le contour de mailles identiques (mthodes
ensemblistes) [CAP 84] [COO 67].

3.6. Les sources d'information gographique : nature et validit


3.6.1. Les moyens dacquisition pour les donnes localises
A la base de toute donne gographique ou de toute schmatisation
cartographique existent des moyens dacquisition. Rappelons trs rapidement :
- le relev de terrain ou lev topographique. Le lev topographique permet de
mesurer la position dun point sur la surface terrestre. Les mesures sont effectues
soit par triangulation, soit grce des systmes de positionnement par satellite. Le
relev de terrain permet dassocier des caractristiques un lieu de la surface
terrestre ;
- enqutes et recensements, registres administratifs, tat civil, archives. Les
enqutes et recensements sont une source de donnes trs importante. Bien sr, ces
donnes ne sont pas objectives et relvent dj dune modlisation. Le schma en
est dailleurs toujours accessible, il est constitu de lensemble des attributs. Il est
nanmoins toujours important de connatre les contraintes et limites de validit de ce
type dinformation ;
- photographies ariennes et tldtection spatiale. Les images fournies par des
capteurs ariens ou spatiaux sont une source importante dinformation.
Linterprtation initiale est en quelle que sorte due aux limites techniques du capteur
employ. De nombreux traitements spcifiques permettent de driver dautres
informations partir des donnes brutes.

86

Chapitre 3

3.6.2. La validit de linformation


L'information gographique est extraordinairement riche et varie, tant par sa
nature que par sa prcision et sa validit gographique. Les sources sont
innombrables et l'nergie et l'ingniosit dployes pour dnicher l'information
recherche mrite d'tre souligne. On trouvera des gographes passionns par leurs
sujets dans tous les domaines : archives, journaux, cadastre, services techniques,
mairies, syndicats, entreprises, enqutes, recensements, photographies et images
ariennes, relevs de terrain.
L'information, sa prcision, sa validit smantique, spatiale et temporelle est
fonction de son metteur, donc de sa source. Quel que soit le protocole adopt pour
construire ou recueillir l'information dont on a besoin, le rsultat final prend
toujours la forme d'une liste d'objets dcrits par leur quantit ou leur qualit. Cette
liste prend diverses formes ; il peut s'agir d'enqutes, de recensements, de notes
d'archives, d'chantillons, de mesures... En fonction du but recherch, des
difficults inhrentes toute description et d'un certain nombre de difficults
techniques, on emploiera soit des mthodes visant l'exhaustivit, soit des mthodes
par sondage.
En fait, la mesure exhaustive, parfaite et indiscutable, sera toujours un leurre. Il
reste que c'est encore le devoir et la charge principale de travail de nombreuses
disciplines et de nombreux services techniques que de tendre cette perfection .
Dans de nombreux cas, la question d'une mesure exhaustive ne se pose mme pas
ds lors qu'il est matriellement impossible de prtendre parvenir un rsultat
satisfaisant et fiable par cette voie. La mesure du dbit du Nil ou du Rhne,
phnomne continu par excellence, restera toujours une mesure approche par des
mthodes de mesures ponctuelles. Dans la pratique, l'laboration de l'information
procde le plus souvent de mesures ou d'observations par sondage: stations
mtorologiques ou hydrologiques, profils pdologiques, ballons, sondes, carottes,
enqutes d'opinion, etc.
Parce que l'information est trs souvent insuffisante par rapport l'objectif qu'on
se fixe, il est essentiel de pouvoir accder une information dont la forme et la
prsentation permettent d'tablir les relations que nous recherchons ou dont nous
supposons l'existence. Cette exigence suppose d'avoir accs une information aussi
dtaille et aussi dsagrge que possible. C'est pourquoi une information brute est
toujours plus riche de sens que sa prsentation agrge, et donc, schmatise.

Modliser 87
3.7. Structure gomtrique des objets dans le systme SAVANE
Nous allons prsenter dans ce paragraphe comment les objets gographiques
sont reprsents dans le systme SAVANE.
3.7.1. Le modle gomtrique
Le systme SAVANE utilise le modle gomtrique pour reprsenter les objets
localiss. On utilise donc la classification habituelle en zone, ligne, point. La
localisation dun point utilise directement les coordonnes du point. Les lignes et les
zones sont dcrites par des arcs. La topologie, cest--dire les relations entre les arcs
pour former un objet gomtrique, est cre lors de la saisie des objets par le module
SAVEDIT, que nous verrons en dtail au chapitre 7.
Les donnes provenant de la tldtection (photographie arienne scanne,
tldtection spatiale) peuvent tre assimiles des zones, mais elles se prsentent
toujours comme des images raster, car la forme de ces zones est lmentaire et
identique pour tous les objets. La reprsentation interne de ce type de donnes est
donc diffrente des autres types de zones : nous lui consacrerons un chapitre spcial
(chapitre 6).
Le systme SAVANE gre non pas des objets isols, mais des collections
dobjets. La structure de reprsentation gomtrique des objets est construite de
manire amliorer la gestion de ces collections, et nous la verrons en dtail au
chapitre 5. Nanmoins, nous pouvons dj en donner une description rapide.
Les objets sont regroups en collections suivant une schmatisation qui
correspond la fois la modlisation du monde rel en entits et au modle de
donnes impos par le systme de gestion des collections, savoir le modle
relationnel. Quatre types de collections peuvent tre dfinies, suivant la localisation
des objets : les trois types gomtriques classiques (zone, ligne, point), et le type
pixel, dont la reprsentation interne diffre du type zone. La reprsentation interne
de la localisation nutilise que le premier niveau de description pour les points (leurs
coordonnes). Elle relie les objets lignes avec un arc, sans utiliser de relation sur les
nuds. Nous avons en effet privilgi la simplicit de la structure : les relations
entre lments seront soit vrifies lors de la constitution des collections (par des
contraintes dintgrit), soit recalcules par un traitement procdural. Ainsi, la
reprsentation des zones utilise des arcs (premier niveau de description), et les
relations des arcs avec les zones dont ils sont frontires (second niveau). Cette
description est suffisante pour retrouver le contour dune zone, connatre les zones
incluses, les trous, les relations dadjacence entre zones, entre arcs, etc. Mais ces
proprits ne sont pas inscrites dans la structure de reprsentation, comme cest le

88

Chapitre 3

cas pour dautres systmes, qui maintiennent plus dinformation (le sens des arcs par
exemple). Elles peuvent toutes tre retrouves par des procdures (nous en
donnerons quelques exemples dans la suite), condition que la validit topologique
de lensemble soit assure : le respect des contraintes dintgrit est essentiel pour
une bonne utilisation de ce modle de reprsentation.
3.7.2. La classe CArc
Nous pouvons ds prsent prsenter la classe CArc (A.2.2.1.) qui encapsule
donnes et mthodes propres aux arcs gomtriques, ainsi quun certain nombre
dalgorithmes graphiques utiliss pour rsoudre des problmes gomtriques :
intersections darcs, distance dun point un arc, intersection ou union de zones,
chanage des arcs pour passer dune reprsentation interne par frontires une
reprsentation interne par boucles, appartenance dun point une zone, etc. (A.2.2.).
Les coordonnes sont lues et stockes dans un tableau (maximum 2500 points
pour un arc). La structure comprend le plus petit rectangle englobant larc, et des
mthodes pour le calculer (CalculBBox()). Ce rectangle permet damliorer
considrablement la vitesse de certains algorithmes utilisant des arcs, en liminant
les arcs qui ne peuvent, de par leur position, tre candidats la proprit choisie.
Les procdures de calcul dintersection darcs ou de distance dun point un arc
(A.2.2.1, A.2.2.5) interviennent dans de nombreuses fonctions. Toutes ces
procdures utilisent les segments des arcs, en cartant les segments qui ne peuvent
rpondre la question. Comparer deux arcs pour trouver les intersections peut tre
long : pour amliorer les performances, il est utile de trier les segments de chaque
arc suivant lun des axes.
3.7.3. Les changements de reprsentation interne
Pour les objets de type zone, il est parfois ncessaire de changer de
reprsentation interne, et de passer de la reprsentation par arcs frontire la
reprsentation par contour ferm. Le chanage des arcs pour obtenir des courbes
fermes est simple, dautant plus que lon suppose la topologie sans faille (pas de
darc dit pendant , cest--dire sans un autre arc qui sy rattache). Pour crer le
contour dune zone, il suffit de slectionner les arcs de la zone, puis de chaner les
arcs les uns aux autres. Bien sr, une attention particulire doit tre apporte aux
bouts multiples (plusieurs arcs se joignent sur un mme bout). Une zone peut tre
constitue de plusieurs taches , chaque tache pouvant avoir des trous . On
retrouve ici la notion de polygone employe dans la reprsentation interne de

Modliser 89
nombreux systmes. Le polygone ne correspond en fait qu la notion de courbe
ferme.
Le changement de reprsentation peut parfois se limiter la cration de courbes
fermes, sans se proccuper du problme de lintrieur de la zone. Par exemple, le
langage PostScript utilise ce modle et permet de dessiner les zones sans problme,
car il prend lui-mme en charge la dtermination des zones incluses partir du
contour en courbes fermes.
Dautres systmes sont plus exigeants. Ainsi, le format Shapefile dARCVIEW
impose une description des zones en courbes fermes avec indication de lintrieur
de la zone. Le sens des arcs est utilis cet effet ( gauche lintrieur, droite
lextrieur). Le changement de reprsentation doit donc reconstituer la zone en
donnant un sens chaque arc. Voici les principes de la mthode employe dans le
systme SAVANE :
- pour chaque zone, chanage des arcs pour former des taches fermes
(polygones) ;
- On cherche ensuite lordre des taches si la zone est forme de plusieurs
polygones. Pour les zones formes de deux polygones, on calcule la surface de
chaque tache puis, sil y a possibilit dintersection entre les deux taches, on teste
lappartenance dun point de la plus petite tache dans la plus grande, pour tester sil
y a inclusion de lune dans lautre. Le point intrieur est trouv en cherchant le
centre du premier triangle form de trois points du contour et inclus dans le
polygone . Pour les zones formes de plus de deux polygones, le traitement est un
peu plus complexe : on calcule la surface de toutes les taches, on trie ces surfaces,
et, en partant de la plus petite tache, on cherche le premier incluant, ceci pour
chaque tache. Enfin, on change le sens des taches en partant de la plus grande, et en
descendant dans le chanage ainsi construit.
Pour ces procdures, nous avons construit deux classes, lune pour reprsenter
les zones (CZone, A.2.2.6.), lautre pour reprsenter les taches (CTache, A.2.2.6).
3.8. Conclusion
Ce chapitre prsente les bases conceptuelles de la schmatisation du monde rel
utilise dans le systme SAVANE. Il est, ce titre, fondamental, car cette
schmatisation dtermine la fois la structure logique et la structure interne du SIG.
Elle est galement dterminante sur les fonctionnalits du SIG en terme de
programme dapplication : au-del de la modlisation du monde rel et de la gestion
de donnes qui en dcoule, lefficacit conceptuelle des fonctionnalits du SIG
dpend directement de la manire dont le monde rel a t modlis et schmatis
pour tre manipul par le systme dinformation. Les mthodes dexploitation qui

90

Chapitre 3

utilisent la localisation des objets doivent prendre en compte les limitations dues
cette schmatisation.
La modlisation utilise dans le systme SAVANE (modlisation gomtrique
en zone, ligne, point, pixel) privilgie la simplicit du modle sur la simplicit des
algorithmes de traitements ultrieurs. Ce modle est simple, dans sa schmatisation
du rel comme dans sa structure interne. Il ne peut tre utilis efficacement qu
condition de vrifier certaines contraintes dintgrit, auxquelles nous consacrerons
le chapitre 7.

Modliser 91

Bibliographie

[ABE 84] ABEL D.J., A B+-Tree Structure for Quadtrees, Computer Vision, Graphics, and
Image Processing, 1984, vol. 27, n 1, p. 19-31
[AOK 79] AOKI M., Rectangular region coding for image data compression, Pattern
Recognition, 1979, vol. 11, p. 297-312
[AMI 71] AMIDON E.L. AND ATKIN G.S., Algorithmic selection of the best method for
compressing map data string : Communications, ACM, 1971, vol. 14, n 12, p. 769-774
[BEK 92] BEKKER J.H., Semantic Data Modeling, Prentice-Hall, 1992, New-York
[BOU 81], BOURSIER P., Reprsentation compacte des cartes dans les systmes dinformation
gographique, Thse de 3-ime cycle, Universit Paris VI, 1981,
[BOU 82] BOURSIER P. ET SCHOLL M., Performance Analysis of compaction techniques for
map representation in geographic data cases, Computer and Graphics, 1982, vol. 6, p. 73-81
[BRE 65] BRESENHAM J.E., Algorithm for computer control of a digital plotter, IBM System
Journal, 1965, vol. 14, n 1, p.44-50
[CAP 84] CAPSON D.W., An improved algorithm for the sequential extraction of boundaries
from a raster scan, Computer Vision, Graphics, and Image Processing, 1984, vol. 28, n1, p.
109-125
[COO 67] COOK B.G., A Computer Representation of plane Region Boundaries, Autralian
Computer Journal, 1967, vol. 1, n1, p.44-50
[DAV 91] DAVID B., Modlisation, reprsentation et gestion dinformation gographique, un
approche en relationnel tendu. Thse de doctorat, Universit Paris VI, 1991
[DIM 70] DIME, Technical Description of the DIME System, US Bureau of Census : Census
use study, the DIME Geocoding System, Report n4, 1970, Washington DC, p.25-30

92

Chapitre 3

[EGE 89] EGENHOFER M.J., A formal definition of binary topological relationships,


Proceedings of the third International Conference FODO, Paris, Lecture Notes in Computer
Science 367, 1989, Sprinter Verlag, Berlin, p.457-472
[EGE 90] EGENHOFER M.J. AND HERRING J.R., A mathematical framework for the definition of
topological relationships, Proceedings of the 4th International symposium on Spatial Data
Handling, 1990, Zurich p. 803-813
[FRE 61] FREEMAN H., On the Encoding of arbitrary geometric Configuration, Inst. Radio
Engineers Trans. Elec. Computers, 1961, vol. EG 10, p. 260-268
[FRE 75] FREEMAN J., The modelling of spatial relations, Computer Graphics and Image
Processing, 1975, vol. 4, p. 156-171
[GUP 95] GUPPTILL S.C.
Science, 1995

AND

MORISSON J.L., Elements of Spatial Data Quality, Elsevier

[MAT 84] MATSUYAMA T., LE VIET H., NAGAO M., A File Organisation for Geographic
Information System based on Spatial Proximity, Computer Vision, Graphics, and Image
Processing, 1984, vol. 26, n3, p.303-318
[MER 73] MERRILL R.D., Representation of contours and region for efficient computer
search, Communication ACM, 1973, vol. 16, n2, p. 69-82
[ROS 80] ROSENFELD A. AND SAMET H., Tree structure for region representation,
Aangeenburg, Autocarto 4, 1980, vol. 1, p. 108-118
[ROU 91] ROUET P., Les donnes dans les systmes dinformation Gographique. Trait des
nouvelles technologies, srie Gomatique, 1991, Herms, Paris
[SAM 80] SAMET H., Region Representation : quadtrees from boundaries codes,
Communication ACM, 1980, vol. 23, n3,p. 163-170
[SAM 90] SAMET H., Applications of Spatial Data Structures, Addison-Wesley, 1990
[SCH 89] SCHOLL M., VOISARD A., Thematic map Modeling, Int. Symposium on Large
Spatial Databases, 1989, LNCS n409, p. 167-192
[SCH 96] SCHOLL M., VOISARD A., PELOUX J.P., RAYNAL L., RIGAUX P., SGBD
Gographiques, Spcificits, Thomson Publishing, 1996, Paris
[SHA 78] SHAMOS M., Computational Geometry, PHD, 1978, Yale University
[SHL 88] SHLAER S, MELLOR S-J., Objet Oriented System Analysis : Modelling the World in
Data, Englewood Cliffs, 1988, Prentice-Hall
[VOI 92] VOISARD A., Bases de donnes gographiques : du modle de donnes linterface
utilisateur. Thse de doctorat, Universit dOrsay, 1992
[WOR 95] WORBOYS M.F., GIS, a Computer Perspective, 1995, Taylor&Francis

Modliser 93

Chapitre 4

Mesurer la localisation

Dans ce chapitre, nous allons dcrire les principes de mesure et de reprsentation


de la localisation dun lieu, du globe terrestre la carte. La prcision de la mesure
est essentielle car la notion de prcision est omniprsente dans la dfinition
conceptuelle dun objet gographique.
4.1. Introduction
Pour localiser un point sur la Terre, pour mesurer un lment ou un morceau de
la surface du globe terrestre et pour le reprsenter sur une feuille ou un cran (dans
tous les cas sur une surface plane), nous sommes confronts deux problmes
distincts : dune part connatre et mesurer la forme de la Terre pour pouvoir
facilement localiser un point sa surface, et dautre part reprsenter cette surface
curviligne sur une surface plane. La godsie est la discipline dont lobjet est la
mesure de la forme de la Terre. La godsie utilise presque constamment la notion
de verticale, et donc ncessite la connaissance de la gravit : on ne peut parler de
godsie sans introduire le gode gravimtrique terrestre, surface quipotentielle
pour la gravit, et nous parlerons donc galement de gravimtrie (discipline qui
traite de la gravit terrestre). Puisque ces deux surfaces, Terre et gode, sont
complexes, il faut dfinir une surface mathmatique de rfrence dont on connat
lquation (ce sera en loccurrence un ellipsode de rvolution) et se rapprochant au
mieux de lune ou de lautre pour pouvoir dcrire facilement une position sur le
globe terrestre et la reprsenter sur une feuille, par une opration de projection
cartographique. La projection cartographique elle-mme va introduire des
dformations, mais elles seront connues et quantifiables puisque lon est ramen ici
un problme de calcul et non plus de mesure.

96

Chapitre 4

Toutes les mthodes de positionnement et de mesure en godsie ont t


profondment modifies par lavnement des systmes de positionnement par
satellite. Paradoxalement, avec la possibilit actuelle de mesurer facilement et avec
grande prcision toute position dans les trois dimensions, grce aux systmes de
positionnement globaux de type GPS, il devient ncessaire de connatre les
principes gnraux de la godsie et de la gravimtrie pour estimer la prcision des
mesures. Les mthodes de projection gographique nont pas t modifies par cette
rvolution technologique, mais elles utilisent les rsultats de la godsie. De plus,
les moyens de calcul offerts par les ordinateurs en banalisent lutilisation.
Dans ce chapitre, nous aborderons donc les principes de la mesure de la forme
de la Terre, de la mesure dun lieu, puis les principes de la reprsentation de ces
lieux sur une surface plane.
4.2. Forme et mesure de la Terre : godsie et gravimtrie
4.2.1. Mesurer la forme de la Terre : la godsie
On sait depuis lantiquit que la Terre est un corps peu prs sphrique,
tournant sur lui-mme et tournant autour du soleil, avec sa surface quelques
rugosits peine sensibles par rapport au rayon. Bien sr, on ne peut se contenter
dune telle approximation. La surface relle de la Terre comporte des valles et des
montagnes, des creux et des bosses, que lon ne connat pas et que lon essaye de
mesurer. Les valles et les montagnes sont nanmoins ngligeables par rapport la
taille de la Terre. Le problme majeur est donc de trouver une surface de forme
gomtrique simple, reprsentant la forme globale de la Terre, et qui permette le
plus simplement possible de situer un lieu de la surface de la Terre dans deux
dimensions par sa projection orthogonale sur cette surface (fig 4.1). On pourra
exprimer ensuite la troisime dimension (laltitude par rapport cette surface) sur la
normale au lieu projet.
z

P h

P
P

b
O

fig. 4.1 : coordonnes godsiques, et projection dun point sur un ellipsode de rvolution

Mesurer la localisation 97
On chercha donc depuis trs longtemps dcrire et mesurer la surface du globe
terrestre, pour en trouver la forme gomtrique la plus proche [LEV 88]. Les
mesures sont difficiles, non seulement parce que lon cherche mesurer un corps
sur lequel on se trouve, mais aussi parce que ce corps est entour dune atmosphre
qui trouble les mesures optiques quand on vise les toiles. Ces toiles, utilises
depuis lantiquit, sont censes tre des corps immobiles : elles sont trop loignes
de la Terre pour que leurs mouvements propres soient sensibles - le rapport
[mouvements propres/distance par rapport au soleil] est ngligeable -, et aient une
quelconque influence par rapport au mouvement de la Terre. Elles sont donc
considres comme des corps fixes et permettent de dfinir des repres absolus.
On se heurtait, avant lavnement des satellites artificiels, un problme majeur
: ne connaissant pas la forme gomtrique exacte de la Terre (puisque cest
justement ce que lon cherche), on ne pouvait effectuer de mesure absolue lie
cette forme. Le seul moyen tait donc, partir dun point de rfrence, de mesurer
de proche en proche le lieu dautres points. En thorie, la mesure de la distance
entre deux points et de la direction par rapport aux toiles fixes permet, partir dun
point connu, de dcrire nimporte quel autre point du globe par ses trois
coordonnes dans un repre fixe li aux toiles. Mais voil, latmosphre fausse les
mesures optiques car la prsence dair courbe les rayons lumineux (par rfraction),
et ce phnomne est quasiment impossible mesurer car il dpend des conditions
mtorologiques le long du trajet suivi par la lumire, conditions qui changent le
long du parcours et que lon ne peut prvoir dans le temps.
Cette mthode directe ntant pas utilisable, il fut ncessaire de trouver autre
chose. Tout naturellement, une direction simpose en chaque point du globe : cest
la verticale, toujours mesurable, qui peut facilement tre mise en vidence par un fil
plomb ou un niveau bulle, ces objets matrialisant la direction du champ de force
li la gravitation universelle. Si lon dfinit (ou plutt si lon connat) une surface
mathmatique simple dont les normales se confondent avec les verticales au globe
terrestre, on peut projeter chaque point du globe sur cette surface de faon
biunivoque. Si lon peut situer sur le globe terrestre une verticale, on peut alors
situer le point correspondant sur cette surface : le problme est rsolu pour deux des
trois coordonnes. De plus, si lon arrive mesurer sur laxe des verticales les
diffrences de niveaux entre deux points du globe (en suivant la courbure de la
surface de rfrence), on a la coordonne manquante, et on peut donc dcrire
compltement la position dun point par rapport un autre. De proche en proche, on
peut ainsi connatre la forme gomtrique relle de la surface terrestre.
Mais voil, on ne connat pas non plus cette surface le gode gravitationnel-,
qui sest avre complexe car dpendant de multiples facteurs, comme par exemple
de la position interne des masses dans la Terre [GEO ] [CAZ 94]. La verticale est la
normale cette surface de forme complexe. En tant sur un point du globe terrestre,

98

Chapitre 4

on na donc pas de moyen simple de trouver, par projection orthogonale, le point


correspondant sur une surface mathmatique simple servant de rfrence et
approchant au mieux la surface relle. On a un moyen simple de trouver sa position
sur une autre surface, le gode, mais malheureusement on ne connat pas cette
surface a priori, puisquelle dpend de la valeur de la gravit, qui nest pas constante
sur le globe.
La triangulation est une mthode simple pour trouver, partir de deux points, la
mesure du lieu de la verticale un troisime. Application directe de la
trigonomtrie, elle a t invente par Snellius au XVIIe sicle et a servi de base
toutes les mesures godsiques, de la mesure de larc de mridien par Picard et
Cassini au XVIIe sicle jusqu lavnement des satellites... On se sert en chaque
point de la verticale relle, alors que les mesures dangles devraient tre effectues
en utilisant la normale la surface de rfrence pour projeter le point sur cette
surface. Mais si les diffrences de direction entre ces deux verticales sont
suffisamment faibles, les corrections apporter aux mesures sont ngligeables par
rapport la prcision de ces mesures.

fig. 4.2 : un thodolite et son utilisation en godsie


Supposons connue la position de deux points (un clocher et un chteau deau). On a plac une
mire sur le point dont on cherche la position. On va sur le chteau deau, et laide dun
thodolite (lunette tournant autour de la verticale et permettant de mesurer des angles,
invente par Galile), on vise le clocher, puis la mire; on rpte lopration partir du
clocher, en visant le chteau deau puis la mire (fig. 4.2). On dfinit ainsi deux plans, lun
passant par la verticale au chteau deau et par la mire, lautre passant par la verticale au
clocher et par la mire. Lintersection de ces deux plans donne donc une droite passant par la
mire. Lintersection de cette droite avec la surface de rfrence donne le point recherch sur
cette surface. La mesure est assez simple puisquelle ne fait intervenir que les angles des

Mesurer la localisation 99
vises, et la position des deux points dorigine, le chteau deau et le clocher, sur la surface
de rfrence. Connaissant la position de la mire, on peut rpter lopration en utilisant ce
nouveau point et le clocher pour dterminer la position dun quatrime point, et de proche en
proche, on dfinit sur la surface de rfrence une triangulation dont la position de chaque
point est connue. La prcision de la mesure de la position des deux premiers points est
fondamentale puisquelle dtermine la prcision de toutes les mesures qui suivent.

Le nivellement cherche quant lui mesurer les diffrences daltitude entre


deux points, mais le problme est plus complexe quil ny parat : utilisant dans
toutes les mesures la notion dhorizontale, le nivellement ne permet que de mesurer
la cote dun point au-dessus du gode, surface quipotentielle pour la gravit. Pour
rester indpendant du relief lui-mme (ce que lon cherche mesurer), on calcule
des diffrences de travail partir des diffrences de niveau. En effet, la mesure par
nivellement met en vidence deux surfaces quipotentielles pour la gravit, et la
distance (suivant la normale) entre ces deux surfaces nest pas constante : les
mesures de niveaux dpendent donc du chemin suivi. Par contre, le travail effectu
par la chute dune masse dune surface lautre est le mme, quel que soit lendroit
(par dfinition mme des deux surfaces). Il faut donc connatre, en chaque point
mesur, la valeur de la gravit, appele cote orthomtrique, altitude du point audessus dune surface quipotentielle de rfrence pour la gravit, le gode.

Terre
P
Ellipsode
Gode

Pour mesurer la diffrence daltitude entre deux points loigns, on est oblig deffectuer des
mesures successives entre points plus rapprochs pour viter les problmes de rfraction.
Entre deux points rapprochs (moins de cent mtres), on lit directement les dnivels grce
deux mires verticales gradues, chacune place en un des deux points. La lecture se fait par
une lunette dont lhorizontalit est assure par un niveau plac gale distance des deux
mires. On chemine ainsi le long dun parcours. Bien sr, la mesure finale doit tre
indpendante du chemin suivi : on ramne donc la valeur du dnivel une diffrence de
travail (produit du dnivel par la valeur de la gravit) en mesurant la cote orthomtrique en
chaque point du cheminement.

On a donc dplac et largi le problme : il sagit de trouver une surface


mathmatique simple approchant au mieux la forme de la Terre et dont les normales
concident au mieux avec la direction de la pesanteur la surface terrestre, et il

100

Chapitre 4

sagit galement de dterminer une surface approchant au mieux une surface


quipotentielle pour la pesanteur (le gode terrestre). On a maintenant deux
approches pour rsoudre le problme de la mesure de la surface terrestre, deux
approches intimement lies et complmentaires : lapproche gomtrique et
lapproche gravimtrique.
4.2.2. Lapproche gomtrique
La premire approche est purement gomtrique : ds le XVIIIe sicle, des
mesures la surface de la Terre ont permis de choisir lellipsode de rvolution
aplati aux ples comme une surface mathmatique rpondant peu prs la
question de la forme de la Terre.
On a cherch depuis lantiquit mesurer le rayon de la Terre (la premire mesure connue est
due Erathostne vers 250 avant J.C. en gypte), mais cest au XVIIe sicle que les avances
se prcipitent. De la mesure du rayon, on est pass la mesure de larc intercept la surface
de la Terre par un angle au centre de un degr, ce qui permet bien sr de calculer le rayon
correspondant. La Terre tait alors considre comme un solide de rvolution tournant autour
de laxe des ples, et assimile une sphre. En 1617, Snellius, abb hollandais, invente la
triangulation et mesure un arc de mridien. Son rsultat, 107 km par degr, est mauvais. En
1669, un autre abb, Picard, ralise un thodolite (grce une lunette de Galile) et obtient
une valeur excellente pour la mesure du degr quil calcule par triangulation prs de Paris
(111,212 km, soit une erreur de 1 pour mille). Mais en 1672, on constate quune horloge bien
rgle Paris retarde de 2 mn 30 par jour Cayenne. Huygens et surtout Newton, qui avait
dj labor sa loi de gravitation mais qui ne lavait pas encore publie, attribuent ce retard
une diminution de lattraction terrestre, et donc une augmentation de la force centrifuge : la
Terre ne doit pas tre une sphre mais un ellipsode de rvolution aplati aux ples. Les
astronomes Cassini (pre puis fils) avaient t chargs par la France de raliser une carte
prcise, et ils obtinrent des rsultats contraires aux intuitions de Newton. Louis XV ordonna
donc deux mesures de larc de mridien : lune prs du ple (expdition de Clairaut et
Maupertuis en Laponie), lautre prs de lquateur (expdition de La Condamine et Bouguer
en quateur, alors le Prou). Les rsultats confirmrent bien sr la thse de Newton. A partir
de cette date, de nombreuses mesures ont t effectues et de nombreux ellipsodes de
rvolution ont t proposs pour approcher au mieux la forme de la Terre. Le dernier date
dune dizaine dannes.

Lellipsode de rvolution est une surface mathmatique simple. Elle est


caractrise dans un repre cartsien par la position de son centre, par son grand
cot (habituellement dsign par a), et par son petit cot (habituellement dsign par
b). Souvent, un ellipsode est caractris par son grand cot et par son aplatissement
(f=(a-b)/a) ou par le carr de son excentricit (e2=(a2-b2)/a2).

Mesurer la localisation 101


Tout point dun ellipsode de rvolution peut tre caractris par deux des
coordonnes sphriques (la longitude et la colatitude), la troisime coordonne tant
donne implicitement par lappartenance du point lellipsode.
Profitons de ce paragraphe pour dfinir avec exactitude la terminologie
employe pour positionner un point dans lespace.
Le repre naturel est un repre cartsien, de centre O et daxes orthonorms i,j,k.
Tout point de lespace peut tre dfini par ses coordonnes cartsiennes dans ce
repre, habituellement nommes x,y,z. Le point peut galement tre dfini par ses
coordonnes sphriques : (angle iOP, o P reprsente la projection orthogonale
du point P dans le plan (i,j)), (angle kOP), R (distance OP).
Les coordonnes godsiques, ou gographiques, ne sont autres que les
coordonnes sphriques, en supposant que lellipsode de rvolution qui reprsente
la Terre soit centr sur lorigine de ce repre. Le rayon est omis, puisque le point se
trouve par dfinition sur lellipsode : on peut donc le calculer en connaissant la
forme de lellipsode. La longitude correspond , la colatitude .
Le nord gomtrique correspond au point de coordonnes (0,0) sur lellipsode.
Le nord magntique correspond au champ magntique et non au champ
gravitationnel. Le nord indiqu par une boussole nest donc pas le nord
gographique. La dviation est fonction du champ magntique, elle varie en
fonction du temps et du lieu.
En godsie classique, on opre en fait de faon inverse : la forme de lellipsode
de rfrence est dtermine par la mesure godsique, la position du centre de
lellipsode par rapport au gode est dtermine par une condition de tangence en
un point (le point fondamental). Une fois lellipsode ainsi plac, on dfinit un
repre cartsien : lorigine du repre est le centre de lellipsode, laxe des z passe
par les ples de lellipsode, laxe des x est plac de faon fixer la longitude dun
point donn (par exemple, 0 pour Greenwich ou Paris).
De nombreux ellipsodes de rvolution ont t dfinis pour approcher au mieux
la forme de la Terre une latitude donne. Ainsi, chaque service godsique a dfini
une forme dellipsode se rapprochant au mieux de la courbure de la Terre la
latitude de son pays, pour minimiser les dformations entre gode et ellipsode et
pouvoir utiliser la verticale sans induire trop derreur.
Une fois la forme de lellipsode dtermine, encore faut-il positionner cette
surface par rapport la Terre. Quel que soit lellipsode de rvolution considr, des
diffrences existent entre la normale au gode (cest--dire la verticale au globe
terrestre) et la normale lellipsode, sauf peut-tre en un point. Comme toute

102

Chapitre 4

triangulation part dun point fondamental dont la position est calcule avec
beaucoup de prcision, chaque service godsique a choisi de positionner
lellipsode en le rapprochant au mieux de la verticale corrige au point fondamental
(verticale observe corrige de linfluence des mouvements de la Terre et de
lattraction des autres astres) en imposant donc quen ce point, ellipsode et gode
soient tangents au mme plan. La position de lellipsode par rapport la Terre est
dtermin par cette condition. Lensemble des paramtres - forme et position de
lellipsode - est appel datum. Toute mesure dun point sur la Terre (donne par
exemple en longitude-latitude) dpend donc du datum auquel elle se rapporte. Nous
verrons plus loin comment passer dun datum un autre.
De nombreux ellipsodes ont t ainsi dfinis. Par exemple, la triangulation qui
couvre la France entire a t rapporte lellipsode de Clarke 1880 (a=6 378 249
m, (a-b)/a =1/293,5) avec comme point fondamental la croix du Panthon Paris.
LAssociation Internationale de Godsie a dfini en 1909 puis en 1924 un
ellipsode particulier pour toutes les tudes internationales, appel pour cela
ellipsode international (Hayford, 1909 ou 1924 : a=6 378 388, (a-b)/a =1/297).
Un ellipsode de rvolution est caractris par son grand cot -a- et son petit cot
-b-. En godsie, on considre plutt le grand cot et laplatissement (a-b/a) ou le
carr de lexcentricit (e2=(a2-b2)/a2). Nous verrons plus loin comment les
problmes lis la bonne projection dun ellipsode sur un plan ont influenc le
dveloppement des mathmatiques dans beaucoup de ses domaines modernes
(calcul diffrentiel, gomtrie analytique).
Voici les ellipsodes les plus couramment utiliss [MAG 97] :
Nom

a (mtres)

Aplatissement (a-b)/a

Airy 1830

6377563.396

1/299.3249646

Australian National

6378160

1/298.25

Bessel 1841 (Ethiopie, Indonesie, Japon, Core)

6377397.155

1/299.1528128

Bessel 1841 (Namibie)

6377483.865

1/299.1528128

Clarke 1866

6378206.4

1/294.9786982

Clarke 1880

6378249.145

1/293.465

Everest

6377298.556

1/300.8017

6377276.345

1/300.8017

Everest India 1956

6377301.243

1/300.8017

Everest Malaisie occidentale, Singapour

6377304.063

1/300.8017

Brunei, Malaisie orientale (Sabah, Sarawak)


Everest India 1830

Mesurer la localisation 103


Everest, Malaisie orientale 1969

6377295.664

1/300.8017

Geodetic Reference System 1980

6378137

1/298.257222101

Helmert 1906

6378200

1/298.3

Hough 1960

6378270

1/297

International 1924

6378388

1/297

Krassowsky 1940

6378245

1/298.3

Modified Airy

6377340.189

1/299.3249646

Modified Ficher 1960

6378155

1/298.3

South American 1969

6378160

1/298.25

WGS 72

6378135

1/298.26

WGS 84

6378137

1/298.257223563

Les ellipsodes de rvolution utiliss en pratique nont malheureusement pas le


mme centre, puisque leur position est dfinie par un point de tangence entre le
gode et lellipsode (le point fondamental). Si lon ne connat pas la position
relative dun point de tangence par rapport un autre, on ne pourra passer dun
systme godsique un autre. Pour comparer la localisation de deux points, il faut
que cette localisation ait t mesure dans le mme datum. Des coordonnes dun
point de la Terre exprimes en longitude et latitude ne sont donc pas absolues : elles
dpendent du datum utilis. Linfluence du datum peut atteindre plusieurs secondes
darc, soit plusieurs centaines de mtres aprs projection dans un plan. La ncessit
davoir un systme global est rapidement apparue pour les applications
intercontinentales, comme la balistique civile ou militaire. Plusieurs datum globaux
ont ainsi t dfinis (WGS 60, WGS 66, WGS 72, WGS 84), mais les positions ne
peuvent tre dtermines dans ces datum que par calcul (changement de datum
partir dune position donne dans un datum local) ou positionnement global par
GPS. Nous verrons plus loin mthodes et programmes pour changer de datum.
Notons galement que lon parle de datum vertical car, si la condition de tangence
est impose, laltitude du point de tangence nest pas fixe, et lorigine sur laxe des
z est choisie par chaque service cartographique. Ainsi, on a souvent une diffrence
dans le calcul de laltitude entre cartographie terrestre et cartographie marine.
Avant lapparition des satellites artificiels et des mthodes de positionnement
global, il tait difficile de relier deux triangulations ne partant pas du mme point
fondamental si ces deux triangulations ne pouvaient se rejoindre. Cest bien sr le
cas des les et des continents, puisque lon ne peut trianguler sur la mer quavec des
techniques particulires. Pour cette raison, la cartographie des les a toujours t
difficile relier la cartographie des continents, car chaque le loigne avait besoin
dun datum propre. Les problmes de ce type ont t rsolus grce aux satellites
artificiels et la gravimtrie qui permet davoir une approche globale.

104

Chapitre 4

Chaque point dun ellipsode de rvolution (et donc le point de la surface


terrestre auquel il correspond) peut tre repr par rapport au centre de lellipsode
par des coordonnes sphriques : la longitude et la latitude. Lorigine des longitudes
est dtermine de faon arbitraire : on prend le plus souvent le mridien passant par
la projection sur lellipsode de la ville de Greenwich (Angleterre), quelquefois celui
passant par celle de Paris (Observatoire de MontSouris). Lorigine des colatitudes
est le ple nord. Le plus souvent, on parle de latitude nord ou sud, en prenant
comme origine lquateur (ligne de colatitude 90), et de longitude est ou ouest,
suivant le sens dans lequel on tourne, en mettant le nord en haut. Toutes ces
conventions nous viennent bien sr de lantiquit. Lunit est le degr (2/360) ou
le grade (2/400). La diffrence entre le mridien de Greenwich et celui de Paris est
de 2 20 14,02500.
4.2.3. Lapproche gophysique
Lautre approche, pour dterminer la forme de lellipsode, est gophysique. Elle
cherche dterminer la forme du gode et en dduire directement la forme de
lellipsode. Elle fait donc appel ltude du champ de pesanteur la surface du
globe. On dispose donc ici dun outillage mathmatique beaucoup plus important
qui laisse esprer une rsolution thorique globale du problme : dterminer
lquation complte de la surface quipotentielle recherche, le gode. Mais comme
on le verra, subsiste une certaine ambigut : la mesure de laltitude au-dessus de
lellipsode ncessite la connaissance du gode, et la dtermination exacte du
gode ne peut se faire quavec la connaissance du relief. Mais heureusement, les
deux disciplines se compltent car les chelles de prcision requises ne sont pas du
mme ordre dans chaque domaine, et les avances de lune servent amliorer les
mesures de lautre. Le dveloppement des techniques (notamment spatiales) a
considrablement enrichi les possibilits de mesures, en arrachant enfin le godsien
de la surface quil doit mesurer.
4.2.3.1. Gravit et gode.
On ne peut donc tablir de mesure de la forme de la surface terrestre sans
connatre la gravit. Grce la loi dattraction universelle, on sait que la force de
pesanteur drive dune fonction de force, et donc quil existe une famille de surfaces
(toutes homothtiques par rapport au centre de gravit des masses) qui sont
perpendiculaires en tous leurs points la direction de la pesanteur. Ces surfaces sont
appeles quipotentielles (La valeur de la gravit nest pas la mme en tout point
dune surface quipotentielle : ce nest vrai que pour le potentiel dont elle drive).
On montre galement que la surface dun fluide homogne en quilibre concide
avec une quipotentielle de pesanteur. Le niveau moyen des mers et ocans suit
donc une telle quipotentielle : cette surface particulire est appele gode [CAZ

Mesurer la localisation 105


94] [BAL 98]. En dehors des mers et ocans, elle passe sous la surface terrestre.
Dautre part, on montre facilement que la forme de la surface dun fluide homogne
en rotation uniforme autour dun axe et soumis lattraction universelle est, en
quilibre, un ellipsode aplati aux ples. On retrouve la forme approche de la Terre
connue depuis le XVIIIe sicle.
Il aurait t bien agrable de ramener toutes les mesures godsiques et
gravimtriques au gode, si celui-ci avait prsent une forme simple. Mais cette
forme nest pas connue et na aucune raison dtre une forme simple puisque la
Terre et la rpartition des masses qui la composent sont complexes. On ramne
donc les mesures un ellipsode de rvolution qui sera pris comme surface
thorique de rfrence pour la gravit.
Pour un godsien, le gode correspond la dviation de la verticale, cest-dire la diffrence entre la verticale observe la surface et la verticale lellipsode
de rfrence. On a donc mesur cette dviation sur un certain nombre de points (en
sappuyant sur les astres). En interpolant de faon linaire dans les triangles obtenus
en reliant tous ces points, on obtient une surface appele gode astrogodsique,
qui permet dvaluer la cote du gode par rapport lellipsode de rfrence.
On dmontre que la forme dune surface quipotentielle, lintrieur de laquelle
se trouvent toutes les masses, est dtermine si on connat en tous ses points
lintensit de la pesanteur. Do une seconde mthode, gophysique et non
gomtrique, pour la dtermination du gode : la prospection gravimtrique,
consistant mesurer la pesanteur en un rseau dense de points de la surface. On
calcule en fait les anomalies de la gravit, diffrence entre la gravit mesure puis
corrige et la gravit thorique sur lellipsode de rfrence. A partir du gode,
surface quipotentielle, on pourra thoriquement dduire le potentiel de gravit dans
tout lespace extrieur. La prospection sur la mer est difficile, mais le lancement de
satellites capables de mesurer directement par radar laltitude relative sur la mer
avec une prcision du centimtre (SEASAT, Posedon, ERS1) a rsolu le problme.
On calcule facilement la gravit thorique la surface dun ellipsode en rotation
partir de ses caractristiques gomtriques :
g=ge(1+sin2)
Quelle que soit la densit, on a toujours applatissement+=5/2(w2a/ge), w tant
la rotation de lellipsode. Lassociation Internationale de Godsie a donc fix la
valeur de la gravit la surface de lellipsode de Hayford :
g=978.049(1 + 0.005 288 4sin - 0.0000059sin2).

106

Chapitre 4

Pour trouver la forme du gode, on peut utiliser la formule de Stockes si lon


connat la diffrence entre la gravit thorique sur lellipsode et la gravit sur le
gode, condition de supposer que le gode contient toutes les masses. Or on part
dune mesure effectue au sol, au-dessus du gode. On doit donc, pour estimer la
valeur de la gravit sur le gode, effectuer plusieurs corrections :
- une correction daltitude, puisque le point mesur est plus haut que le gode.
On obtient une diminution de 30.8 mgals pour 100 m dlvation (la correction se
calcule bien sr par rapport la pesanteur thorique).
- une correction de plateau, consistant corriger lexistence de matire
extrieure au gode alors quon la suppos contenir toutes les masses : on comble
lespace entre le point de mesure et le gode par de la matire et on en calcule
linfluence gravitationnelle.
- une correction topographique, pour tenir compte du model du relief au
voisinage du point de mesure.
La somme de ces trois corrections est appele correction de Bouguer. Les
anomalies de Bouguer sont donnes par la diffrence entre gravit mesure et
gravit thorique moins la correction de Bouguer. La forme systmatique de ces
anomalies par rapport au relief a donn lieu lintroduction dune force de
compensation dpendant vraisemblablement de la densit de la crote terrestre et de
sa raction sculaire et lastique la surcharge, appele isostasie.
La troisime mthode est plus gnrale, et consiste, linverse, rechercher
directement lexpression mathmatique du potentiel dans tout lespace et den
dduire la forme du gode. La fonction de force dfinissant la gravit est dfinie
par lquation diffrentielle indiquant lannulation du Laplacien en dehors des
masses : la forme des solutions de cette quation est connue et peut tre exprime en
srie de fonctions sphriques, mais les coefficients sont dterminer par
lexprience. Pour cela, on suit le mouvement des satellites artificiels par laser,
partir dun certain nombre de stations au sol. On approche la valeur des coefficients
de chaque terme de la srie grce aux caractristiques de ces trajectoires, corriges
de linfluence des autres astres et de latmosphre. Les rsultats obtenus par
gravimtrie sont galement utiliss pour affiner le calcul des coefficients dont les
effets sont trs faibles.
Les solutions de lquation diffrentielle indiquant lannulation du Laplacien
sont constitues des fonctions harmoniques, qui elles-mmes peuvent tre
dveloppes en srie de fonctions sphriques, cest--dire fonctions des puissances
de 1/r. A la distance r du centre de gravit des masses, dans la direction ,, le
potentiel de pesanteur est donn par une expression de la forme :
v=GM/r(1+J1P1(,)(a/r)2 + J2P2(,)(a/r)3 + ...)

Mesurer la localisation 107


o a reprsente le rayon quatorial de la Terre, M la masse de la Terre, G la
constante de gravitation universelle, Pn(,) des fonctions de la direction (,) du
point dobservation par rapport au centre de gravit. reprsente lorientation,
linclinaison.
Ce dveloppement a une interprtation physique immdiate : linfluence de
chaque terme apparat au fur et mesure que lon se rapproche de la Terre. En
ngligeant tous les coefficients, le potentiel est celui dune sphre, cest ce qui se
passe si r est grand. En ne ngligeant plus J1, on obtient lquation dun ellipsode
aplati : le terme est proportionnel (1/r3)(3cos2 -1)/2, J1 est de lordre de 1/1000,
puisque laplatissement de la Terre est de lordre de 1/300. Grce aux autres termes
(qui sont de lordre de 1/1000000) on obtient des carts locaux avec lellipsode
pouvant aller jusqu 100 mtres.
En 1982, la NASA a calcul un modle de gode en dterminant 20 termes,
exclusivement bas sur des donnes de poursuite de satellites. La prcision est de
lordre du centimtre pour les coefficients dordre deux, et de lordre du mtre
lordre 20. Depuis, dautres modles ont utilis plus de trente termes, en intgrant
des donnes daltimtrie sur les ocans et de gravimtrie au sol.
La connaissance de la valeur de la pesanteur en tout point de lespace est dune
importance primordiale en science spatiale et en balistique : elle permet, entre autre,
de prvoir la trajectoire exacte dun satellite artificiel ou dun missile (fig. 4.3).

fig. 4.3 : dformation du gode terrestre, lchelle 10000 (daprs [CAZ 94])

4.2.3.2. De nouveaux ellipsodes


Lellipsode de rfrence, depuis toujours dtermin par des considrations
gomtriques, peut maintenant tre dfini par une simplification de lexpression du

108

Chapitre 4

potentiel, en se limitant au terme en (1/r)3 dans lquation fondamentale du gode


(on obtient des valeurs proches de 6 378 160 m, avec un aplatissement de 1/298,25).
Ainsi ont t dfinis successivement les systmes godsiques mondiaux WGS
60, WGS 66, WGS 72, WGS 84. Les modifications successives correspondent aux
avances dans la recherche de la forme du gode gravitationnel, notamment par les
mesures de poursuite de satellites artificiels. La position de lellipsode est en
gnral donne en fixant le centre de lellipsode au centre de gravit des masses de
la Terre (indpendamment dune condition de tangence en un point).
4.2.4. Nouveaux instruments, nouvelles mesures, nouvelles prcisions
Si nous avons prsent triangulation, nivellement et autre mthodes de mesure,
cest que la plupart des travaux en cartographie et reprsentation de la Terre sont
encore attachs ces techniques, malgr lmergence dinstruments nouveaux qui
ont rvolutionn la godsie et la gravimtrie.
Dans le domaine de mesures de distances, on est pass du fil talonn au
telluromtre (mesure du temps daller et retour dune onde lectromagntique), puis
au godimtre laser (mme chose mais avec une onde lumineuse cohrente). Les
mesures dangles, la base de la triangulation, peuvent tre remplaces par des
mesures de distances. Les angles taient mesurs au thodolite avec une prcision
relative de 1/200000, celle des distances est maintenant suprieure 1/500000.
Dans le domaine du positionnement, la godsie spatiale permet maintenant de
connatre le lieu dun point indpendamment de la notion de verticale. Les mesures
prennent appui sur un certain nombre de stations au sol dont la position est connue
de faon trs prcise par des mesures sur des signaux intergalactiques. Le principe
de base est simple : partir de deux points connus, on peut dterminer la position
exacte du satellite linstant t. Si au mme instant t, on repre partir dun point
inconnu la position du satellite par rapport aux toiles, on peut en dduire la position
de ce point. Actuellement, on calcule directement la position du point inconnu par
rapport aux satellites.
4.2.4.1. Le systme GPS
Le systme GPS fonctionne sur ce principe, mais avec un rseau de plusieurs
satellites en ne prenant en compte que la distance et non la direction. Chaque
satellite met en continu des signaux qui permettent un point rcepteur dvaluer
la distance qui le spare du satellite, en mesurant le temps de rception du signal
(pour cela, chaque satellite est quip dune horloge atomique trs prcise) [BOT
98]. La position de chaque satellite est repre grce un rseau de stations au sol;
cette position est galement transmise au point rcepteur via le satellite, qui met de

Mesurer la localisation 109


plus des informations sur sa trajectoire et sur les conditions atmosphriques de
transport des signaux. La rception de la position de trois satellites permet un point
rcepteur de calculer sa position sur un ellipsode. Avec quatre, on peut galement
avoir laltitude. La prcision dpend principalement de la gomtrie du polydre
form par les satellites et le point rcepteur, de la position des artes par rapport
latmosphre et lionosphre (les erreurs sont dautant plus fortes que llvation du
satellite par rapport lhorizon est faible), de la qualit de la synchronisation des
horloges, de la densit des signaux rflchis, du type de rcepteur employ. Pour
les coordonnes horizontales, la prcision, en mesure absolue, varie de quelques
dizaines de mtres un mtre; en mesure relative (on mesure alors la phase des
signaux), elle peut tre suprieure au centimtre. La mesure de laltitude est bien
sr plus dlicate, et dune moindre prcision.
Le rseau comprend, en 2000, 28 satellites, dont 6 de rserve, ce qui permet
datteindre chaque point du globe tout moment. La connexion des satellites russes
au rseau amricain permet dobtenir des configurations gomtriques encore
meilleures, donc une amlioration du temps et de la prcision des mesures.
La plus grande prcision est obtenue par les mesures diffrentielles : plutt que
de mesurer une position absolue, on mesure la diffrence entre un point connu et le
point dterminer. La simultanit des mesures permet dliminer la plupart des
sources dimprcision, et datteindre ainsi en relatif une prcision infrieure au
centimtre.
Lors dune mesure par GPS, la position du point est donne par rapport une
surface de rfrence, gode ou ellipsode. Lorsque lon utilise un ellipsode, le
datum est important, puisque le GPS peut donner la mesure suivant plusieurs datum.
La connaissance de toutes ces notions est donc fondamentale pour une bonne
utilisation de ces instruments, surtout lorsque les mesures effectues doivent tre
intgres dans un systme dinformation.
Le systme GPS (Global Positioning System) est un systme de navigation et de
positionnement mondial utilisant une constellation de 28 satellites. Son tude, son
financement et son entretien sont entirement assurs par le Dpartement de la Dfense des
Etats-Unis, qui se rserve le droit de dgrader le signal pour des raisons stratgiques et
militaires. Les satellites GPS voluent sur des orbites circulaires une distance de lordre de
20200 km de la Terre, ce qui correspond une priode de rotation de lordre de 12 heures.
Les rcepteurs GPS permettent de capter et traiter les signaux envoys par les satellites. La
disponibilit du systme dpend du nombre de satellites observables durant les mesures et de
leur positionnement gomtrique qui influe sur la qualit des rsultats.
Le mode absolu

110

Chapitre 4

Dans un mode dutilisation o le rcepteur GPS fournit des coordonnes de manire


instantane et de faon autonome (mode absolu), le GPS permet de fournir une position
quelques mtres prs. Cette prcision assez modeste est la consquence de plusieurs facteurs :
erreurs du segment spatial : erreur sur les paramtres orbitaux des satellites (20 m),
erreur sur lhorloge propre du satellite par rapport au temps GPS (quelques mtres).
erreur de propagation : le signal GPS se propage depuis le satellite vers lantenne du
rcepteur. Il traverse ainsi la totalit de latmosphre terrestre et subit les influences des
diffrentes couches. Lionosphre retarde le signal en fonction de lactivit solaire et de
la situation gographique (erreur entre 0 et 50 m). La troposphre influence la
propagation du signal par lintermdiaire de phnomnes de rfraction. Cette erreur est
trs sensible aux basses lvations du satellite (erreur entre 2 et 5 m).
erreur de multi-trajets : le signal GPS peut subir, lapproche de toute surface proche de
lantenne de rception, une rflexion qui rallonge le chemin optique parcouru. Cet effet
est connu sous le terme de multi-trajets. On peut lliminer en loignant lantenne de
toute surface mtallique proche et en lquipant dun plan de masse absorbant les
signaux rflchis par le sol.
erreur due la prcision de lhorloge du rcepteur (lhorloge du rcepteur sert mesurer
des diffrences de temps). Cette erreur est plus importante que celle induite par lhorloge
du satellite car la qualit de lhorloge dtermine directement le cot du rcepteur
(environ 20 m).
Le mode diffrentiel
Comme la prcision de la localisation GPS absolue est parfois insuffisante, il est possible de
contourner le problme et deffectuer la localisation relative dun point par rapport une
rfrence connue : deux rcepteurs GPS vont faire des mesures simultanes sur les mmes
satellites, pour permettre de dterminer les diffrences de coordonnes entre les deux stations.
On parle alors de GPS diffrentiel. Le calcul des coordonnes se fait en post-traitement aprs
dchargement sur un ordinateur des mesures enregistres par les deux rcepteurs. Il sagit
dun positionnement relatif par rapport une station de rfrence place sur un point connu.
On doit donc disposer de deux rcepteurs qui effectuent des mesures simultanes, lun sur le
point dterminer, lautre sur la station de rfrence. Le principe du diffrentiel consiste
retirer les erreurs systmatiques corrles entre la station de rfrence et la station mobile. Le
bilan derreur va tre considrablement rduit :
lerreur dhorloge du satellite va sannuler lors du traitement des observations
simultanes.
les erreurs dorbite vont tre rsiduelles ou ngligeables,
lerreur de propagation ionosphrique sera considrablement rduite si les deux
rcepteurs ne sont pas loigns de plus de 20 km environ,
lerreur de propagation troposphrique sera galement diminue, surtout sil nexiste pas
une trop grande diffrence entre les conditions mto chaque rcepteur (attention aux
grandes diffrences daltitude),
en revanche, les erreurs multi-trajets sajoutent les unes aux autres,
lerreur due lhorloge du rcepteur sera du mme ordre que pour le positionnement
absolu, mais peut tre rduite par les mthodes de double diffrence.
La prcision du positionnement relatif varie entre 0.1 et 5 m environ, et dpend
essentiellement de la qualit des rcepteurs et du nombre de mesures effectues sur le point

Mesurer la localisation 111


mesurer. Dans le cadre dun GPS diffrentiel post-trait, la station de rfrence sera quipe
dune mmoire lui permettant denregistrer les mesures ralises. Les mesures seront
rcupres ultrieurement par lutilisateur sur un ordinateur par connexion directe ou par
modem. La station mobile enregistre galement les mesures propres chaque point. Le
logiciel de post-traitement permet de traiter les mesures et de calculer les positions des points
avec la prcision requise. Plus le nombre de mesures augmente meilleure est la prcision. Il
faut au minimum une centaine de mesures pour permettre un calcul diffrentiel sur un point
fixe.

4.2.4.2 Les changements de datum


Avec les techniques gomtriques, toute nouvelle mesure sappuyait sur un point
connu de la triangulation, et utilisait donc le datum local. Avec lavnement du
GPS, des mesures peuvent tre effectues indpendamment du datum normalement
utilis localement. Lorsque toutes ces mesures doivent tre intgres dans un mme
systme, il devient ncessaire de savoir comment transformer les coordonnes
sphriques (longitude, latitude) dun datum un autre. Les coordonnes dans des
datum diffrents dun mme point physique peuvent donner des diffrences de
plusieurs dizaines de mtre aprs projection.
Les ellipsodes dfinis au cours du temps pour approcher la Terre et positionner
un point diffrent par leur forme ou leur centre, ou les deux. Pour passer des
coordonnes gographiques dun point par rapport un datum aux coordonnes du
mme point par rapport un autre datum, il faut donc connatre les formes des deux
ellipsodes de rvolution et les carts de position entre les deux centres. Cest encore
grce ltude du mouvement de satellites artificiels que lon a pu mesurer les
carts de position du centre de la plupart des datum avec le centre des masses de la
Terre, qui est par dfinition le centre du datum WGS84. Ces carts de position ont
une prcision qui varie selon les datum, de quelques mtres quelques dizaine de
mtres. Beaucoup de datum utilisent lellipsode international dfini en 1924.
Exemples de datum et des valeurs DX,DY,DZ par rapport WGS84 :
PROVISIONAL SOUTH CHILEAN 1963 (Southern Chile):
Ellipsode : International 1924;
DeltaX=16.; DeltaY=196.; DeltaZ=93.;
PUERTO RICO:
Ellipsode : Clarke 1866;
DeltaX=11.; DeltaY=72.; DeltaZ=-101.;
QATAR NATIONAL:
Ellipsode : International 1924;
DeltaX=-128.; DeltaY=-283.; DeltaZ=22.;
SCHWARZECK (Namibie) :
Ellipsode : Bessel 1841 Japan;
DeltaX=616.; DeltaY=97.; DeltaZ=-251.;

112

Chapitre 4

Deux principales mthodes permettent deffectuer cette transformation. La plus


connue utilise la formule de Molodensky. Cette formule correspond un calcul
approch, si bien que la transformation a une prcision limite (environ 3 mtres), et
quelle nest pas utilisable prs des ples. L implmentation en C++, utilise dans
le module SAVEDIT (voir chapitre 7), est donne dans la classe CMolodensky
(A.2.3.3.). La seconde mthode est base sur la recherche des coefficients par suivi
de la trajectoire de satellites.
4.2.5. Prcision des mesures
Il est essentiel de parler de la prcision des techniques et des mesures que nous
avons mentionnes, dautant plus que la reprsentation cartographique va induire
dautres dformations. On a souvent tendance perdre de vue le domaine de validit
dune mesure, mlanger des chelles de prcision diverses et souvent
incompatibles. Par exemple, un changement dellipsode de rfrence induit des
diffrences de latitude largement suprieures aux erreurs dobservation (sur une
distance de mille kilomtres, du nord au sud de la France, la diffrence reprsente
un cart de lordre de quatre dcimilligrades). Bien sr, cela concernait plus le
gomtre que le gographe, mais le dveloppement du stockage informatique et des
systmes dinformation gographique rend cette question importante, car le systme
facilite laccessibilit de mmes donnes plusieurs groupes dutilisateur qui nont
pas forcment les mmes besoins de prcision, ou qui ne savent plus valuer, ni ce
dont ils ont ou auront besoin, ni ce quils utilisent vraiment.
4.3. Reprsenter lellipsode sur une surface plane : cartographie et projections
On sait maintenant ramener la position dun point dans lespace gographique
(dans les trois dimensions) sa position par rapport un ellipsode de rvolution.
Pour reprsenter un bout de cette surface sur une feuille (cest dire une surface
plane) ou sur un cran dordinateur (ou plutt sur la mmoire graphique
correspondante, qui peut tre galement considre comme une surface plane, alors
que certains crans sont encore un peu bombs), il faut passer de la surface
curviligne dun corps dans un espace trois dimensions une surface plane deux
dimensions. Comme les ellipsodes ne sont pas dveloppables sur un plan (un
cylindre ou un cne peuvent tre dvelopps sur un plan; la surface dune sphre,
dun ellipsode de rvolution ne peut pas ltre sans dchirement), il faut utiliser une
fonction mathmatique, que lon veut bijective, pour effectuer cette transformation :
cette fonction sappelle une projection cartographique. Elle sapplique aux points
comme aux lments linaires et surfaciques.

Mesurer la localisation 113


Passer dune surface curviligne non dveloppable une surface plane implique
des dformations, dont on cherche au mieux matriser les caractristiques suivant
le but recherch de la reprsentation cartographique : conserver les formes, les
distances, les surfaces, les angles... Choisir la fonction de projection permet de
choisir les caractristiques de la dformation.
La projection nest donc plus un problme de mesure mais seulement de calcul,
puisque lon part de lellipsode et que toutes les mesures ont t effectues
auparavant. La prcision est donc lie au calcul, alors quelle tait principalement
lie aux mesures dans les problmes prcdents, en godsie comme en gravimtrie.
De mme, connatre la dformation induite par la projection nest quun problme
de calcul, et la prcision en est donne par la prcision du calcul utilis.
4.3.1. Les dformations
Revenons au problme de la projection : reprsenter une partie de lellipsode de
rfrence sur une surface plane en matrisant les paramtres de la dformation.
Notons tout de suite que le terme projection est mal choisi, car il peut faire croire
une transformation surjective, alors que dans son domaine de dfinition, la
transformation sera toujours une application bijective : on pourra toujours dfinir la
projection inverse dune projection donne. Les dformations introduites par la
projection sont dfinies par les relations entre lments correspondants sur les deux
surfaces, lellipsode et le plan, et essentiellement par ltude diffrentielle de la
dformation, cest dire ltude de la dformation en un point et au voisinage
(infinitsimal) de ce point suivant une direction donne. On a lhabitude de classer
les dformations suivant trois groupes :
- les dformations linaires : au voisinage dun point, on compare la longueur
dun segment sur lellipsode et la longueur du segment projet sur le plan. En
gnral, le rapport des longueurs (appel module de dformation linaire ou chelle
locale) varie avec le point et avec la direction du segment. En tudiant la distribution
du module de dformation linaire dans le plan de projection, on peut y dfinir des
lignes isomtriques (tous les points de la ligne ont mme chelle locale). Si le
module linaire est gal 1, il ny a aucune dformation linaire quelque soit la
direction considre. On dfinit galement les lignes automcoques : le module de
dformation linaire est gal 1 mais seulement dans la direction de la ligne.
Aucune projection ne conserve les distances en tout point : une telle proprit
impliquerait labsence totale de dformation. Les lignes automcoques sont
importantes, car sur ces lignes, les distances (planes) dans le plan de projection
correspondent aux distances (curvilignes) sur lellipsode. Elles permettent donc de
fixer une unit de longueur dans le plan de projection.

114

Chapitre 4

- les dformations surfaciques : on considre au voisinage dun point un lment


de surface et la projection de cet lment dans le plan. Si le module de dformation
des superficies est gal 1 en tout point, la projection sera dite quivalente.
- les dformations angulaires : au voisinage dun point, on considre deux
lments linaires formant un angle . Ces deux lments se transforment en deux
lments dans le plan, formant un angle . On appelle dformation angulaire la
diffrence des angles -. Les projections conformes ont comme proprit de
conserver les angles (la dformation angulaire est nulle en tout point).
La connaissance des dformations induites par la projection est importante
lorsque lon veut retrouver une valeur curviligne (sur lellipsode, et donc sur la
surface terrestre) partir dune mesure sur une carte : on souhaite minimiser les
calculs effectuer entre la mesure sur la carte et la correspondance sur lellipsode.
Par exemple, une projection conforme conserve les angles : on peut donc mesurer
directement un angle sur une carte utilisant une projection de ce type, cet angle sera
le mme sur lellipsode (les projections conformes sont trs utilises en balistique et
en navigation). Le calcul dune distance est plus difficile, car aucune projection ne
permet de conserver les distances entre deux points quelconques. Avant le
dveloppement des ordinateurs, on utilisait des tables dinterpolation pour ces
calculs, et la prcision de linterpolation donnait la prcision du calcul.
Lautomatisation des calculs grce aux ordinateurs et la cartographie numrique ont
rendu ces tables dinterpolation quelque peu obsoltes.
Dautres proprits peuvent tre importantes. Par exemple, la projection
Mercator est non seulement conforme, elle a galement lavantage de transformer
les loxodromies (routes cap constant) en des droites, ce qui facilite la navigation
sur de courtes distances.
Beaucoup de concepts mathmatiques proviennent de problmes
cartographiques, ou plus gnralement de problmes de reprsentation de la Terre.
Ces problmes ont t depuis lantiquit un moteur du dveloppement thorique :
fonctions analytiques, calcul diffrentiel, etc. Par exemple, la condition de
conformit est identique la condition dholomorphisme pour les fonctions
analytiques (quations de Cauchy-Riemann).
4.3.2. Les surfaces dveloppables
Les projections peuvent galement tre classes dune autre faon, en utilisant
une surface intermdiaire dveloppable sur laquelle on effectue une premire
projection. La forme de cette surface intermdiaire dtermine :

Mesurer la localisation 115


- les projection coniques, tangentes ou scantes : on choisit un cne tangent ou
scant lellipsode. La projection Lambert est la plus clbre des projections
coniques conformes ;
- les projections cylindriques : cest un cylindre qui est tangent lellipsode ;
- les projections planes (ou perspectives), en projetant directement sur un plan
tangent la surface de lellipsode (par exemple dans les projections utilises aux
ples).
Suivant la position de laxe de la surface par rapport laxe de lellipsode, on
parle galement de :
- projections directes : laxe de la surface dveloppable est identique laxe de
rotation de lellipsode (Lambert, Mercator,...) ;
- projections transverses : laxe de la surface est perpendiculaire laxe de
rotation (par exemple, la projection Universal Transverse Mercator) ;
- projections obliques ou horizontales, si laxe est un diamtre quelconque de
lellipsode.
4.3.3. Coordonnes et espace de projection
La projection transforme un point de coordonnes (,) de lellipsode en un
point dun plan dans un repre orthonorm (O,i,j), dorigine O. On a le choix de
lorigine et de lunit dans le plan. Lorigine est le plus souvent choisie en prenant
un point Po de coordonnes (0,0) sur lellipsode, et en fixant des coordonnes
(X0,Y0) du point projet dans le plan (O,i,j). On sarrange en fait pour choisir
(X0,Y0) de manire ne pas avoir de coordonnes ngatives pour le domaine
projet, pour la partie de lellipsode laquelle on sintresse. 0 sappelle alors le
mridien central, X0 le faux nord (FALSE NORTHING), Y0 le faux est (FALSE
EASTING). Par exemple, pour la projection UTM, on fixe 500000 la valeur de
X0, abscisse de la valeur projet du point P0 de coordonnes sphriques (0,0).
Lunit est toujours le mtre. On essaye l aussi davoir la meilleure correspondance
entre la distance curviligne (distance mesure sur lellipsode entre deux points,
cest dire longueur de larc) et la distance entre les points projets dans le plan.
Les projection ne conservent pas les distances, comme nous lavons vu plus haut,
sauf sur les lignes isomtriques ou automcoques o les distances sont conserves.
La dfinition de lunit utilise lune de ces lignes, en prenant en compte la valeur du
module linaire correspondant la ligne (pour cela appel facteur dchelle locale).
Si on utilise une ligne automcoque pour dfinir lunit de la projection, on aura sur
cette ligne conservation des distances, dans la mme unit. Nous verrons dans les
exemples de projections, plus loin dans ce chapitre, quelles sont les lignes
automcoques utilises pour dfinir lunit de la projection.

116

Chapitre 4

Par exemple, les ordonnes dune projection UTM, exprimes en mtres, vont de 0
10 000 000 dans chaque hmisphre. On peut se demander par quel miracle la distance
curviligne entre lquateur et le ple dun ellipsode de rvolution approchant la Terre mesure
exactement dix millions de mtres (en approchant lellipsode par un cercle, on a d=*R, ou
R est le rayon du cercle, =90=/2 radian. 6 400 000*3.14159/2=10 000 000 !). La rponse
est toute simple : cest ainsi qua t dfini le mtre au XVIIIe sicle. Alors que les units
utilises variaient entre la lieue, la verge, et un grand nombre de valeurs du pied, le
dveloppement de la cartographie et des mesures de larc ont incit les scientifiques de
lpoque dfinir une unit unique facile utiliser pour les calculs de projections et de
distances. On a donc dfini le mtre comme la 10 000 000-ime partie de larc allant de
lquateur au ple sur lellipsode de Picard (loi du 19 Frimaire an VIII - 10 dcembre 1799),
tout en dfinissant le grade comme la 100-ime partie de langle au centre correspondant
(90). LUTM ayant un mridien comme ligne automcoque (le mridien central), les
coordonnes dans la projection vont galement de 0 10 000 000, exprimes dans cette
nouvelle unit, le mtre.

Notons encore que les rosaces indiquant le nord gographique indiquent en fait
la direction du nord sur le mridien central de la projection : les projections des
mridiens ne sont parallles que dans certaines projections.
4.3.4. chelles et cartes
Nous navons pas encore parl dchelle, car cette notion nintervient pas dans la
propre action de projeter sur un plan. Dans le plan de projection, les distances sont
sensiblement les mmes que sur lellipsode, comme nous lavons vu plus haut.
Impossible bien sr de reprsenter ce plan de projection sur une feuille de papier, il
faut rduire la taille des lments. On va donc effectuer une homothtie de rapport
infrieur 1 par rapport lorigine du plan de projection. Dun domaine trs grand,
on arrivera donc une surface plus petite, permettant dattendre la taille dune
feuille de papier : la carte. Lchelle indique le rapport utilis pour lhomothtie.
Lorsquun point est projet puis mis lchelle par homothtie, les coordonnes
indiques sur la carte sur laquelle on la dessin sont soit des coordonnes aprs
projection mais avant homothtie (les coordonnes du point dans le plan de
projection), soit des coordonnes gographiques (on indique donc la longitude et la
latitude du point sur lellipsode, avant sa projection puis sa mise lchelle ; on a
dailleurs lhabitude de reprsenter sur une carte des points correspondant des
valeurs entires des coordonnes sphriques : ce sont les amorces de la projection).
Bien sr, ces coordonnes ne correspondent pas lunit de la carte aprs mise
lchelle, mais les coordonnes ne sont jamais exprimes dans cette unit.
Lchelle de restitution cartographique est donc une pure transformation
mathmatique, elle nest pas directement lie la prcision. Ainsi, quelle que soit
lchelle, la dformation lie la projection est la mme (puisque la projection ne

Mesurer la localisation 117


dpend pas de lchelle). Si lon mesure cette dformation sur une carte, sa valeur
absolue sera bien sr divise par lchelle de la carte, comme tous les lments
reprsents. La valeur relative entre un objet et la dformation lie la projection
reste donc la mme quelque soit lchelle utilise. Par exemple, on dit souvent qu
partir dune certaine chelle (pour le cadastre par exemple), la projection
gographique peut tre nglige car la dformation due la projection devient trs
faible, et lespace tudi assimilable un plan. En fait, cest la faiblesse de la
dformation par rapport la taille ou la prcision de mesure des objets reprsents
qui importe. Et puis il ne faut pas oublier non plus tout ce que lon a dit auparavant
sur le passage de la Terre lellipsode : les grandeurs relatives des erreurs doivent
tre compares pour pouvoir ngliger lune ou lautre.
Si lon a pas besoin de rduire la taille du document (virtuel bien sr), on peut
conserver des coordonnes projetes sans facteur de rduction - ou plutt avec un
facteur 1. Cest ce que lon fait dans tous les systmes numriques, o la description
de la localisation est conserve soit en coordonnes sphriques sur un ellipsode,
soit en coordonnes projetes, et o la mise lchelle ne se fait que lorsque lon en
a besoin (pour visualiser des rsultats).
4.3.5. chelle, projection, prcision
Au cours de ce qui prcde, nous avons parl plusieurs reprises de prcision, et
il est intressant de revenir sur ce sujet car il est dune importance capitale dans la
conception et dans lutilisation des bases de donnes localises.
La prcision nest jamais indique sur une carte. Elle est, dans lesprit de tous,
implicitement donne par lchelle : on entend souvent dire quune carte au
1:1000000 est moins prcise quune carte au 1:1000. Qutant donn que le micron
nest pas visible lil nu, il ne sert rien de chercher reprsenter une prcision
dun mtre terrain lchelle 1:1000000. Que si cest pour les reprsenter une
petite chelle, il est inutile de chercher une trop grande prcision. Et
quimplicitement, cest en fonction des possibilits de reprsentation de la carte que
lon va fixer la prcision des objets... Mais ce serait bien sr prendre le problme
fondamental de la prcision lenvers.
Comme dans toute science physique, la dfinition dun objet ne peut tre spar
de la prcision de la mesure des attributs servant le dcrire. Les objets traits en
gographie et en cartographie nexistent pas a priori, comme nous lavons soulign
dans le chapitre prcdent : entre autre, la prcision apporte la description de la
localisation est fondamentale dans la dfinition smantique de lobjet et donc dans
lutilisation gographique ou cartographique qui peut en tre faite. La confusion
vient de ce quimplicitement on sarrangeait, avant lavnement du numrique, pour

118

Chapitre 4

que toutes les cartes aient grosso modo le mme degr de prcision mesur sur la
carte. La valeur absolue de cette prcision dpendait donc de lchelle de la carte.
Comme toutes les cartes en papier ont peu prs les mmes dimensions, quelque
soit lchelle qui, elle, varie considrablement, les objets que lon y reprsente sont
finalement peu prs de la mme taille - sur la carte - et le rapport taille de
lobjet/prcision de la localisation reste peu prs le mme. Mais - et cest
fondamental quand il faut dfinir lobjet gographique - la prcision gographique
absolue de la localisation est la seule notion vraiment importante, la seule
intimement lie la dfinition des attributs de lobjet, et la seule qui puisse tre
indique dans un systme informatique o la localisation est conserve
indpendamment de la notion dchelle cartographique.
La projection apporte une erreur systmatique et connue (ou plutt une
dformation contrle), et la prcision du calcul de la dformation peut tre trs
grande et adapte aux besoins. La rduction ou mise lchelle napporte aucune
erreur. Ces oprations ne jouent donc aucun rle dans la prcision de donnes
gographiques.
La seule prcision vient donc de la mesure, et cette prcision doit tre dfinie
lorsque lobjet gographique et son champ dapplication sont eux-mmes dfinis.
Les instruments de mesure doivent tre compatibles avec cette prcision (par
exemple, le capteur dun satellite, lobjectif dun appareil de photographie arienne,
les mesures des gomtres, les GPS, la restitution photogrammtrique, etc.).
Lorsque les objets sont thmatiques (pdologie, vgtation, ...), la prcision de leur
localisation dpend de deux critres : un fond de carte, dont on peut estimer la
prcision avec les critres prcdents, et la dfinition mme des objets, qui dpend
en gnral de lchelle laquelle travaille celui qui labore linformation, et que
nous appelons plutt dfinition smantique ou chelle de description. Plus quune
notion dchelle, cette notion correspond bien un niveau de prcision et une
vision de la ralit propre cette prcision. Elle est directement lie la vision de la
ralit et sa modlisation.
La gnralisation est un processus cartographique qui permet de modifier la prcision de
la localisation, par simplification, aprs avoir modifi la schmatisation conceptuelle des
objets lorsque lon effectue un changement dchelle de description. Cette opration,
prsente souvent comme purement cartographique, permet dadapter le dessin dune carte
son chelle, pour ne pas avoir une prcision excessive qui napporte plus dinformation
lchelle laquelle on reprsente les objets. En fait, elle montre bien lexigence dune bonne
cohrence entre prcision de la localisation et validit des descripteurs des objets que lon
veut reprsenter. La gnralisation des contours est une opration difficile automatiser,
puisquelle fait partie dun processus de redfinition conceptuelle des objets. Il ne faut pas la
confondre avec les oprations de filtrage, qui sont seulement destines rduire le nombre de

Mesurer la localisation 119


points ncessaires la description darcs, sans en modifier la forme ou lapparence. Nous
verrons au chapitre 9 la description de lalgorithme de gnralisation de Douglas-Peucker.

Les SIG remettent en cause les mthodes de travail classiques pour llaboration
de linformation localise : le critre fondamental pour la prcision des objets nest
plus lchelle dune carte, considre comme document final, et o lon mlange
prcision de la mesure, prcision smantique, et prcision du dessin. Cest
uniquement la dfinition smantique des objets qui donne la prcision laquelle on
doit envisager de dcrire la localisation de ces objets, puisque les SIG permettent de
conserver les objets sans la notion dchelle de restitution. Et on retrouve bien sr
ici tous les problmes lis la modlisation de lespace en zones homognes : rien
ne sert de dcrire avec trop de prcision des zones alors que la validit de
linformation ny est pas assure cette prcision. Il serait beaucoup plus efficace
de dfinir un modle permettant de prendre en compte et de quantifier cette
imprcision. Pour le moment, les mthodes classiques de reprsentation de lespace
en zone, ligne, point, mthodes hrites de lre pr-numrique et des exigences de
la cartographie ddition, nont pas vraiment t remises en cause par les SIG. Il ne
faut jamais perdre de vue ces limitations lorsque lon utilise un SIG, et bon nombre
de traitements possibles sont souvent inutilisables pour des problmes de prcision
et de modle de reprsentation de la ralit.
4.4. Exemples de projections
Nous allons prsenter trois exemples de projections gographiques qui sont
parmi les plus utilises : la projection Mercator, la projection UTM, la projection
conique Lambert. Toutes trois sont conformes (elles conservent les angles), cette
proprit tant de loin la plus intressante pour la navigation ou la balistique. Nous
avons dfini une classe CProjection qui contient comme membres tous les
paramtres ncessaires au calcul, quelque soit la projection utilise (A.2.3.2.).
4.4.1. La projection Mercator
La projection Mercator est une projection cylindrique directe, contrairement aux
projections TM et UTM qui sont transverses. Cette projection est trs utilise en
navigation, car, outre la conformit, elle a lavantage de transformer les routes cap
constant en des droites sur la carte. Elle a longtemps t utilise pour les
planisphres, malgr les considrables dformations quelle introduit ds que lon
sapproche des latitudes leves. De plus, les projections conformes ne sont pas
quivalentes : elles ne conservent pas les surfaces. La projection Mercator augmente
les surfaces ds que lon sloigne de lquateur : le poids visuel de lEurope, de

120

Chapitre 4

lAsie du nord, de lAmrique du nord, de lOcanie augmente au dtriment de


lAfrique, de lAsie centrale, de lAsie du sud et de lAmrique du sud.
4.4.2. La projection UTM (Universal Transverse Mercator)
La projection UTM est une projection cylindrique transverse : le cylindre de
projection est tangent lellipsode suivant une ellipse passant par les ples. La
position de cette ellipse correspond au mridien central de la projection. La
dformation devient importante si lon sloigne trop de ce mridien : la projection
UTM nest utilise que pour reprsenter des rgions proches du mridien central (au
maximum trois quatre degrs de part et dautre). Des mridiens centraux ont donc
t dfinis une fois pour toute pour couvrir lensemble du globe, dcoup en zones :
le premier est 3 et les suivants se suivent 6. Lindication de la zone UTM sur
une carte permet de retrouver le mridien central correspondant :
zone 1 est : de 0 6 est, mridien central 3 est;
zone 2 est : de 6 12 est, mridien central 9 est;
zone 3 est : de 12 18 est, mridien central 15 est;
...
zone 30 est : de 174 180 est, mridien central 177 est;
zone 1 ouest : de 174 180 ouest, mridien central 177 ouest;
zone 2 ouest : de 168 174 ouest, mridien central 171 ouest;
...
zone 30 ouest : de 6 ouest 0 ouest, mridien central 3 ouest;

La projection est dite universelle car elle utilise un mme point de tangence par
continent. Lorsque cette condition nest pas respecte, la projection devient TM
(transverse Mercator). La seule ligne automcoque est une droite qui correspond
la projection du mridien central. Cette ligne permet de dfinir lunit de la
projection. Comme le mtre a t dfini comme la 10 000000-ime partie de la
projection du mridien central (de lquateur au ple), lunit naturelle de la
projection UTM est le mtre. On applique nanmoins un facteur dchelle pour
rattraper les modifications dues lellipsode utilis (le mtre a t dfini avec
lellipsode de Picard) et laltitude : un mtre mesur au sol sur le mridien central
correspond alors exactement un mtre aprs calcul de projection. Ce facteur
dchelle est toujours trs proche de 1.
Comme pour beaucoup de projections, le calcul inverse ncessite le calcul dun
arc de mridien sur lellipsode. Ce calcul est effectu par approximations
successives (CProjection::SetEllipse()), ce qui influence la prcision de la
transformation. Cette prcision est de lordre du centimtre.

Mesurer la localisation 121


Les coordonnes UTM ont le dfaut de ne pas diffrencier lhmisphre : il y a
donc une rupture au niveau de lquateur, o lon passe de 9 999 999 0. Pour
viter cette rupture, nous avons choisi dajouter 10 000 000 dans lhmisphre nord.
Les mthodes UTMToGeo() et GeoToUtm() donne limplantation du calcul de la
projection UTM dans la classe CProjection.
4.4.3. La projection conique de Lambert
La projection Lambert est une conique conforme qui permet de reprsenter des
surfaces plus importantes que la projection UTM et convient particulirement aux
latitudes moyennes. Elle a t particulirement utilise pour la France, lAfrique du
Nord, lAmrique du Nord. La projection Lambert admet de nombreux paramtres :
le cne peut tre tangent ou scant; le choix du mridien central permet de fixer la
ligne automcoque et lorigine de la projection. Certaines Lambert portent un nom,
et tous les paramtres sont alors fixs. Par exemple :
Lambert I Nord (tangente) :
Mridien central : 220 14.025",EST;
Parallle tangent : 49 30 0.",NORD;
Ellipsoide(6378249.2,0.00680348765);
Facteur dchelle : 0.99987734;
Coordonnes au point dorigine : 600000.,200000.;

Lambert II Centre (tangente) :


Mridien central : 2 20 14.025",EST;
Parallle tangent : 46 48 0.",NORD;
Ellipsoide(6378249.2,0.00680348765);
Facteur dchelle : 0.99987742;
Coordonnes au point dorigine : 600000.,200000.;

Lambert III Sud (tangente) :


Mridien central : 2 20 14.025",EST;
Parallle tangent : 44 6 0.",NORD;
Ellipsoide(6378249.2,0.00680348765);
Facteur dchelle : 0.99987750;
Coordonnes au point dorigine : 600000.,200000.;

Lambert IV Corse (tangente) :


Mridien central : 2 20 14.025",EST;
Parallle tangent : 42 9 54.",NORD;
Ellipsoide(6378249.2,0.00680348765);
Facteur dchelle : 0.99987771;
Coordonnes au point dorigine : 234.358,185361.369;

Eurolambert (tangente) :
Mridien central : 2 20 14.025",EST;
Parallle tangent : 46 48 0.",NORD;
Ellipsoide(6378388.2000,0.00672267002);
Facteur dchelle : 0.99987750;
Coordonnes au point dorigine : 600000.,2200000.;

Lambert Etendu (tangente) :


Mridien central : 2 20 14.025",EST;
Parallle tangent : 46 48 0.",NORD;
Ellipsoide(6378249.0000,0.00680348765);
Facteur dchelle : 0.99987742;
Coordonnes au point dorigine : 600000.,2200000.;

Lambert Mexique (scante) :


Mridien central : 102 0 0.,OUEST;
Parallle du point dorigine : 24 0 0.",NORD;
Parallle 1 : 17 30 0.",NORD;
Parallle 2 : 29 30 0.",NORD;
Ellipsoide(6378206.4000,0.006768657997);
Coordonnes au point dorigine : 2000000.,2000000.;

122

Chapitre 4

Linitialisation des paramtres est diffrente selon les types de projection


Lambert (tangente ou scante). Le calcul de projection est ensuite identique. Les
diverses mthodes de la classe CProjection correspondant la projection Lambert
peuvent tre consultes dans lannexe (A.2.3.2.).
4.5. SAVANE, datum et projections
Le systme SAVANE conserve lensemble des coordonnes gographiques sous
la forme longitude-colatitude dans un datum donn. Le datum doit tre identique
pour lensemble des objets dune mme base de donnes. Nous avons donc deux
besoins fondamentaux pour intgrer des objets dans une base de donnes SAVANE
: pouvoir passer de coordonnes donnes suivant une projection aux coordonnes
gographiques du mme point, par projection inverse, et pouvoir changer de datum.
Lensemble de ces procdures est disponible dans la classe CProjection. Cette
classe est galement utilise dans lutilitaire GLOBE qui permet de faire des calculs
de changement de projection :

fig. 4.4 : le programme Globe

4.5.1. Provenance des donnes en entre


Il ny a en fait que peu de sources de donnes pour la localisation : relevs de
terrain, images ariennes ou spatiales, cartes topographiques ou toponymiques en
forment limmense majorit. Les images ariennes ou spatiales sont redresses et
mises en conformit gographique, suivant une projection, grce notamment des

Mesurer la localisation 123


mesures de localisation et daltitude. Les cartes sont ralises partir dimages
ariennes et de mesures de terrain. Les mesures de terrain, longtemps effectues par
triangulation, sont maintenant le plus souvent effectues par GPS.
Les donnes de localisation servant constituer une base de donnes localises
proviennent de ces documents. Le systme doit donc tre en mesure de fournir les
outils permettant la saisie graphique de ces documents. La source principale de
donnes est donc constitue de cartes, ralises avec une certaine prcision, selon
une projection gographique et sur un datum de rfrence. Le systme SAVANE
permet la saisie sur cran partir de ces cartes scannes et gorfrences grce au
module SAVEDIT. Il permet galement limportation directe de donnes de
positionnement provenant de relevs de terrain.
4.5.2. Fonctionnement de SAVEDIT pour les projections inverses et le datum
La saisie graphique sur cran avec SAVEDIT seffectue en utilisant la fentre du
programme comme espace de digitalisation. Cette espace correspond une fentre
ouverte sur un espace gographique. Il est important de bien matriser les paramtres
de cet espace gographique. En voici les principes.
La surface de lcran de saisie de SAVEDIT correspond un espace muni dun
repre orthonorm : on peut donc passer des coordonnes cran aux coordonnes
dune projection gographique, par une simple translation-homothtie dpendant
seulement de lespace visualis sur lcran. On peut ensuite retrouver les
coordonnes sphriques (longitude, latitude), dans un datum donn, par projection
inverse. Pour faire cette transformation, SAVEDIT doit seulement connatre la
projection gographique et lespace de travail correspondant la fentre de
visualisation : lutilisateur du programme doit prciser ces paramtres lorsquil
rentre dans le systme, de manire initialiser lespace de travail. Lorsque la saisie
se fait partir dune carte scanne ou dune image gorfrence par SAVAMER, le
chargement de la projection correspondant au gorfrencement de la carte ou de
limage est tout fait naturel. Lors de limportation dun fichier externe, les
coordonnes du document sadaptent automatiquement la projection de
visualisation. Lutilisateur doit seulement prciser la projection initiale du
document, de manire convertir les coordonnes de projection en coordonnes
sphriques. Lespace de travail est choisi tout aussi naturellement. Au dpart,
lutilisateur le choisit en fonction du support de la digitalisation (espace dune carte
ou dune image go-rfrence, espace complet dun document, visualisation
dlments de la base de donnes), ensuite, il peut le modifier en fonction des
besoins de visualisation ou de saisie.

124

Chapitre 4

Tout document digitalis est conserv en coordonnes gographiques, dans un


datum donn. Lors du processus de digitalisation, SAVEDIT convertit chaque point
saisi sur lcran en coordonnes sphriques, en fonction de la fentre de
visualisation et de la projection gographique inverse. Sil est ouvert avec une autre
projection, il sera trac dans la fentre de visualisation selon cette autre projection,
sans aucun problme.
Le fonctionnement de SAVEDIT est donc diffrent de la plupart des logiciels de
saisie graphique. Dans SAVEDIT, lespace de travail, celui qui est visualis sur
lcran, correspond toujours un espace gographique trac selon une projection
gographique connue (par dfaut, le systme utilise la projection dite gographique,
avec un mridien central centr sur la base de donne ouverte). Chaque point de
lcran peut tre repr par ses coordonnes dans les divers systmes (projection,
ellipsode, cran) grce la fentre de navigation. Lors de la saisie, la prcision sera
dautant plus grande que la fentre de visualisation sera troite, puisqu la taille du
pixel correspondra alors un espace plus petit dans la ralit.
Lorsque lon cre un document avec SAVEDIT, on peut indiquer son datum.
Cette indication nest pas toujours indispensable, et elle ne change en rien les
coordonnes des points saisir. Par contre, on peut changer le datum dun document
par la suite, et si les coordonnes des points saisis doivent tre modifis pour
prendre en compte le dplacement de lellipsode de rfrence, chaque coordonne
est modifie pour reflter ce changement (le programme utilise la formule de
Molodensky). Ce problme est courant lorsque des donnes saisies avec un GPS
dans un datum doivent tre intgres avec des donnes conserves selon un autre
datum. Il est ncessaire, aprs avoir import les points dans SAVEDIT, de spcifier
le datum initial des points GPS puis de modifier ce datum en modifiant les
coordonnes des points. Nombreux sont ceux qui ont eu le dsagrment, en
reportant sur une carte leurs points saisis avec prcision sur le rivage, de les
retrouver loin dans la mer ou dans un lac Question de datum !
La classe CProjection est utilise pour les calculs de transformation de
projection dans SAVEDIT (A.2.3.2.).
La classe CWind de SAVEDIT contient la description de la fentre de travail, et
quelques fonctions permettant de modifier cette fentre. Par exemple, la fonction
NouvelleFenetreProj() permet de modifier la fentre de travail correspondant
lcran en donnant les coordonnes de projection de cette fentre. Quelques
fonctions globales permettent deffectuer les transformations cran-espace de
projection-datum.

Mesurer la localisation 125


La classe CMolodensky, que nous avons dcrite au dbut de ce chapitre, permet
deffectuer les transformations de datum en utilisant la formule de Molodensky
(A.2.3.3.).
4.5.3. Fonctionnement de SAVANE pour les projections dans un cadre
Une requte dans SAVANE correspond un espace de travail dans une carte.
Pour la visualisation des rsultats de cette requte, SAVANE utilise un cadre et une
opration de cartographie. Chaque cadre a donc des paramtres de projection
gographique, de coordonnes correspondant lespace visualiser, dchelle de
restitution.
Toutes les donnes graphiques sont conserves en coordonnes gographiques
dans SAVANE, selon un datum identique pour tous les objets dune mme base de
donnes. La visualisation dun cadre utilise donc :
la position du cadre dans la carte
lchelle du cadre
la fentre gographique du cadre (le cadre est comme une fentre ouverte sur la
base de donnes gographique)
la projection gographique choisie
lorsque la visualisation se fait sur un cran, il faut galement prendre en compte
la position de la carte dans lcran.
Lorsque lon dmarre une requte dans SAVANE, tous les paramtres du cadre
par dfaut sont dfinis par dfaut. Il faut agir sur les boutons CADRE, MAP et
WIND pour modifier ces paramtres. La classe CCadre (A.2.4.4.) contient un
certain nombre de variables membres correspondant ces paramtres. Les classes
CProjection (A.2.3.2.) et CWind (A.2.3.1.) sont identiques aux classes du mme
nom dans SAVEDIT.
4.6. Conclusion
Mesurer la localisation savre tre une opration complexe si lon veut en
matriser la prcision et lincertitude. Tous les paramtres de la mesure interviennent
lors de la ralisation dun SIG. Dans le systme SAVANE, nous avons choisi de
conserver les coordonnes des points dcrivant la localisation des objets
gographiques en coordonnes sphriques (longitude, colatitude) dans un mme
datum. Il est donc important de pouvoir passer dun datum un autre, et de pouvoir
passer de coordonnes projetes des coordonnes sphriques. La projection
gographique est utilise lors de la constitution de la base de donnes, lors de la

126

Chapitre 4

saisie graphique, et lors de lexploitation des donnes et de la cartographie des


rsultats, de faon interactive.
Des objets gographiques ne peut tre intgrs une base de donnes que sils
sont gorfrencs avec la prcision correspondant leur dfinition smantique. Si
tel nest pas le cas, la dfinition elle-mme des objets doit tre remise en cause.
Dans le cas contraire, certains traitements ou mise en relation dobjets pourraient
amener des rsultats non valides, notamment en analyse spatiale.

Mesurer la localisation 127

128

Chapitre 4

Bibliographie

[BAL 98] BALMINO G., Champ de pesanteur terrestre et gode. Principes, progrs et
connaissance actuelle, 1998, Bureau Gravimtrique International, Toulouse, France
[BEG 94] BEGUIN M., PUMAIN D., La reprsentation des donnes gographiques, 1994,
CURSUS-Armand Colin, Paris
[BOT 98] BOTTON S ., DUQUENNE F., EGELS Y., EVEN M., WILLIS P., GPS, localisation et
navigation, 1998, Herms, Paris
[CAZ 94] CAZENAVE A., FEIGL K., Formes et mouvements de la Terre, 1994, Ed.Belin-CNRS
[DUF 98] DUFOUR J.P., Cours dintroduction la godsie, Ecole nationale des sciences
gographiques,1998, IGN-ENSG
[GEO 71] Gophysique, Encyclopdie de la Pliade, sous la direction de Jean Goguel,
Gallimard, 1971, Paris
[LEV 88] LEVALLOIS J.J., BOUCHER C., BOURGOIN J., COMOLET-TIRMAN A., ROBERTOU A.,
Mesurer la Terre : 300 ans de godsie franaise, De la toise du Chtelet au satellite, 1988,
Association franaise de topographie, Presse de lEcole Nationale des Ponts et Chausses,
AFT, Paris
[MAG 97] MAGELLAN SYSTEMS CORPORATION, User guide for the Magellan GPS ProMARK
X-CM, 1997

Chapitre 5

De l'objet la collection d'objet : les SGBD

5.1. Introduction
Jusqu' prsent, nous avons tudi la manire de schmatiser et reprsenter la
ralit par des objets, sans tenir compte du problme de la collection. Dans
beaucoup de situations, et notamment en gographie, la ralit tudier ne peut se
schmatiser par quelques objets distincts, ou alors ces objets seraient tellement
complexes qu'ils en deviendraient difficilement utilisables pour un objectif autre
qu'une pure description. En particulier, on ne pourrait pas les comparer entre eux et
utiliser tout l'arsenal de la statistique pour les tudier, les analyser, et en extraire des
caractristiques. On cherche donc plutt dfinir des objets assez simples, et
reprsenter la ralit par des collections de ces objets. L'ensemble des collections
schmatisant une ralit tudier est appel une base de donnes.
La gestion efficace de ces collections d'objets est ncessaire, car les objets
peuvent tre trs nombreux, mme si leur description individuelle est assez simple.
Pour grer efficacement ces collections d'objets indpendamment des programmes
qui vont les utiliser, il faut des systmes de gestion de bases de donnes. Plusieurs
modles de description ont t dfinis pour passer d'une schmatisation en objets
une schmatisation en collections d'objets, non plus seulement en fonction de
critres de description, mais galement en fonction de critres de gestion et de la
difficult grer ces collections d'objets. Nous reviendrons donc galement sur les
problmes de schmatisation et de reprsentation de la ralit.
La mise en base de donnes n'est pas toujours ncessaire, notamment lorsque
l'objectif est la description de quelques objets distincts : ainsi, la description de
paysages rentre difficilement dans le cadre contraignant d'une schmatisation de la

130

Chapitre 5

ralit, car l'objectif est alors la description dtaille d'un seul ou de quelques objets,
chaque objet ayant des attributs qui lui sont propres. La difficult vient bien de
l'objectif recherch, et non pas de la technologie des bases de donnes.
5.2. Notions classiques sur les SGBD
Le problme de la gestion des donnes se pose lorsque les applications ont
besoin de grands volumes d'information, c'est--dire de grandes collections d'objets
dcrits de faon complexe par de nombreux attributs. La cration, la disponibilit,
l'utilisation de ces grandes collections est trs coteuse pour une seule application.
On a donc cherch mettre en commun ces objets, en les dfinissant de faon
intrinsque et en les mettant dans des bases de donnes entirement gres par des
programmes spcialiss, qui ne font que a : les systmes de gestion de bases de
donnes (SGBD) [GAR 83] [ULL 88]. Un SGBD, c'est une interface entre l'usager
(un utilisateur, un programme) et les mmoires de stockage, lui donnant l'illusion
d'avoir sa disposition des donnes stockes et assembles comme il le souhaite,
d'tre le seul les utiliser, et de pouvoir les manipuler sa guise grce un langage
spcial. C'est un outil de gestion efficace permettant de rechercher, modifier, ajouter
des donnes dans une grande masse d'information, partage par tous les usagers
suivant leurs droits d'accs, chacun travaillant sur sa vision et sa propre structuration
de l'information.
5.2.1. Les problmes soulevs par l'utilisation de fichiers traditionnels :
dpendance, redondance, intgrit, scurit
A l'origine de l'informatique, les donnes utilises par une application taient
toujours lies cette application, et utilises sous forme de fichiers traditionnels.
Ces fichiers reprsentaient des collections d'objets dcrites par des attributs, mais
ces objets et leur description taient en gnral dfinis uniquement pour
l'application. Lorsqu'un programme utilise des donnes sous forme de fichier
traditionnel, donnes et programme sont dpendants : le fichier est conu pour le
programme ou le programme pour le fichier, et les structures logiques (description
pour les objets, excution pour le programme) sont dpendantes l'une de l'autre.
Nous n'avions donc pas de problmes de description et de reprsentation du monde
rel, et la dfinition, description et reprsentation des objets dcoulaient
naturellement de l'analyse du problme tudi et de sa rsolution algorithmique et
informatique. Cette organisation, optimale dans certains cas, est dsastreuse dans
d'autres, notamment quand les mmes donnes sont utilises par plusieurs
applications diffrentes, car on est alors rapidement confront des problmes de
redondance et de cohrence entre fichiers : si plusieurs programmes utilisent les
mmes donnes dans des fichiers diffrents, rien ne garantit en effet que ces

De lobjet la collection dobjets 131


donnes soient quivalentes et que les mmes contrles soient effectus. On est
confront de nombreux problmes lorsque plusieurs programmes veulent utiliser
le mme fichier : problmes de redondance ou de stockage, problmes d'accs pour
unifier les modifications et mises jour. La cration de fichiers rservs une seule
application est trs coteuse : en volume, en cot de dveloppement informatique,
en disponibilit des donnes, en problmes de cohrence et de scurit, en fiabilit,
en accs aux donnes par des non-informaticiens.
L'ide toute simple et qui est l'origine des SGBD, c'est de sparer donnes et
applications en crant des ensembles cohrents de donnes indpendants des
applications et en utilisant des programmes spcialiss pour les grer et les
manipuler, et d'offrir aux programmes d'applications ces donnes dj structures et
ces utilitaires pour y accder le plus facilement possible. Les donnes classiques
deviennent donc peu peu des collections d'objets (c'est--dire des donnes qui ont
une dfinition smantique propre, indpendante de l'utilisation qui en est faite)
dfinies de manire intrinsque par schmatisation du monde rel suivant un modle
de description et des rgles bien prcises. Dfinis de manire statique dans la plupart
des cas, les objets peuvent devenir plus dynamiques par l'introduction dans leur
dfinition d'autres objets ou de procdures et de fonctions que l'on peut leur
appliquer et qui permettent de modifier leur description. Le travail d'un programme
d'application utilisant de tels objets est fortement modifi : on passe de la dfinition
des donnes et des procdures (programmation classique) l'utilisation d'objets et
au choix des procdures offertes par le schma de donnes sur ces objets
(programmation objet).
5.2.2. L'objectif des SGBD
Tous les SGBD ne prsentent pas les mmes possibilits, et les modles ont
volus depuis leur apparition il y a quelques dizaines d'annes. Mais l'objectif
gnral de tous les SGBD peut se rsumer en plusieurs points [GAR 83] :
- garantir l'indpendance physique et logique entre les donnes et les
programmes d'application,
- assurer la persistance des donnes,
- permettre une administration centralise des donnes,
- grer la mmoire de faon optimale et assurer l'efficacit de l'accs aux
donnes,
- grer le partage des donnes entre utilisateurs et les accs concurrents,
- assurer la fiabilit, l'intgrit et la cohrence des donnes, viter les
redondances,
- assurer la scurit des donnes,

132
-

Chapitre 5
assurer les interrogations interactives, la consultation dclarative, et l'accs
de non-informaticiens.

L'indpendance entre les donnes et les programmes d'application : les donnes


et les programmes tant spars, ce ne sont plus les applications qui sont charges
de structurer, d'organiser et de vrifier les donnes et de les stocker dans des
fichiers. Les donnes sont dfinies et structures par le SGBD qui offre cette
structure aux applications. L'indpendance est la fois logique (au niveau de la
dfinition des donnes) et physique (au niveau du stockage et de la gestion de la
mmoire).
Le SGBD assure la persistance des donnes : alors que les rsultats d'une
application sont lis l'excution de l'application, l'existence des donnes d'une base
est assure indpendamment de leur utilisation. Les donnes d'une base ont donc
une dure de vie suprieure la dure de vie du programme qui les cre ou qui les
utilise.
L'administration centralise des donnes : une des fonctions essentielles des
SGBD est la dfinition des structures de donnes, la dfinition et l'organisation des
structures de stockage, les modifications de ces structures, les contrles de validit
et de cohrence. Il est essentiel de centraliser ces fonctions : c'est l'administrateur du
systme qui gre l'ensemble des donnes, indpendamment de leur utilisation et des
applications. Les usagers ou les applications sont dchargs de toute tche
d'administration, et peuvent utiliser les donnes de la base sans se proccuper de
l'administration de ces donnes tout en tant assurs de leur validit et leur
cohrence. Un SGBD permet d'optimiser l'administration des donnes en
centralisant ces tches dans l'entreprise.
Grer la mmoire de faon optimale : chaque SGBD optimise le stockage et
l'accs aux donnes, en utilisant des techniques complexes inaccessibles aux
programmes d'application eux-mmes. En vitant les redondances, il optimise
galement le volume des donnes stockes. Avec un SGBD, on est donc sr d'avoir
accs de volumineux ensembles de donnes de manire efficace.
Grer le partage des donnes entre usagers : c'est le SGBD qui va se charger de
grer les accs concurrents, les mises jour, le tout en fonction des droits de chacun.
Chaque usager aura l'illusion d'tre seul utiliser les donnes de la base, qu'il verra
assembles et structures comme il le souhaite.
Assurer la fiabilit, l'intgrit, la cohrence : la description du schma des
donnes contient un certain nombre de rgles qui permettent de vrifier la fiabilit,
l'intgrit, la cohrence de tous les objets prsents dans la base (par exemple, lge
d'une personne doit tre compris entre 0 et 120; lge d'un enfant ne peut tre

De lobjet la collection dobjets 133


suprieur celui de ses parents, etc.). Le SGBD contient des procdures spciales
permettant d'effectuer l'ensemble de ces tests. Par exemple, les contraintes d'intgrit
sont des rgles qui prcisent la cohrence smantique des donnes entre elles.
Scurit des donnes : tous les utilisateurs d'une mme base n'ont pas
ncessairement les mmes droits d'accs aux donnes. Il est utile de pouvoir dfinir
de tels droits pour assurer la scurit de certaines donnes confidentielles et
rserves certains groupes d'utilisateurs.
Assurer les interrogations interactives et l'accs aux non-informaticiens : les
donnes de la base sont bien gres et bien organises. Il ne reste plus qu' les
consulter, objectif initial de toute la dmarche, sans avoir se proccuper du
stockage ou de l'organisation interne. Le SGBD offre un certain nombre de
fonctions pour accder aux donnes de faon dclarative, aussi bien pour les
programmes d'applications que pour l'usager, sans avoir effectuer le moindre
dveloppement informatique particulier.
L'architecture client-serveur est la plus efficace pour rpondre aux objectifs
d'indpendance physique et logique, de partage entre usagers, d'interrogation
interactive, dans le cadre des rseaux et de l'informatique dcentralise. Le serveur
gre toutes les transactions avec les clients et rpond leurs requtes, et est ddi
ces tches. Cette architecture permet de nombreux clients d'accder partir de
petites machines de grandes bases de donnes, de manire trs efficace.
5.2.3. La modlisation de la ralit dans les SGBD
Puisqu'il y a indpendance entre donnes et application, le SGBD doit galement
proposer un modle pour crer et dcrire des objets partir de la vision de la ralit
en collections d'objets, indpendamment de leur utilisation par les programmes ou
les applications. Ce formalisme permet de dfinir la structure des donnes et offre
un ensemble d'oprateurs destins manipuler ces donnes. De nombreux modles
ont t dfinis : hirarchique, rseau, relationnel, objet.
5.2.3.1. Les diffrents modles de donnes
Sparer donnes et applications nous oblige passer du concept de donnes
celui d'objet, entit schmatisant la ralit et ayant une dfinition smantique
intrinsque. Comme nous l'avons dj vu, il n'y a pas de vision universelle de la
ralit lorsqu'il s'agit de dfinir des objets par leur contenu smantique. C'est chaque
domaine d'application qui dtermine la modlisation du rel en objets de faon
contextuelle, mais malgr tout d'une manire beaucoup plus globale que lorsqu'il
s'agit d'utiliser des donnes pour une seule application. Le SGBD offre un
formalisme de description et des utilitaires permettant d'aboutir un ensemble

134

Chapitre 5

cohrent d'objets bien structurs, et propose un ensemble d'oprateurs destins


manipuler ces objets. Chaque application du domaine concern par cette vision du
rel devra choisir ses donnes parmi les objets que lui propose le SGBD. C'est la
diffrence de ces formalismes, ou modles de donnes, qui fait la diffrence entre
les SGBD.
Il ne s'agit pas de dcrire des objets en particulier, mais les proprits
d'ensembles d'objets, puisque ce sont les collections d'objets qui nous intressent et
non plus les objets isols. On appelle type d'objet un ensemble d'objets possdant
des caractristiques similaires et manipulables par des oprations identiques. Un
objet sera donc vu ici comme un lment d'un ensemble d'objets.
Un modle de description, c'est un ensemble de concepts et de rgles de
composition de ces concepts permettant de dcrire des ensembles d'objets. Toute
description s'effectue au niveau du type, l'aide d'un ensemble d'lments
descriptifs permettant d'exprimer les proprits d'ensembles d'objets et composant
un modle de description de donnes. Un modle de description de donnes est mis
en uvre l'aide d'un langage de description de donnes.
Si le modle de donnes est simple, il sera facile utiliser mais risque de trop
simplifier la description du rel, ou de ne pas permettre cette description dans
certains domaines, lorsque les structures adquates et les oprateurs associs n'ont
pas t prvus. S'il est complexe, les objectifs des SGBD seront difficiles assurer,
notamment en ce qui concerne la fiabilit, la cohrence, et la facilit d'utilisation par
de non-informaticiens. De nombreux modles de description ont t dfinis. Les
principaux sont le modle hirarchique, le modle rseau, le modle relationnel et le
modle objet.
5.2.3.2. Les niveaux de description
Quelque soit le modle de donnes, on distingue trois niveaux de description
(fig. 5.1) :
- le niveau conceptuel, dont nous avons dj longuement parl au chapitre
prcdent, et qui correspond la conception des objets, c'est--dire la structure
smantique des donnes, sans aucun souci d'implantation en machine. On distingue
plusieurs types de donnes pour dcrire des objets : les types lmentaires, prenant
leur valeurs dans un ensemble bien dfini (N, Z, R, R2, R3, C, ...), les mthodes
(fonctions ou plus gnralement relation sur les types prcdents), et les types
complexes (prenant leurs valeurs dans des ensembles d'objets).
- le niveau interne, qui correspond la structure de stockage supportant les donnes
(fichiers, structures, organisation et chemin d'accs), en gnral inaccessible aux
usagers, uniquement grs par le SGBD,

De lobjet la collection dobjets 135


- le niveau externe, correspondant aux descriptions du rel perues par les
applications ou groupes d'utilisateurs du domaine, et qui correspondent des vues
partielles des objets dduites du niveau conceptuel.

Externe

Externe
Externe

Externe

Externe

Niveau
conceptuel
Niveau
interne
fig. 5.1 : les diffrents niveaux de description

C'est le SGBD qui fait le lien entre les diffrents niveaux de description : il a
besoin pour cela de toutes les descriptions et des rgles de correspondance entre ces
descriptions, qui sont conserves dans ce que l'on appelle le dictionnaire des
donnes. La dfinition des diffrents schmas est thoriquement assure par un
administrateur de donnes. Les schmas, les rgles associes, la description
smantique sont stockes dans le dictionnaires des donnes, et qui peut lui-mme
tre organis comme une base de donnes.
Si lon prend lexemple du cadastre, les entits clairement identifiables sont : les
parcelles, les constructions, les proprits, les propritaires, les transactions. Les
transactions sont des associations entre propritaires et proprits, avec des attributs
comme la date dachat, le prix, etc.
Nous allons dcrire rapidement les modles hirarchique et rseau, et plus en
dtail le modle relationnel et le modle objet. Nous verrons ensuite comment
utiliser ces deux derniers modles pour grer et manipuler des objets gographiques.
5.2.4. Les modles hirarchique et rseau
Ces deux modles datent des annes soixante. Le modle hirarchique permet de
dcrire des liens hirarchiques entre objets : le schma entre objets est construit

136

Chapitre 5

uniquement grce ces liens hirarchiques. Dans le modle rseau, on peut tablir
des liens entre objets, dans tous les sens. Dans ces deux modles, l'indpendance
entre structure logique et structure physique n'est pas vraiment respecte, et les
possibilits des structures logiques sont calques sur les problmes d'implantation
physique et d'accs aux donnes. Les structures logiques et les relations entre objets
ne sont que la reprsentation logique de pointeurs entre objets (physiquement des
tables d'index reliant les enregistrements de diffrents fichiers), et tout le formalisme
des modles repose sur la navigation dans la base grce ces pointeurs : le
formalisme d'interrogation (d'ailleurs souvent complexe) repose sur la connaissance
de l'existence de ces pointeurs et donc sur des ordres lmentaires de navigation, et
non sur un langage de plus haut niveau permettant de s'affranchir des liens
physiques entre objets. Les objectifs des SGBD, au niveau de lintgrit et de la
cohrence des donnes, et de lindpendance physique et logique entre donnes et
programmes dapplications, ne sont pas assurs par ce modle.
5.2.5. Le modle relationnel
5.2.5.1. Les principes du relationnel
Le modle relationnel a t introduit dans les annes soixante-dix pour avoir
une totale indpendance entre les structures logiques et physiques, ce qui n'tait pas
le cas avec les modles antrieurs (hirarchique et rseau). Il utilise un modle de
description trs simple, mais rigoureusement dfini et permettant ainsi de remplir un
bon nombre des objectifs des SGBD. Les objets sont dcrits par des attributs
simples, qui prennent chacun leurs valeurs dans un ensemble de valeurs appel
domaine. Les attributs sont simples : les domaines sont soit des ensembles finis, soit
des valeurs entires ou relles (N, Z ou R). Un type d'objet peut tre dcrit par des
attributs, et est appel une relation.
Puisque chaque attribut est de type simple, les objets d'une relation peuvent tre
reprsents par une table donnant les valeurs des attributs pour chaque objet (appel
alors tuple). Les oprateurs de manipulation des objets n'utilisent que des oprations
lies aux domaines des attributs : soit des oprations ensemblistes (pour les
domaines finis), soit des oprations lies l'ordre naturel dans N, Z ou R.
Le terme de relation vient de la dfinition mathmatique du modle : les objets
d'un type d'objets correspondent un sous-ensemble du produit cartsien d'un
ensemble de domaines, ce qui peut tre vu comme une relation entre ces ensembles.
Le modle de description est donc trs simple : pas de types complexes, pas de
dfinition rcursive, pas de mthodes ou fonctions. Tous les attributs prennent leurs
valeurs dans des ensembles finis ou ordonns de dimension 1. Les oprateurs
associs pour valider ou manipuler les tuples vont tous tre dvelopps sur cette

De lobjet la collection dobjets 137


simplicit de description. Le succs du relationnel vient en grande partie de cette
simplicit, qui a permis la mise en uvre effective de la plupart des objectifs des
SGBD.
Les oprateurs lis au formalisme de description sont galement simples. Ils se
divisent en deux grandes familles : les oprateurs de description (thorie de la
normalisation), et les oprateurs de manipulation (algbre relationnelle).
L'inconvnient majeur du relationnel, c'est qu'il est difficile sinon impossible de
modliser des objets complexes : les objets gographiques en fournissent de
nombreux exemples (par exemple, aucun formalisme ne permet d'utiliser une
distance pour mettre en relation deux objets).
5.2.5.2. La notion de cl et la thorie de la normalisation
Une mauvaise perception de la ralit, une mauvaise conception des entits et
associations conduit des relations qui souffrent d'anomalies et prsentent le plus
souvent des redondances. Ces redondances conduisent des risques d'incohrences
lors des mises jour. Pour viter cette mauvaise perception, le modle relationnel
propose un certain nombre de notions qui permettent d'aboutir, par dcomposition
partir de l'ensemble des attributs, des relations ne souffrant pas d'anomalies. Il est
ncessaire pour bien dfinir les relations d'tudier les proprits smantiques des
attributs et de dfinir les dpendances entre attributs qui rsultent de ces proprits.
Ces dpendances sont classes en trois types :
- les dpendances fonctionnelles : un attribut b dpend fonctionnellement d'un
attribut a si toute valeur de a correspond une valeur unique de b :
A B ((xy R et xy' R) y = y')
On introduit la notion fondamentale de cl partir de la notion de dpendance
fonctionnelle : une cl est un ensemble minimum d'attributs qui dtermine tous les
autres (tous les attributs sont en dpendance fonctionnelle avec la cl).
- les dpendances multivalues qui caractrisent l'indpendance de deux
ensembles d'attributs corrls un mme troisime : b dpend de a si toute valeur de
a dtermine un ensemble de valeurs de b indpendamment des autres attributs de la
relation :
A B ((xyz R et xy'z' R) (xy'z R et xyz' R))
- les dpendances de jointures qui permettent de dcrire les relations entre sousensembles d'attributs d'une relation.
A partir de l'ensemble des attributs et de leurs dpendances, des algorithmes
pourront dterminer les entits et les associations canoniques, et fournir des
relations qui ne souffrent pas d'anomalies : cette opration se fera par dcomposition
successive jusqu' l'obtention de relations dites normalises.

138

Chapitre 5

La thorie de la normalisation dfinit cinq formes normales pour les relations :


- une relation est en premire forme normale si tout attribut contient une valeur atomique.
- une relation est en deuxime forme normale si elle est en premire forme et si tout
attribut n'appartenant pas une cl ne dpend pas que d'une partie de cette cl.
- une relation est en troisime forme normale si elle est en deuxime forme et si tout
attribut n'appartenant pas une cl ne dpend pas d'un attribut non cl.
- une relation est en quatrime forme normale si et seulement si les seules dpendances
multivalues lmentaires sont celles dans lesquelles une cl dtermine un attribut.
- une relation est en cinquime forme normale si et seulement si toute dpendance de
jointure est implique par les cls candidates de la relation.

La thorie de la normalisation est peu applique en pratique dans les SIG, alors
que la complexit des objets engendre souvent une mauvaise perception du rel et
une mauvaise conception des relations.
5.2.5.3. L'algbre relationnelle
Une fois la base de donnes constitue, il faut pouvoir l'interroger et la modifier
grce un langage, lui-mme bas sur un ensemble d'oprations lmentaires. Dans
le cas du modle relationnel, ces oprations formelles s'appliquent aux relations et
leur attributs. Les oprations de base sont :
- l'union de deux relations A et B de mme schma : la relation rsultante est de
mme schma que A et B et a pour tuples l'union des tuples de A et B.
- la diffrence de deux relations A et B de mme schma : la relation rsultante
est de mme schma que A et B et a pour tuples la diffrence ensembliste des tuples
de A et B.
- le produit cartsien de deux relations de schmas quelconques : la relation
rsultante a pour schma la concatnation des schmas de A et de B et pour tuples le
produit cartsien des deux ensembles de tuples de A et B. Cette opration comme on
peut s'en douter, est des plus coteuses.
- la projection d'une relation sur un certain nombre de ses attributs : la relation
rsultante a pour schma les attributs sur lesquels la projection est faite, les tuples
tant obtenus par limination des valeurs d'attributs n'appartenant pas au schma
rsultant, ainsi que par limination des tuples en double.
- la restriction d'une relation A par une qualification Q : la relation rsultante est
de mme schma et a pour tuples les tuples de A qui satisfont la qualification Q.
- la jointure de deux relations A et B selon une qualification Q : la relation
rsultante est la restriction du produit cartsien de A et B sur la qualification Q.
Cette opration est fondamentale, car elle permet de relier deux relations sur un ou
plusieurs de leurs attributs et de crer une troisime relation rsultant du croisement.

De lobjet la collection dobjets 139


Il est important de noter que la jointure ne conserve pas la notion de cl : si A1
est cl de la relation R1 et A2 cl de la relation R2, A1 ne sera vraisemblablement
plus cl de la relation R3 rsultat d'une jointure entre R1 et R2. L'ensemble (A1,A2)
sera une cl de la relation R3 s'il fait partie de cette nouvelle relation.
Il est possible de rpondre la plupart des questions que l'on peut poser une
base de donnes relationnelle par un enchanement d'oprations de base, que lon
appelle alors une requte. Les interrogations d'une base de donnes relationnelle
peuvent tre exprimes directement en terme d'oprations relationnelles, ou grce
des langages d'interrogations bass sur la vrification de formules dont les variables
sont soit des tuples, soit des valeurs d'attributs.
5.2.5.4. Puissance et limite du modle relationnel
La puissance du modle vient surtout de la rigueur de ses concepts et de leur
simplicit, deux choses qui permettent une vritable mise en uvre des objectifs
assigns aux SGBD, alors que c'est difficilement ralisable sur les modles
hirarchique et rseau, et mme orient objet.
Les limites du modle relationnel sont inhrentes sa dfinition mme : il ne
concerne que des types d'attributs simples. Si les objets ne peuvent tre dcrits
l'aide d'attributs de type simple, le modle fonctionne mal ou ne fonctionne pas du
tout. Par exemple, il n'est pas prvu de dcrire des images ou d'utiliser des donnes
bidimensionnelles; il n'est prvu aucun oprateur d'interrogation li une distance
entre deux objets.
Le modle gre mal la hirarchie, ou alors au prix de coteuses jointures. Il ne
propose aucune mthode sur les donnes, laissant aux applications le soin d'utiliser
le contenu smantique des relations.
5.2.6. Le modle objet
Le modle objet prend justement la dmarche inverse. La description est la plus
complexe possible, quitte abandonner les objectifs principaux des SGBD, sauf
celui d'indpendance entre structure physique et structure logique [BER 93] [DEL
91].
5.2.6.1. Lapproche objet : donnes et mthodes, encapsulation et hritage
Prenant une dmarche inverse la dcomposition en relation disjointe,
lapproche objet tente de reprsenter de faon naturelle des objets dans toute leur
complexit, aussi bien descriptive que procdurale. Un objet permet de regrouper
sous un mme lment une structure de description (des attributs) et un
comportement (sa faon dagir ou de ragir, dcrit par des mthodes). Les attributs

140

Chapitre 5

peuvent tre lmentaires, cest--dire dun type simple (entier, rel, date, etc.), mais
peuvent galement tre dautres objets. Lun des intrts majeurs de lapproche
objet consiste dans sa capacit dcrire et grer les entits du monde rel en un
formalisme hirarchique (des attributs sont eux-mmes des objets), et en associant
donnes et procdures.
La notion de classe correspond au schma dun objet (description des attributs et
des mthodes). Un objet est alors considr comme linstance dune classe.
Les systmes objets implmentent la notion didentit dobjet, qui permet de
didentifier un objet indpendamment des valeurs de ses attributs. Cet identificateur
interne est unique pour chaque objet, il permet de sparer lexistence de lobjet de la
valeur de ses attributs. Cette notion est importante dans la gestion des attributs
complexes, puisque la valeur de lattribut dune classe peut tre un objet dune autre
classe, objet qui doit donc pouvoir tre point indpendamment de ses valeurs qui,
elles, peuvent changer. Nous retrouverons rapidement cette notion dans les SIG, qui
ont souvent besoin didentifier un objet indpendamment de la valeur de ses
attributs.
Lencapsulation est le concept permettant de regrouper dans une mme classe
des attributs et des mthodes, et de ne permettre la manipulation dun objet que par
les mthodes dfinies dans la classe laquelle il appartient. Lencapsulation induit
donc deux niveaux de perception et de reprsentation dun objet : le niveau externe,
accessible par les utilisateurs, et le niveau interne, accessible uniquement par les
mthodes. Elle garantit en principe lintgrit des objets, qui ne peuvent tre
manipuls par des lments extrieurs que via des mthodes que la classe propose.
Lhritage est galement un concept important implment par le modle objet :
il permet de modliser la hirarchie de classes. Une classe drive dune autre hrite
de lensemble de ses attributs et de ses mthodes. Lhritage peut tre simple (une
classe drive dune seule classe) ou multiple (une classe drive de plusieurs classes,
et regroupe donnes et mthodes de plusieurs classes).
Lutilisation du modle orient objet stend des domaines trs varis,
sappliquant aux langages de programmation, la reprsentation des connaissances,
aux modles et bases de donnes.
5.2.6.2. les SGBD objets
Les systmes de gestion de bases de donnes orient objet tentent de combiner
les possibilits des SGBD classiques et les avantages de la modlisation objet, trs
riche dans laspect procdural et plus proche du rel par lintroduction de types
complexes pour les attributs. Un SGBDOO est construit pour grer des collections
dobjets, suivant un schma de donnes correspondant la dfinition de classes

De lobjet la collection dobjets 141


dobjets. Un SGBDOO regroupe donc des caractristiques des SGBD (persistance
des objets, scurit des accs, etc.) et les avantages de lapproche objet (identit
dobjet, encapsulation, objet complexe, hritage, etc.). Mais lintroduction de
certaines de ces caractristiques sont peu compatibles avec les objectifs des SGBD
tels que nous les avions exprims au dbut de ce chapitre :
- le comportement des objets nest plus du seul ressort des programmes
dapplications. Le SGBD redevient ainsi peu peu un vritable programme
dapplication, mme si la persistance des objets et gestion des collections est assure
indpendamment du schma des objets. Il ny a plus vraiment indpendance entre
les donnes et les programmes dapplications, puisque les objets ne peuvent tre
manipuls quau travers de leurs mthodes;
- lintgrit et la cohrence des donnes devient difficile assurer dans un
modle ou des attributs font rfrences dautres objets complexes.
Malgr ces inconvnients, les SGBDOO reprsentent une avance conceptuelle
importante, mme si les systmes relationnels restent de loin les systmes les plus
employs aujourdhui. Une approche hybride dextension du relationnel par certains
concepts objet peut tre trs bnfique. Cest lapproche que nous dvelopperons
dans la suite de ce chapitre, avec dans un premier temps lintroduction de types
gnriques dobjets et dattributs complexes.
Les SIG introduisent naturellement la notion dobjet, car lutilisation du modle
cartographique pour la modlisation des donnes gographiques introduit des types
diffrents pour les objets. Chaque classe de base possde des mthodes qui lui sont
propres (par exemple, la surface ou le primtre pour le type zone, le plus court
chemin dans un rseau pour le type ligne, etc.). Le modle objet ne permet pas
dassurer les contraintes dintgrit comme le fait le modle relationnel, mais il
permet de rpondre une modlisation plus complexe en introduisant des types
dobjet et des attributs complexes : il correspond mieux la ncessit de
modlisation de linformation gographique, et semblerait mieux adapt aux
diffrents problmes de modlisation que nous avons rencontrs au chapitre 3.
5.3. SGBD et objets gographiques : l'extension du modle relationnel
Intgrer l'attribut de localisation dans le schma relationnel permettrait de
bnficier sur cet attribut de toute la puissance du modle, de simplifier les
oprations de manipulation et les interrogations utilisant la localisation dans l'espace
en mettant ces oprations au mme niveau que les oprations sur les relations non
localises.

142

Chapitre 5

5.3.1. Objectifs
Nous allons donc tendre le modle relationnel aux attributs prenant leurs
valeurs dans un espace de dimension deux ou trois, et aux objets reprsentant soit un
lment de cet espace, soit un ensemble dlments (sous-ensembles de dimension
0, 1 ou 2). Nous allons galement complter l'algbre relationnelle par de nouvelles
oprations algbriques lies au caractre multidimensionnel de l'attribut de
localisation :
- la restriction spatiale, qui correspond la slection d'objets par rapport leur
localisation
- la jointure spatiale, qui correspond la mise en relation de deux objets par
rapport leur localisations respectives
- la projection spatiale, qui correspond l'opration d'impression de l'attribut de
localisation et qui devient ici une opration de cartographie
Ces nouvelles oprations, et surtout les deux premires, vont permettre de
manipuler la localisation grce des oprations algbriques et logiques : c'est dans
ce sens que la localisation, considre habituellement comme un rsultat graphique,
va devenir galement le rsultat intermdiaire d'une squence d'oprations de
gestion et de manipulation de donnes qui peut trs bien ne pas avoir de rsultats
finals graphiques.
Le caractre relativement universel de la localisation permet d'envisager de
nombreuses mises en relation d'objets par opration une jointure spatiale en
relations localises, et ceci indpendamment du codage ou de la mthode de
reprsentation de la localisation. La seule restriction, et elle est de taille, provient de
la prcision smantique lie cette localisation, et de la modlisation de la ralit,
comme nous lavons vu au chapitre 3.
L'intgration de la localisation dans le schma relationnel est donc trs riche,
aussi bien par la puissance de manipulation qu'elle apporte que par les contraintes et
les problmes de reprsentation et de validit de l'information localise qu'elle met
en vidence.
5.3.2. Lextension du modle relationnel
5.3.2.1. Les principes de lextension du modle
Le modle relationnel ne concerne que des types d'attributs simples. Ces attributs
prennent leurs valeurs dans un ensemble fini ou ordonn de dimension un. Les
oprations classiques de l'algbre relationnelle sont limites aux attributs de type
simple, et sont lies la structure d'ordre canonique des ensembles de dfinition.

De lobjet la collection dobjets 143


La localisation spatiale ne rentre pas dans le cadre des attributs simples, puisque
cet attribut prend ses valeurs dans un espace de dimension 2 ou 3. Il faut donc
tendre le modle relationnel classique pour qu'il puisse grer des objets localiss en
en conservant la structure multidimensionnelle [SOU 86].
Il n'existe pas de structure d'ordre canonique dans un espace de dimension
suprieure 1 qui puisse tre utilise dans la rsolution de problmes spatiaux lis
la proximit ou la distance : la structure d'ordre canonique de la dimension 1 doit
tre remplace par une structure topologique ou une structure mtrique. Les
oprations de l'algbre relationnelle lies l'attribut de localisation ne sont plus
dfinies dans un espace une dimension, mais deux ou trois. Les relations entre
objets ne s'expriment donc plus partir d'une relation d'ordre, mais partir d'une
topologie ou d'une distance. Ainsi, un domaine de restriction ne sera plus une
valeur ou un intervalle, mais un domaine de l'espace mtrique. Un critre de jointure
gographique ne sera plus une relation entre les valeurs des objets eux-mmes, mais
une relation ensembliste ou une relation entre les valeurs des distances entre les
objets [SOU 86].
D'une manire classique, la localisation des objets gographiques s'exprime soit
par des lments de l'espace (pour les objets dont la localisation peut tre ramene
un point), soit par des sous-ensembles de l'espace (lignes ou zones). L'extension du
modle relationnel ne concerne donc pas seulement le domaine de dfinition des
attributs (l'espace de dimension 2 ou 3) : il introduit galement des types dans la
dfinition des relations, se rapprochant ainsi du modle objet. Les contraintes
d'intgrit ne seront pas les mmes suivant le type des objets. Nous leur consacrons
un chapitre spcial.
La schmatisation gomtrique de la localisation des objets gographiques en
zone, ligne, point, pixel tablit une classification naturelle sur laquelle repose la
fois l'extension du modle relationnel et la dfinition de classes d'objets
gographiques pour le modle objet. Cette classification est trs discriminante, elle
sera donc prsente trs rapidement comme membre des objets gographiques. Pour
l'extension du relationnel, elle intervient au niveau de la dfinition des relations,
puisque d'elle dpend la mise en uvre des oprations de l'algbre relationnelle.
Pour le modle objet, peu de classes d'objets non localiss peuvent prtendre
encapsuler des classes d'objets gographiques localiss.
Toutes les considrations ultrieures seront donc bases sur la classification
suivante, que nous avons dj vue au chapitre prcdent et qui permet de
schmatiser la gomtrie des objets gographiques et de dfinir des collections
dobjet du mme type :
les objets point, dont la localisation est un point de l'espace,

144

Chapitre 5

les objets ligne, dont la localisation est un sous-ensemble de dimension 1 de


l'espace, en gnral schmatise par un pour plusieurs arcs (ligne brise entre des
points),
les objets zone, dont la localisation est un sous-ensemble de dimension 2 de
l'espace, en gnral dfini par un ensemble d'arc (schmatisant le contour de la
zone),
les objets pixel, dont la localisation est un sous-ensemble de dimension 2 de
l'espace dfinie par un point (tous les pixels ont une gomtrie identique - maille
carre, hexagonale, etc.).
Un arc n'est pas un objet gographique, mais seulement un objet gomtrique.
Les contraintes d'intgrit gomtriques seront exprimes sur les points et les arcs,
c'est--dire sur les objets gomtriques qui permettent de dfinir la localisation des
objets gographiques.
5.3.2.2. Relations localises et notion de cl gographique
Rappelons la dfinition dune cl dans le cas dun attribut de dimension 1 : une
cl est un ensemble minimum d'attributs qui dtermine tous les autres. On peut donc
introduire la notion de cl gographique, lorsque, dans une relation contenant un
attribut de dimension deux, cet attribut de localisation dtermine la valeur de tous
les autres attributs descriptifs.
En fait, on rige cette dpendance en contrainte : par dfinition, une relation est
dite localise si et seulement si lattribut de localisation est une cl pour les attributs
descriptifs. Dans une relation localise, on a donc lassurance que deux objets
distincts ne partagent pas le mme espace : il y a unicit dun phnomne en un lieu.
Les objets dune relation localise sont appels objets localiss. Seuls les objets
localiss contiennent une description explicite de leur localisation (telle que nous
lavons vue au chapitre 3). Lorsque la localisation nest pas une cl gographique
(donc dans une relation non localise), elle peut tre ramene un attribut descriptif
classique (nominal, de dimension un) faisant rfrence la localisation relle.
Par exemple, une relation dcrivant des dpartements, avec la localisation
comme cl gographique, va contenir un attribut de localisation qui sera dcrit de
faon interne par des points et des arcs. Cette relation est localise, et les objets sont
des objets localiss. Chaque dpartement a un nom : cet attribut descriptif nominal
est galement cl de la relation. Une relation dcrivant des personnes, avec un
attribut donnant le dpartement de naissance, nest pas une relation localise, mme
si elle contient un attribut donnant une localisation (le dpartement), car cette
localisation nest pas une cl de la relation. Dailleurs, dans ce cas, la localisation ne
va pas utiliser des points et des arcs, mais bien un attribut descriptif classique
donnant le nom du dpartement. On pourra retrouver la description de la localisation

De lobjet la collection dobjets 145


(cest--dire lattribut spatial de localisation, et son expression en points et arcs) en
utilisant une semi-jointure classique sur cet attribut descriptif.
La notion de cl gographique est trs importante : elle est la base de
lextension du modle relationnel que nous proposons. En effet, il ne serait pas
possible de bien grer un modle dans lequel la description de la localisation des
objets serait donne quelle que soit lattribut (cl ou non).
5.3.3. Les extensions de l'algbre relationnelle
Toutes les oprations que nous allons ajouter l'algbre relationnelle portent sur
l'expression de la localisation dans l'espace, et donc intrinsquement sur le mme
attribut. Si l'on dispose d'une rfrence unique pour l'attribut de localisation, et pour
chaque relation de la description de la localisation des objets par rapport cette
rfrence, tout objet pourra tre mis en relation avec n'importe quel autre objet ainsi
localis, indpendamment d'un systme de rfrence attach telle ou telle entit.
Le systme de rfrence unique est bien sr l'espace mathmatique euclidien :
l'attribut de localisation est alors de dimension deux ou trois, sans relation d'ordre
canonique (lie la mtrique dfinissant la structure de l'espace). La qualification
des oprations de restriction ou de jointure porte sur un attribut de dimension deux
ou trois. Elle n'est plus lie une structure d'ordre mais la structure mtrique de
l'espace euclidien. Quel que soit le type de reprsentation utilise pour la
localisation, il va falloir formellement passer de nouveau par l'espace euclidien pour
mettre les objets en relation sur leur localisation : il s'agit maintenant de repasser de
l'espace de reprsentation l'espace euclidien, de l'entit drive l'entit initiale,
l'inverse de la dmarche expose dans le chapitre prcdent.
L'attribut formel de localisation sera not loc dans la suite, et sa valeur
reprsente l'ensemble des points de l'espace euclidien attach un objet. Il est, de
par son caractre formel, indpendant du type de reprsentation utilis pour la
localisation des objets dans la base et des mthodes effectives de ralisation des
oprations algbriques. Cet attribut formel, associ s'il y a lieu un attribut
temporel, dtermine l'ensemble des attributs descriptifs de la relation : la localisation
spatio-temporelle constitue toujours une cl d'une relation localise.
Nous allons complter l'algbre relationnelle par de nouvelles oprations
algbriques concernant l'attribut multidimensionnel de localisation : la restriction
spatiale, la jointure spatiale, la projection spatiale.

146

Chapitre 5

5.3.3.1. La restriction spatiale


C'est l'opration correspondant la slection des objets par rapport un domaine
dfini de l'espace, not D. Ce domaine peut tre dfini soit directement (fentre
d'tude, domaine dfini par lutilisateur en coordonnes ou sur un cran, etc.), soit
par rapport aux objets dune autre relation : zone autour dun point, espace autour
dune ligne ou dune zone. Nous verrons plus tard comment le concept de masque
permet de manipuler facilement ces domaines de restriction.
Plusieurs types dopration de restriction spatiale peuvent tre envisags quand
les objets sont des ensembles de points, en prenant une qualification ensembliste
plutt que mtrique. La qualification peut utiliser lensemble des points de lobjet
(inclusion, intersection), ou un point particulier de lobjet (appartenance). Le point
particulier de lobjet est appel centrode : il peut tre choisi manuellement lors de la
dfinition gomtrique de lobjet, ou automatiquement partir de la gomtrie de
lobjet. Si A dsigne un objet et D le domaine de restriction, on peut ainsi dfinir les
diffrentes oprations de restriction spatiale :
A D

lobjet A est inclus dans le domaine D

A D lobjet A a une intersection non vide avec le domaine D


A D = restriction par exclusion, si A et D sont disjoints
a D

le centrode de A appartient D

Contrairement la restriction classique, la restriction spatiale peut modifier les


objets lorsquil sagit dune qualification ensembliste concernant lintersection. En
effet, le rsultat de la restriction peut tre lobjet lui-mme (pas de modification de
la localisation) ou lintersection de lobjet et du domaine de restriction. Dans ce cas,
il y a modification de lattribut de localisation. Par contre, il ny a pas modification
du type dobjet (une zone reste une zone, une ligne reste une ligne). Les attributs
descriptifs ne sont jamais modifis par une opration de restriction.
5.3.3.2. La jointure spatiale
De toutes les oprations algbriques, la jointure est certes la plus importante en
pratique, car, comme nous lavons soulign, cest elle qui permet la mise en relation
de deux tuples par le biais dun attribut commun, en crant ainsi un nouvel objet
ayant les caractristiques des deux objets rpondant la qualification de jointure, et
correspondant dans la nouvelle relation un tuple form de valeurs dattributs des
deux tuples mis en relation.
La jointure spatiale est donc lopration de jointure portant sur lattribut de
localisation. La qualification de jointure sexprime soit par rapport la distance
entre deux objets :
a1 d(O1,O2) a2

De lobjet la collection dobjets 147


soit par rapport une relation ensembliste entre les objets :
O1 O2 =
O1 O2
O1 O2
O1 O2
Par exemple, a2 = 0 (d(O1,O2) = 0) signifie que deux points de lespace sont
mis en relation sils ont la mme localisation . On parle alors dquijointure
gomtrique.
Pour bien dfinir cette opration, il est ncessaire de revenir lespace
gomtrique de rfrence et de repasser du type de reprsentation des objets en
zones, lignes, points aux objets lmentaires que sont les points de lespace
euclidien avec leur localisation intrinsque. Lopration de jointure spatiale
seffectue, en thorie, en considrant que les seuls objets logiques sont les points de
lespace. Le rsultat de lopration de jointure pourra nouveau faire lobjet dun
changement de reprsentation, du type passage entit principale-entit drive. Le
cheminement thorique dune jointure spatiale est donc :
Espace de reprsentation

Espace euclidien

Jointure sur les points de lespace euclidien

Espace de reprsentation (si ncessaire).


La jointure spatiale cre de nouveaux objets. La description de la localisation de
ces objets pose les mmes problmes que la description de la localisation des objets
initiaux : les nouveaux objets sont des points ou des ensembles de points de lespace
euclidien, quil est ncessaire de regrouper et de dcrire dune manire ensembliste
avec les choix possibles que nous avons vus au chapitre 3. Bien sr, les mthodes de
ralisation de la jointure et de la description de la localisation des rsultats seront
fonction du type de description des objets initiaux.
La jointure spatiale est une opration trs intressante dans la mesure o elle
permet de comparer des objets sur leur localisation, sans avoir spcifier et dcrire
cette localisation. Le rsultat peut dailleurs tre considr davantage au niveau de
cette mise en relation, plutt quau niveau du rsultat graphique form par les tuples
de la nouvelle relation. Ainsi par exemple, on pourrait mettre en relation la relation

148

Chapitre 5

Parcelle (numro, nom de propritaire, nombre de construction,) et la relation


Bornes dincendie (numro, dbit) sur la qualification d(O1,O2) < 100 mtres pour
avoir la liste des numros de parcelles et le nombre de constructions associes une
borne plutt quune carte des parcelles ou portions de parcelles et bornes rsultant
de la jointure.
Les jointure du type d(01,O2) = 0 sont appeles des qui-jointures gomtriques.
Si la qualification de jointure est d(O1,O2) < a, les rsultat est plus complexe
puisquil correspond un ensemble dobjets pour lesquels la localisation ne
constitue plus une cl : un point peut apparatre plusieurs fois avec des descripteurs
diffrents sil rpond la qualification de jointure pour plusieurs objets de chaque
relation. La notion de cl de localisation nest pas conserve par la jointure spatiale,
comme cest dailleurs le cas pour le rsultat dune jointure classique. Dans ce cas,
le rsultat sera une relation non localise, et le rsultat sera impossible reprsenter
cartographiquement car nous navons plus de dpendance fonctionnelle des attributs
descriptifs par rapport la localisation : on peut avoir des tuples forms du mme
ensemble de points mais ayant des valeurs descriptives diffrentes.
P2

P1

P3

profils

Z1

Z3

potentialits
Z2

jointure

P1
P2
P3

couleur
rouge
jaune
ocre

Ph
7.5
5.8
6.5

Z1
Z2
Z3

pente
10-20
20-30
10-20

pierrosit
faible
moyenne
trs faible

salinit
faible
trs faible
moyenne

Q2
Q1

Le rsultat de la jointure est compos des points Q1 et Q2 :


Q1
Q2

couleur Ph
rouge 7.5
jaune 5.8

pente
10-20
10-20

pierrosit
faible
trs faible

salinit
faible
moyenne

fig. 5.2 : jointure entre zones et points sur la qualification d(O1,O2)=0

De lobjet la collection dobjets 149

zone

z1

z2

z1

zone

z1-z1

jointure

z2-z1

fig. 5.3 : jointure entre zones sur la qualification d(O1,O2)=0

Des exemples de jointures entre relations de type zone sont donns par les
figures 5.2 et 5.3. La qualification d(O1,O2) = 0 correspond lintersection des
zones et conserve la localisation comme cl de la relation rsultante. La
qualification a < d(O1,O2) < b, avec a non nul, donne un rsultat plus complexe et
difficile reprsenter graphiquement dans son intgralit, puisque la localisation
nest plus une cl de la relation rsultante.
La jointure spatiale est une opration dangereuse si les objets mis en relation
nont pas la mme chelle de validit, ou si la validit de la localisation par rapport
aux donnes descriptives est trop faibles pour permettre le passage de lespace de
reprsentation lespace euclidien (pour des donnes caractre statistique par
exemple, ou nayant quun intrt de reprsentation graphique). Ainsi, des logiciels
proposent des oprations graphiques pour liminer les problmes rsultant de
diffrentes prcisions sur les collections dobjets mis en relation (limination de
petites zones par exemple). Nous prsenterons au chapitre 8 dautres oprations de
mise en relation dobjet, bases sur la jointure spatiale, mais permettant de prendre
en compte ces problmes de prcision et de grer les transferts dchelle notamment
avec lintroduction de procdures dagrgation spatiale.
5.3.3.3. La projection spatiale
La projection spatiale correspond lopration de projection dattributs de
lalgbre relationnelle classique (elle na donc rien voir avec les projections
gographiques de type UTM ou Mercator). Projeter lattribut de localisation
correspond donc une opration de cartographie, exactement comme une projection

150

Chapitre 5

dattributs descriptifs a pour objet la reprsentation en liste des valeurs de ces


attributs. Si lobjectif dune requte est purement graphique, on peut donc prsenter
lopration de cartographie comme une projection de lattribut de localisation, dans
le cadre de lalgbre relationnelle tendue la localisation. Nous verrons au chapitre
9 les nombreuses possibilits de reprsentation graphique lies cette opration.
5.3.3.4 Masques et semi-jointures gomtriques
Certaines oprations que nous avons dfinies comme des oprations de
restriction sont en fait des jointures : la restriction dune relation sur la localisation
des objets dune autre relation est en fait une semi-jointure avec la qualification
d(O1,O2) = 0 : on connat a priori lensemble des valeurs de lattribut de
qualification, reprsent par le domaine D. Mais lintrt de cette opration rside
plus dans la restriction apporte lune des relations que dans la mise en relation
effective des attributs des deux relations. Cest pour cela que nous lavons classe
comme restriction spatiale :
Slection dans la relation R1

Dfinition dun domaine D partir des objets de la relation R2

Jointure de R1 et R2 par rapport D

Projection de la jointure sur les attributs de R1


Ces semi-jointures sont intressantes dans la mesure o elles ne font pas perdre
la cl de localisation : on conserve donc, comme dans toute restriction, la possibilit
dutiliser la localisation dans une opration ultrieure ou de cartographier le rsultat.
La dfinition dun domaine de lespace partir des objets dune relation prend
donc un caractre particulirement intressant. Cest pour cela que nous avons
nomm masque ce type de domaine. Un masque est donc un domaine de lespace
qui nintervient dans le processus relationnel que par sa localisation.
Des oprations ensemblistes, mtriques ou morphologiques peuvent tre
appliques ces domaines de lespace : union, intersection, diffrence, inverse,
dilatation, rosion, etc. En utilisant ces oprations, on peut crer des domaines de
lespace permettant de rsoudre de nombreuses questions faisant intervenir une
restriction spatiale, comme par exemple : slectionner les objets dune relation se
trouvant telle distance des objets dune autre relation, slectionner les objets dune
relation se trouvant dans une zone de caractristiques donnes, etc.

De lobjet la collection dobjets 151


5.3.4. Objets spatiaux et oprations relationnelles classiques
Les oprations de lalgbre relationnelle classique peuvent bien sr tre utilises
sur les attributs descriptifs dans le cadre du modle relationnel tendu la
localisation. Lincidence de ces oprations est nanmoins importante sur la
conservation de la cl de localisation, les problmes tant poss essentiellement par
les objets rsultant dune jointure classique.
La restriction ou la projection sur un attribut descriptif na pas dincidence
directe sur lattribut de localisation. En liminant des objets, la restriction peut
nanmoins modifier des caractristiques gomtriques de la relation rsultante
(connexit, genre, etc.).
La jointure classique de lalgbre relationnelle permet de mettre en relation les
objets de deux relations diffrentes de manire crer une nouvelle collection
regroupant les objets rpondant au critre de jointure. Lorsque les objets sont
localiss, ils sont regroups dans des relations o tous les objets sont de mme type
gographique. La jointure classique va donc tre difficile mettre en uvre entre
deux relations localises sans perdre la localisation du rsultat. Si les deux relations
ne sont pas du mme type, la localisation des objets rpondant au critre de jointure
ne peut tre conserve, car elle ne peut tre exprime par les mthodes que nous
avons exposes plus haut et ne rentre pas dans le modle relationnel tendu. On
pourrait dcider, pour les objets rsultant de la jointure, de ne conserver que la
localisation provenant dune des deux relations, mais on risque alors malgr tout de
perdre le principe dunicit de cl pour cet attribut. Lorsque les deux relations sont
du mme type, on rencontre le mme problme, la localisation risque de perdre son
caractre de cl, car les objets rsultant de la jointure pourraient partager le mme
espace gographique, comme cest le cas pour la jointure spatiale lorsque la
qualification de jointure nest pas d(O1,O2) = 0, et la relation rsultante ne peut
donc tre considre comme une relation localise et devient donc une relation
dobjets non localiss. Pour viter la perte de la cl de localisation, il est courant
deffectuer une opration dagrgation dans une des relations dorigine aprs une
jointure classique. Lagrgation doit se faire sur la cl de localisation, et correspond
la suppression des doublons sur la localisation. Nous reviendrons en dtail sur ce
type doprations dans le chapitre 8.
5.4. La structuration et lindexation de lattribut de localisation
La structuration des donnes gographiques en vue damliorer les oprations de
recherche en mmoire de stockage est un problme gnral qui concerne lensemble
des donnes graphiques de la base, quels que soient les modes de reprsentation
choisis. Il sagit ici des mthodes de partage ou dindexation des objets, mthodes

152

Chapitre 5

bases sur leur localisation absolue au niveau de lespace initial de reprsentation.


La ncessit dune telle structuration est vidente car linterrogation dune base de
donnes localises va faire intervenir en priorit la localisation ; une interrogation
classique, dans un SIG, sera en effet souvent du type : retrouver dans telle zone tous
les objets de tel type qui rpondent telles conditions. Cette interrogation se
dcompose dune manire optimale en :
Retrouver tous les objets dans une fentre contenant la zone dtude,
Slectionner les objets qui rpondent aux critres de slection.
La premire opration, la restriction spatiale, est de loin le critre le plus
discriminant, car il repose sur un attribut multidimensionnel (n= 2 ou n=3), face aux
oprations de slection sur les attributs descriptifs une dimension. Devant
seffectuer en priorit pour optimiser le temps de recherche, elle ncessite laccs
possible lensemble des donnes de la base sur les mmoires de stockage et
reprsente lopration la plus coteuse en temps dexcution. Lorganisation des
donnes doit donc tre conue en priorit par rapport lattribut de localisation.
5.4.1. Les mthodes classiques dindexation
Les mthodes classiques de gestion de donnes ont pour objet de rduire le
nombre des oprations daccs aux mmoires de stockage. Elles sont bases sur des
techniques dindexation dattributs mono-dimensionnels ordonns (accs alatoire,
squentiel index) [KNU 73] [LEE 80], et ne sont pas applicables directement
lattribut de localisation, qui est par nature multidimensionnel sans relation dordre
compatible avec la structure euclidienne. On peut organiser lindexation dun
ensemble dobjets par leur nom, grce lordre lexicographique par exemple, les
regrouper en paquets grce la relation dordre, et stocker les objets de chaque
paquet sur un secteur contigu des disques magntiques, de manire pouvoir
accder au paquet en une opration daccs mmoire. En revanche, il nest pas
possible, pour le cas le plus simple de donnes ponctuelles, de structurer ces points
de la mme manire, avec un ordre sur les abscisses ou sur les ordonnes,
indpendamment lun de lautre, sans perdre toute relation de voisinage ou de
distance entre deux points (il nexiste pas de relation dordre total dans les espaces
euclidiens de dimension suprieure 1). Une telle structuration serait donc
inefficace dans le cas qui nous intresse, savoir retrouver rapidement tous les
objets dans un espace donn ou tous les objets proches dun objet donn. Cet
objectif impose un rapprochement logique (et physique sur les mmoire de
stockage) des objets bass sur leur localisation. Il est ncessaire de dvelopper pour
cela des mthodes de gestion adaptes aux donnes localises, ou plus gnralement
multidimensionnelles, mthodes bties sur une structuration base sur la notion de
voisinage et de sous-ensemble born pour la mtrique choisie dans l'espace de
reprsentation.

De lobjet la collection dobjets 153


5.4.2. Lindexation multidimentionnelle
Lide la plus simple, calque sur les techniques du squentiel index [GAR 83]
est de dcomposer lespace en sous-ensemble borns, que nous appellerons feuilles,
et dindexer les objets par rapport ces feuilles et deffectuer les recherches
squentiellement dans les feuilles slectionnes pour le domaine dtude ou de
slection.
On peut classer les diffrentes mthodes utilises selon la dfinition et la
structure des feuilles [SCH 95] :
- les structures en grille : les feuilles correspondent un quadrillage rgulier ;
- les structures en arbres quaternaires ou region-quadtree ;
- les structures en arbres k-d (k-dtree) ;
- les structures en arbres R (R-tree).
On trouvera dans [SCH 95] une prsentation dtaille des diffrentes structures
permettant de grer les index spatiaux. Nous ne rappelons ici que les principes
lmentaires et les structures les plus employes.
Les structures de type grille utilisent une partition de lespace en feuilles
lmentaires de forme rectangulaire. La structure est extrmement simple : chaque
feuille est associe une page contenant lensemble des objets inclus dans la feuille.
Pour optimiser les temps daccs la mmoire de stockage, la taille dune feuille
sera choisie de manire tre lue en une seule opration dentre-sortie, ce qui
impose un stockage de tous les objets dune feuille sur un secteur contigu de la
mmoire de masse. Le nombre des objets pouvant tre trs variable dun endroit
lautre de lespace gographique, cette taille ne peut tre fixe a priori sans dgrader
les performances de lindexation (les feuilles se trouvant dans des zones de faible
densit seraient alors presque vides). La taille dune feuille devrait donc tre
variable en fonction de la densit dobjet : si le nombre des objets dune feuille
dpasse le maximum, cette feuille sera divise en sous-feuille, et chaque objet
raffect une des sous-feuilles. Cette division peut se faire en adaptant la taille de
la grille au nombre dobjet (grille adaptative) ou de manire faciliter le choix de la
sous-feuille, pour une localisation donne, et donc naturellement par dichotomie. La
feuille est alors divise en 4m (pour n=2) ou 8m (pour n=3) sous-feuilles, o m nest
pas trop lev pour ne pas crer un grand nombre de feuilles presque vides.
Lclatement dune feuille en sous-feuille est une opration complexe, qui
impose galement la rorganisation des index bass sur les numros de feuilles.

154

Chapitre 5

Lorganisation des feuilles et les diffrents niveaux dclatement peuvent tre


reprsents par un m-quadtree (m-octree pour n=3). Chaque nud non terminal
contient la description de la division et pointe vers ses fils, et chaque nud terminal
contient ladresse de la feuille dans la mmoire de stockage. Un tel quadtree est
appel rgion quadtree , par opposition aux quadtrees vus au chapitre 3 et servant
reprsenter directement un espace dcoup en cellules.
La recherche sur la localisation (slection gographique) se fait alors par
descente dans larbre : chaque niveau sera choisi le fils qui contient la feuille
cherche, jusquau nud terminal qui donne ladresse de la feuille. Si m est choisi
de manire ce que la lecture dun nud ne ncessite quune entre-sortie (la
recherche du fils se faisant en mmoire centrale), ladresse de la feuille est
dtermine en quelques entre-sorties. La recherche des feuilles voisines fait appel
des cheminements dans le quadtree, et ne demande donc elle aussi que quelques
oprations [SAM 84].

fig. 5.4 : hirarchie en feuilles et region quadtree associ

Linconvnient majeur de la partition en region quadtree rside dans le cot


arbitraire du dcoupage en quatre rgions gales, ce qui peut provoquer un
dsquilibre important de larbre si les donnes ne sont pas rparties de manire
relativement homogne dans lespace, et donc une baisse notable des performances
de lindexation. Pour remdier ce problme, on peut utiliser un dcoupage rcursif
qui tient compte de la position des objets de manire optimiser le nombre dobjets
prsents dans chaque partie du dcoupage, limage des k-dtree [MAT 84]. Bien
sr, le dcoupage doit alors tre mmoris car il nest plus implicite comme dans les
region quadtree ; la recherche des feuilles du k-d tree contenues dans la fentre

De lobjet la collection dobjets 155


dtude se fait galement par descente dans un arbre binaire, mais en consultant
pour chaque nud la manire dont larbre a t dcoup.

A
E

C
A

G
B

C
F

fentre dtude

fig. 5.5 : dcoupage en k-d tree et arbre binaire associ

La recherche dun objet doit galement pouvoir se faire sur la valeur dune de
ses cls, sans connatre la localisation : par exemple, un nom de ville doit permettre
de retrouver rapidement ladresse de la feuille qui la contient. Ce type de recherche
ncessite la mmorisation pour chaque objet de ladresse de la feuille laquelle il
appartient : ceci revient crer pour la cl choisie un index dense, et dorganiser cet
index de manire classique en arbre B+ ou en paquets. Quelques oprations
dentre-sortie suffiront alors retrouver ladresse de la feuille qui contient lobjet.
Les objets voisins se trouveront alors dans la feuille slectionne ou dans les feuilles
adjacentes, faciles dterminer grce lindexation principale sur la localisation en
cheminant dans les arbres associs. Ces index, ncessairement denses, peuvent
occuper une place importante.
Comme nous lavons dj mentionn, lclatement et lagrgation de feuilles
imposent la raffectation des objets dans les feuilles et donc la rorganisation des
index. Toutes ces oprations sont relativement complexes mettre en uvre.
Laffectation dun objet dans une feuille est simple pour les objets dune relation
de type point. Tout se complique lorsque ces objets sont des lignes ou des zones, car
ils peuvent alors ne pas tre contenus strictement (au sens de linclusion) dans la
feuille et lunicit du choix daffectation nest plus assure. Diverses solutions
peuvent tre apportes ce problme. La plus simple consiste affecter un
centrode chaque objet et stocker lobjet dans la feuille qui contient le centrode.
Une autre alternative serait de diviser les objets en sous-objets en introduisant le

156

Chapitre 5

bord de la feuille, mais cette mthode complique beaucoup les manipulations


ncessaires au stockage et lextraction des donnes. Matsuyama propose de
conserver avec chaque feuille le numro des enregistrements de tous les objets
totalement ou partiellement contenus dans la feuille : la slection dune feuille par
descente dans le k-d tree ou dans le region quadtree permet de dterminer
lensemble des feuilles consulter ainsi que le numro des objets dans chaque
feuille [MAT 84].
Le problme peut galement tre rsolu de manire diffrente, en conservant une
feuille chaque niveau de la structure arborescente o ne seront stocks que les
objets qui ne peuvent tre contenus entirement dans aucune des feuilles des
niveaux suivants. Evidemment, la gestion des objets en est fortement complique,
car ces feuilles ne peuvent tre clates quand elles sont pleines et doivent alors tre
chanes entre elles comme des paquets de dbordement. Pour n=2, le nombre des
objets possibles un niveau est nanmoins fortement limit par la surface de la
feuille ; les objets fortement convexes (surface/primtre2 << 1/4*) ainsi que ceux
de petite surface qui sont coups par les premires divisions de lespace sont les plus
problmatiques. Si lon arrive rsoudre le problme de laffectation de ces petits
objets mal placs par rapport la division de lespace, cette structure multi-niveau
introduit une hirarchie dans lencombrement des objets qui peut galement
constituer un critre de slection intressant [FRA 81]. Notons pour conclure que
peu de systmes mettent en uvre ces techniques de structuration. De nombreux
systmes ne sont pas aptes fournir des performances valables lorsque la taille de la
base de donnes gographique est importante, et noffrent pas alors les possibilits
dinteractivit qui semblent nanmoins ncessaires un systme performant.
5.5. La mise en uvre du relationnel tendu dans le systme SAVANE
Dans ce paragraphe, nous allons dtailler la mise en uvre concrte, dans le
systme Savane, des principes de structuration noncs aux chapitres 3 et 5. Nous
allons dcrire la mise en uvre concrte de la structuration relationnelle tendue la
localisation dans le systme Savane.
5.5.1. Schma : relations et attributs
Larchitecture de SAVANE est celle dun calculateur base de donnes : il
possde un dictionnaire des donnes, indiquant les relations et attributs ainsi que
leurs caractristiques (types, dfinition du schma interne associ), un dictionnaire
des accs permettant de grer les niveaux externes (par lallocation de droits et la
dfinition des accs aux donnes), un langage de commande permettant dinterroger

De lobjet la collection dobjets 157


et de manipuler les donnes. Chaque opration utilise ces trois structures pour
accder au niveau interne et au systme de fichier.
Les donnes sont structures en relations correspondant aux entits du monde
rel. La structuration reprend le principe du modle relationnel tendu la
localisation tel que nous lavons prsent plus haut. Les objets sont donc regroups
en relations, dont le type peut tre : zone, ligne, point, mosaque, non localis. La
localisation est conserve sous forme vectorielle (pour les types zone, ligne, point)
et sous forme matricielle (pour le type mosaque). Les paramtres des relations
dune base de donnes sont conservs dans le fichier base qui correspond au
dictionnaire de la base de donnes.
Pour chaque relation, la description comprend :
- le nom de la relation
- le type de la relation (zone, ligne, point, image, non localise)
- le nombre dattributs descriptifs
- le nom des fichiers associs (objets et valeurs descriptives, objets graphiques
associs)
La description dune relation est suivie de la description de ses attributs. Pour
chaque attribut, la description comprend :
- le nom de lattribut
- le type de lattribut (nominal, ordinal, entier, numrique, date, RVB, etc)
- le nombre de valeurs nominales (dans le cas dun attribut nominal)
- ladresse de la premire valeur nominale dans le fichier des valeurs dattributs
(dans le cas dun attribut nominal).
La lecture du dictionnaire permet au systme de charger le schma des donnes
et lensemble des paramtres permettant daccder aux objets (donnes graphiques
et descriptives). La classe CDico permet dencapsuler lensemble des oprations de
lecture et dcriture du dictionnaire de la base de donnes (A.1). On pourra
consulter par exemple, le code des procdures EcrireRelation() et
EcrireAttribut().
Toutes les oprations de dclaration ou de modification du schma dune base de
donnes sont effectues avec le module SAVATECA (fig. 5.6, fig. 5.7). Il est
possible tout moment de modifier le schma dune base de donnes, en ajoutant,
modifiant, ou supprimant relations ou attributs. Toute modification du schma
implique une modification du numro dtat de la base. Les programmes
dexploitation du systme (comme les modules SAVANE, SAVEDIT, SAVAMER)

158

Chapitre 5

utilisent ce numro dtat pour remettre jour le schma sil a t modifi pendant
lexploitation de la base de donnes.

fig. 5.6 : le dialogue pour la gestion des relations

Le dialogue gnral de gestion des relations de SAVATECA contient de


nombreux boutons, permettant de crer, dimporter, de modifier, de supprimer, de
rinitialiser ou de rorganiser une relation.

De lobjet la collection dobjets 159


fig. 5.7 : le dialogue de cration dune relation

Pour crer une relation, lutilisateur doit indiquer le nom et le type de la relation.
Le schma de certaines relations est prdfini : la relation est alors automatiquement
cre avec son type et ses attributs prdfinis.
Lorsque la relation est du type mosaque, lutilisateur doit indiquer le rpertoire
de stockage de la mosaque ainsi que la projection gographique utilise pour
conserver les images.
La cration de la relation se traduit concrtement par lcriture de la description
de la relation dans le fichier base. La suppression dune relation supprime la
description de la relation et de ses attributs dans le dictionnaire et supprime toutes
les rfrences cette relation dans les vues externes.

fig. 5.8 : le dialogue de gestion du schma des attributs dune relation

Le dialogue de gestion des attributs de SAVATECA permet dajouter, modifier,


supprimer, ou rinitialiser des attributs (fig. 5.8, fig. 5.9). Comme pour les relations,
toute suppression dattribut est suivie dune suppression des rfrences de cet
attribut dans les vues externes de la base, ainsi que dune modification du numro
dtat de la base de donnes.

160

Chapitre 5

fig. 5.9 : le dialogue de cration dun attribut

La classe CSchema, prsente dans tous les modules du systme, permet de


charger le schma en mmoire partir du dictionnaire. Elle est associe aux classes
CRelation et CAttribut, qui permettent dencapsuler donnes et mthodes
correspondant au schma des relations et de leurs attributs. Par exemple, la mthode
Alloc() de la classe CSchema charge le schma dans un objet de type
CSchema, partir du dictionnaire de la base et de la vue externe utilise (A.2.1.2.).
Ces classes sont fondamentales dans le systme SAVANE. Elles sont au cur du
systme et sont utilises par la majorit des autres classes.
5.5.2. Structuration des collections dobjets
5.5.2.1. Architecture gnrale et organisation des bases de donnes
Tous les fichiers correspondant aux relations dune base de donnes sont
conservs dans un rpertoire unique portant le nom de la base de donnes. Ce
rpertoire peut tre physiquement situ nimporte o sur le rseau local. Laccs aux
fichiers dune relation est gr par le systme dexploitation de lordinateur
(ouverture, criture, accs concurrents) partir de ce rpertoire, dont lemplacement
absolu est conserv dans le fichier fpconf.
La seule exception concerne les relations de type pixel, pour que ces relations
puissent tre partages entre plusieurs bases de donnes diffrentes. Les fichiers
correspondants ce type de relation peuvent donc tre stocks dans un rpertoire

De lobjet la collection dobjets 161


particulier. Lemplacement de ce rpertoire est conserv dans le fichier base avec
les caractristiques de la relation.
Si les dclarations sont incompltes, ou si le systme narrive pas trouver les
emplacements indiqus, lutilisateur devra indiquer le bon emplacement des fichiers
chaque premire utilisation de la relation, lors dune session de travail.
5.5.2.2. Indexation gographique et structure des fichiers
La structure des fichiers dune relation dpend du type de la relation. Nous
allons dcrire cette structure pour chaque type.
Dune manire gnrale, la description des objets (identifiant dobjet, entte
gographique) et leurs valeurs dattributs sont conserves dans un fichier, la
description de la localisation dans un autre (pour les types zone et ligne), et un
troisime fichier conserve lindexation gographique (pour les relations localises).
Toutes les localisations sont conserves en coordonnes gographiques (longitudelatitude) par rapport un point fixe, propre la base. Pour toutes les relations dune
mme base, les coordonnes gographiques doivent donc tre exprimes dans un
mme datum. Il est possible de modifier le datum dune base de donnes, toutes les
coordonnes tant alors recalcules en utilisant la formule de Molodensky.
Tous les types localiss sont indexs de faon primaire sur la localisation. Cette
indexation utilise le principe des grilles adaptatives et une structure squentielle
pour chaque entre de lindex (squentiel index). Pour dfinir les cellules, on
utilise le dcoupage naturel en feuille cartographique de numrisation (voir chapitre
7). Lindexation conserve pour chaque feuille lespace gographique occup par les
objets de la feuille (cest--dire le plus petit rectangle englobant lensemble des
objets), le nombre dobjet de la feuille, ladresse du premier objet de la feuille dans
le fichier de description. Pour les types zone et ligne, on conserve galement le
nombre darcs utiliss pour dcrire la localisation des objets et ladresse du premier
de ces arcs dans le fichier des arcs correspondant la relation.
5.5.2.2.1. Le type non localis
Le type non localis est le plus simple : les objets sont stocks squentiellement,
la description de chaque objet est constitue uniquement des valeurs des attributs. Il
ny a pas dindexation, ni didentifiant dobjet.
5.5.2.2.2. Le type point
Chaque objet point est dcrit par des valeurs dattributs descriptifs et par une
localisation gomtrique ponctuelle. Le type point utilise deux fichiers : un fichier
index et un fichier descriptif. Lindex comprenant pour chaque feuille :
- le nom de la feuille,

162

Chapitre 5

- lespace gographique occup par les objets de la feuille (point bas gauche,
point haut droit, en coordonnes gographiques),
- le nombre dobjets de la feuille,
- ladresse du premier objet de la feuille dans le fichier descriptif.
Le fichier descriptif comprend pour chaque objet :
- la localisation du point (en coordonnes gographiques),
- les valeurs des attributs, dans lordre dcrit par le schma de la base.
On peut donc lire lensemble des objets dune relation en balayant son index, et
pour chaque entre de lindex, en balayant squentiellement les objets partir de
ladresse donne pour le premier objet de la feuille.

Index

Objets de type point

feuille i

feuille j

x,y, v1,v2,...
x,y,v1,v2,...
....

x,y, v1,v2,...
x,y,v1,v2,...
....

5.5.2.2.3. Le type ligne


Chaque ligne est dcrite par des attributs descriptif et par un arc gomtrique.
Nous nutilisons pas de polyligne, ou de lignes constitues par plusieurs arcs.
Le type ligne utilise trois fichiers : un fichier index, un fichier descriptif, un
fichier darcs. Le fichier index permet daccder aux objets dune feuille, puis on
obtient dans le fichier descriptif la description de chaque objet ainsi que ladresse de
larc correspondant dans le fichier descriptif. Lespace gographique occup par
chaque objet est conserv dans le fichier des arcs. Chaque arc est dcrit par la suite
des points qui le constitue. Les coordonnes sont conserves en longitude, latitude
par rapport au point bas de la base.
Lindex comprend pour chaque feuille :

De lobjet la collection dobjets 163


- le nom de la feuille,
- lespace gographique occup par les objets de la feuille (point bas gauche,
point haut droit, en coordonnes gographiques),
- le nombre dobjets de la feuille,
- ladresse du premier objet de la feuille dans le fichier descriptif,
- le nombre darcs utiliss pour dcrire la localisation des objets,
- ladresse du premier arc dans le fichier des arcs.
Le fichier descriptif comprend, pour chaque objet :
- le numro de larc correspondant lobjet,
- ladresse de larc dans le fichier des arcs,
- la localisation du centrode de la ligne,
- les valeurs des attributs dans lordre dcrit par le schma de la base.
Le fichier des arcs comprend, pour chaque arc, un entte et un ensemble de
points. Lentte comprend pour chaque arc :
- le numro de larc,
- le sens de larc,
- le nombre de points de larc,
- le pointeur vers larc suivant,
- la fentre de larc, en coordonnes gographiques.
Les coordonnes des points de larc suivent lentte. Ils sont exprims en
longitude-latitude par rapport au point bas de la base.
On peut lire lensemble des objets dune relation en balayant son index, et pour
chaque entre de lindex, en balayant squentiellement les objets partir de
ladresse donne pour le premier objet de la feuille. On retrouve larc gomtrique
correspondant un objet par son pointeur dans le fichier des arcs. On peut
galement accder lensemble des arcs dune feuille grce au pointeur du premier
arc de la feuille, pointeur qui se trouve galement dans lindex.

164

Chapitre 5

Index
feuille i

feuille j

Objets de type ligne

x,y, ptrarc,v1,v2,...
x,y, ptrarc,v1,v2,...
....
x,y,ptrarc,v1,v2,...
x,y,ptrarc,v1,v2,...
....

Arcs gomtriques
iarc,isens,nbpt,ptr,xb,yb,xh,yh
x,y,.....,x,y
iarc,isens,nbpt,ptr,xb,yb,xh,yh
x,y,.....,x,y
iarc,isens,nbpt,ptr,xb,yb,xh,yh
x,y,.....,x,y
iarc,isens,nbpt,ptr,xb,yb,xh,yh
x,y,.....,x,y
.....
.....

5.5.2.2.4. Le type zone


Chaque zone est dcrite par un identifiant dobjet, par des attributs descriptifs et
par des arcs gomtriques dcrivant la frontire de la zone. Dans une feuille, les arcs
ne sont pas rpts : on conserve pour chaque arc le numro des deux zones
adjacentes. Pour reconstituer le contour dune zone, il est donc ncessaire de balayer
lensemble des arcs dune feuille pour retrouver les arcs qui appartiennent cette
zone. Les seuls arcs rpts sont donc les arcs qui sont frontires de zones
appartenant deux feuilles diffrentes.
La topologie dune zone nest pas constitue lors du processus dintgration de
la zone dans la base. La topologie est cre lors du processus de saisie ou
dimportation, grce au module SAVEDIT, que nous tudierons en dtail au
chapitre 7. Il est trs important que les objets dune feuille constituent un ensemble
topologiquement sans erreur : de nombreux contrles dintgrit sont dvelopps
dans SAVEDIT cet effet.
Cette mthode de description de la gomtrie dun ensemble de zones est trs
simple et facile grer, puisquelle ne ncessite pas la gestion du sens des arcs ou de
leur chanage. Le problme des les ou des zones incluses et imbriques ne se pose
pas . On privilgie ainsi la simplicit de la structure et de la reprsentation, au
dtriment de la simplicit des traitements ncessaires certaines fonctions.
Le type zone utilise trois fichiers : un fichier index, un fichier descriptif, un
fichier darcs. Le fichier index comprend pour chaque feuille :
- le nom de la feuille,
- lespace gographique occup par les objets de la feuille (point bas gauche,
point haut droit, en coordonnes gographiques),

De lobjet la collection dobjets 165


- le nombre dobjets zone de la feuille,
- ladresse du premier objet de la feuille dans le fichier descriptif,
- le nombre darcs utiliss pour dcrire la localisation des zones,
- ladresse du premier arc dans le fichier des arcs.
Le fichier descriptif comprend, pour chaque objet :
- le numro de la zone dans la feuille,
- la localisation du centrode de la ligne,
- la fentre minimale contenant la zone,
- les valeurs des attributs dans lordre dcrit par le schma de la base.
Le fichier des arcs comprend, pour chaque arc, un entte et un ensemble de
points. Lentte comprend pour chaque arc :
- le numro de la premire zone adjacente,
- le numro de la seconde zone adjacente. Si larc ne borde quune zone, ce
numro est 2. Si la zone adjacente appartient une autre feuille, ce numro est 19 (si
larc doit tre visible) ou 18 (si larc ne doit pas tre visible, comme dans le cas dun
dcoupage arbitraire en feuille par une ligne droite),
- le nombre de points de larc,
- le pointeur vers larc suivant,
- la fentre de larc, en coordonnes gographiques.
Les coordonnes des points de larc suivent lentte. Elles sont exprimes en
longitude, latitude par rapport au point bas de la base.

Index
feuille i
...
feuille j
...

Objets de type zone

nz,x,y,xb,yb,xh,yh,v1,v2,...
nz,x,y,xb,yb,xh,yh,v1,v2,...
....

nz,x,y,xb,yb,xh,yh,v1,v2,...
nz,x,y,xb,yb,xh,yh,v1,v2,...
....

Arcs gomtriques
nz1,nz2,nbpt,ptr,xb,yb,xh,yh
x,y,.....,x,y
nz1,nz2,nbpt,ptr,xb,yb,xh,yh
x,y,.....,x,y
nz1,nz2,nbpt,ptr,xb,yb,xh,yh
x,y,.....,x,y
nz1,nz2,nbpt,ptr,xb,yb,xh,yh
x,y,.....,x,y
.....
.....

166

Chapitre 5

5.5.2.2.5. Le type mosaque


Le type mosaque correspond aux images. A chaque relation correspond un
fichier dcrivant les paramtres de la relation (taille du pixel, projection
gographique, etc.), et chaque attribut de la relation correspondent deux fichiers :
un fichier index, correspondant au dcoupage en feuille (on parlera plutt
dimagettes dans le cas dune relation de type mosaque), et un fichier contenant la
valeur de chaque pixel prsent dans la relation, pour cet attribut. La structure de ce
type de relation sera tudie en dtail au chapitre suivant.
5.5.3. Intgration dobjets et de valeurs dattributs
5.5.3.1.La constitution dune relation
La constitution dune relation de la base de donnes se fait par intgrations
successives de groupes dobjets dans la relation. Pour les relations localises,
lintgration se divise en deux phases distinctes : la premire phase consiste crer
les objets en intgrant lattribut de localisation (saisi ou import dans le module
SAVEDIT) et un identifiant descriptif pour chaque objet. La seconde phase permet
dintgrer les valeurs descriptives des objets en utilisant lidentifiant comme attribut
de jointure. Ces valeurs descriptives peuvent provenir dun fichier classique ou
dune base de donnes relationnelle classique. Les valeurs des attributs des objets
sont alors lues dans ces fichiers et recopies dans la base savane.
Pour les relations localises, les objets intgrer sont regroups dans des
documents intgrer, correspondant en gnral une coupure de carte, ou un
espace gographique. Lide gnrale, cest davoir une relative homognit du
nombre dobjets par document, puisque chaque opration de cration dobjets
partir dun document cre une feuille, cest--dire une entre dans lindex
gographique. Ladresse des objets et la position gographique en deux dimensions
sont conserves pour chaque feuille et sont utilises lors de lexploitation de la base
comme indexation primaire, dans une structure squentielle indexe en deux
dimensions, comme nous lavons vu dans le paragraphe prcdent.
Le dcoupage de lespace en grille adaptative doit donc se faire lors de la
prparation de la saisie des donnes, bien avant lintgration des objets dans la base
de donnes.
5.5.3.2. Codage des valeurs des attributs descriptifs
Le codage des valeurs des attributs descriptifs dpend du type de lattribut.
Rappelons les types d'attribut descriptif grs par le systme SAVANE :
Nominal ou qualitatif : ceux qui prennent des valeurs nominales (une chane de
caractres).

De lobjet la collection dobjets 167


Ordinal : ceux qui prennent des valeurs nominales que l'on veut pouvoir
ordonner,
Entier : ceux qui prennent des valeurs numriques entires,
Rel : ceux qui prennent des valeurs numriques quelconques (comme un prix).
Couleur 8 bits, 16 bits, RVB : la valeur de l'attribut correspond au codage d'une
couleur. Avec 8 bits, on peut coder 256 couleurs, avec 16 bits 64000. Une couleur
RVB comprend un niveau de rouge, un niveau de vert, un niveau de bleu, chaque
niveau tant cod sur 8 bits (256 valeurs possibles pour chaque niveau, soit 16
millions de couleurs possibles).
Date : ceux qui prennent la valeur dune date,
Son : la valeur de l'attribut correspond la description d'un son,
image : la valeur de l'attribut correspond une image ou une collection
dimages (album de photographies, documents scanns,),
vido : la valeur de lattribut correspond une squence vido,
graphe : la valeur de l'attribut correspond la description d'un graphe en deux
dimensions.
Les valeurs des attributs nominaux sont codes en numrique : les valeurs
nominales sont conserves sur 16 caractres dans un fichier global, propre la base
de donnes (le fichier fpvaleurs). La valeur conserve dans le fichier de description
des objets est lindice relatif de la valeur dans ce fichier, par rapport la premire
valeur. Ladresse de la premire valeur dans le fichier fpvaleurs et le nombre de
valeurs diffrentes sont conservs dans le descriptif de lattribut, dans le fichier
base. Il est ainsi facile de connatre lensemble des modalits dun attribut nominal
et de rechercher une modalit sans avoir balayer lensemble des objets. Un
ensemble de modalits peut galement tre partag entre plusieurs attributs. Par
contre, la gestion de ce codage est plus complexe, surtout en cas de modification ou
dajout.
Tous les attributs numriques sont conservs sous forme numrique en double
prcision, directement dans le fichier descriptif de la relation.
Les couleurs (8, 16, 24 bits) correspondent uniquement un attribut dune
relation de type mosaque. Nous dtaillerons leur codage dans le chapitre suivant.
Les valeurs des attributs de type son, album dimages, vido, graphe conservent
des noms absolus de fichier, chaque valeur correspondant un fichier contenant
lobjet en question. Ainsi, la valeur dun attribut de type video pour un objet
(localis ou non) correspond au nom et lemplacement du fichier contenant la
video. Ces noms de 256 caractres sont en fait conservs dans un fichier global (le

168

Chapitre 5

fichier fpfichier), et la valeur de lattribut correspond ladresse du nom dans le


fichier global.
Il arrive souvent que la valeur dun attribut dun objet soit inconnue ou
indtermine. Nous avons donc dfini pour chaque type dattribut une valeur
spciale correspondant la valeur inconnue . Pour les attributs nominaux ou de
type son, album dimages, vido, graphe, on utilise la valeur 0. Pour les attributs
numriques, on utilise la valeur 1.e+30. La seule drogation cette rgle concerne
les attributs des mosaques cods sur 8 ou 16 bits : la valeur inconnue est 0, ce qui
nous obligera modifier les pixels de valeur initiale 0 pour quils ne soient pas
considrs comme des objets de valeur inconnue.
5.5.3.3. Lintgration graphique
Lintgration graphique (fig. 5.10) cre physiquement des enregistrements dans
le fichier des objets et dans le fichier des arcs (pour les types zone et ligne). Elle
calcule la fentre gomtrique de chaque objet, crit lenregistrement avec les
valeurs gographiques (centrode, fentre gomtrique) et tous les autres attributs
avec une valeur rserve correspondant la valeur inconnue (code 1e30). Une
fois les objets crs, lintgration graphique revient sur les objets pour intgrer la
valeur dune cl descriptive (attribut nominal cl des attributs descriptifs de la
relation). Pour les objets localiss, cette valeur a t saisie pour chaque objet lors de
la saisie graphique.
Lintgration graphique, lors de la cration des objets, ne fait que recopier dans
les fichiers de la relation les objets digitaliss qui sont regroups dans des
documents distincts. Ces documents sont constitus et dits grce au module
SAVEDIT du systme. Lintgration graphique neffectue aucune cration ni
contrle au niveau de la topologie des objets. Cette topologie est constitue et
vrifie lors de la saisie graphique. Nous tudierons en dtail dans le chapitre 7 le
module SAVEDIT et les diverses contraintes et contrles dintgrit lis lattribut
de localisation. Lindexation en feuille conserve le regroupement des objets
provenant des diffrents documents digitaliss : la topologie conserve donc
galement cette structure.
La seule difficult rside donc dans la gestion des relations graphiques entre
objets appartenant des feuilles diffrentes : connexit darcs, frontires entre zones
de feuilles diffrentes. Ces relations doivent tre gres lors de la saisie graphique
des objets. Le module SAVEDIT contient donc des procdures permettant de
joindre ou dunir des arcs appartenant des documents diffrents.

De lobjet la collection dobjets 169

fig. 5.10 : les dialogues de lintgration graphique

Une autre difficult apparat lorsque lon veut regrouper des objets appartenant
des feuilles diffrentes, car la structure en feuille et lorganisation de SAVANE ne
permet pas un objet davoir des arcs dans des feuilles distinctes.

170

Chapitre 5

Un identifiant descriptif, nominal, a t saisi pour chaque objet lors de la saisie


graphique. Cet identifiant est intgr comme valeur dun attribut nominal qui servira
ensuite de cl descriptive pour lintgration des valeurs des autres attributs. Les
principes de cette intgration sont les suivants :
- codage de la valeur nominale en numrique,
- criture de la valeur de chaque objet dans lattribut correspondant, dans le
fichier descriptif de la relation,
- criture des nouvelles modalits dans le fichier des valeurs nominales
(fpvaleurs) et actualisation des pointeurs et autres paramtres de lattribut dans le
dictionnaire de la base (fichier base).
Le codage de la valeur nominale se fait en plusieurs tapes :
- indexation des valeurs nominales dj existantes pour cet attribut,
- pour chaque objet, recherche de sa valeur dans lensemble des n valeurs dj
existantes. Si la valeur est trouve, le code correspond lindice de cette valeur dans
lensemble des valeurs de lattribut. Si la valeur nest pas trouve, on la rajoute aux
valeurs existantes et le code correspond n+1.
Ces procdures sont galement utilises lors de lintgration descriptive des
autres attributs nominaux, dcrite dans le paragraphe suivant. Nous verrons en dtail
un peu plus loin les classes regroupant ces procdures.
5.5.3.4. Lintgration descriptive
Lintgration descriptive intgre, pour chaque objet, la valeurs des attributs
descriptifs. Pour cela, on utilise la cl descriptive intgre lors de la cration des
objets, et qui sert de lien entre lobjet et les valeurs intgrer, qui sont en gnral
regroupes dans un fichier unique. Lutilisateur doit alors indiquer les
correspondances entre champs de fichier et attributs, ainsi que la mthode de
sparation de champs dans le fichier.
Lintgration dun attribut descriptif se fait en plusieurs tapes :
- si lattribut intgrer est nominal, codage de lattribut descriptif intgrer en
fonction des valeurs dj existantes pour cet attribut.
- codage du champ du fichier servant de cl de jointure, en fonction des valeurs
de lattribut nominal choisi comme cl de jointure et dj intgr dans la base. Le
systme signale ce niveau toute valeur nominale prsente dans le fichier mais non
prsente dans la base pour lattribut choisi comme cl de jointure.
- pour chaque objet de la relation, recherche dans le fichier dun enregistrement
ayant mme valeur pour la cl de jointure. Si aucun enregistrement nest trouv, la
valeur de lattribut intgrer reste inchange. Il est ainsi possible de modifier une

De lobjet la collection dobjets 171


partie seulement des objets intgrs : tout dpend des cls de jointure prsentes dans
le fichier.
- si lattribut intgrer est nominal, intgration des nouvelles modalits dans le
fichier des valeurs nominales (fpvaleurs) et actualisation des paramtres de lattribut
(nombre de modalits).
Pour les relations localises, on a en gnral plus dobjets que de valeurs de cl
descriptive, puisque par dfinition la localisation est une cl de chaque objet. Le
fichier descriptif peut ainsi avoir beaucoup moins denregistrements que le nombre
dobjet de la relation. Une carte des sols est un exemple classique : on peut avoir
graphiquement beaucoup de zones (connexes), mais peu de cls descriptives
distinctes.
Voici les diffrents dialogues (fig. 5.11) permettant dintgrer des valeurs
dattribut partir dun fichier ASCII :

172

Chapitre 5

fig. 5.11 : les diffrents dialogues de lintgration descriptive

De lobjet la collection dobjets 173


5.5.3.5. La classe CIndexAttribut
La classe CIndexAttribut encapsule lensemble des structures et oprations
ncessaires lindexation et la recherche dune valeur dans lensemble des valeurs
dun attribut nominal. On indexe sur les trois premiers caractres des valeurs en
utilisant un dcoupage en paquets lis lordre lexicographique. La recherche est
squentielle partir de chaque entre de lindex. Cette classe est utilise dans les
diffrents modules du systme (A.1.5.).
5.5.4. Savane : requtes et tats temporaires
5.5.4.1. Principe dune requte dans SAVANE
Nous avons vu dans le chapitre 2 (prsentation du systme SAVANE) les
principes de lexploitation dune base de donnes dans le systme SAVANE.
Rappelons rapidement ces principes.
Le document de base du logiciel SAVANE est une carte, cest--dire une feuille
de papier destine contenir une reprsentation graphique de donnes
gographiques. Cette feuille contient par dfaut un cadre gographique. Un cadre
gographique correspond au rsultat dune requte sur la base de donnes :
SAVANE utilise le principe de la requte pour linterrogation dune base de
donnes. Il faut enchaner les oprations, le rsultat de lune pouvant servir dentre
la suivante. Une interrogation, une requte, est donc compose dun ensemble
doprations que lon dclenche grce au menu principal, et que lon peut conserver
sous forme de macro-commande.
Un cadre peut donc tre vu comme une fentre sur la base de donnes contenant
un moment donn, un tat temporaire de la base correspondant une interrogation
et aux oprations effectues (calculs, cration de nouvelles variables, croisement et
jointure dobjets, etc.). Lorsquune relation est modifie, ses objets sont recopis
dans des fichiers temporaires qui sont physiquement stocks dans le rpertoire de
lutilisateur. La relation devient alors temporaire, et elle ne contient plus que les
objets se trouvant dans la fentre dtude lie au cadre. La structure des fichiers
temporaires lis aux relations temporaires est un peu diffrente de la structure des
fichiers de base (voir plus loin la classe CLecture). A chaque relation temporaire
peut correspondre quatre fichiers temporaires : un pour lindex (feuilles), un pour
les objets (descriptif), un pour les arcs, et un pour conserver une image matricielle
de la relation (voir paragraphe suivant). Des variables maintiennent le nom de ces
fichiers, qui sont librs automatiquement lorsque la relation est de nouveau
modifie, ou remise dans son tat initial. Des procdures globales
(FChoixFeuille(), FChoixDescriptif(), FChoixArc()) permettent de
connatre le premier fichier disponible pour chaque type (index, descriptif, arc).

174

Chapitre 5

La classe CSchema de SAVANE permet de dcrire ltat de la base de donnes


correspondant la requte effectue dans un cadre (A.2.1.2.). Par exemple, la
mthode Actualiser() permet de recharger le schma aprs une modification
externe du schma de la base (avec SAVATECA), tout en conservant ltat des
relations temporaires (modifies par la requte en cours).
Les oprations de manipulation de donnes sont implmentes dans des
fonctions globales qui prennent comme argument un objet de la classe CCadre (le
cadre sur lequel doit seffectuer lopration) ou CSchema (le schma du cadre sur
lequel doit seffectuer lopration) et lensemble des paramtres de lopration. Ces
paramtres sont en gnral crits dans un fichier (fpmenu) aprs dialogue avec
lutilisateur ou lecture dune macro-commande, et relus par la fonction dexcution
de commande. Ces fonctions modifient le schma qui reflte ainsi ltat de la base
aprs lexcution de la commande. Ainsi sont implmentes en particulier toutes les
fonctions relationnelles classiques (restriction, projection, jointure).
Par exemple, la fonction dexcution dune jointure entre deux relations dbute
par le code suivant :
void XQuestJointure(CCadre* pCadre)
{
HCURSOR hcurSave = ::SetCursor(LoadCursor(NULL, IDC_WAIT));
//--- jointure entre deux relations
CSchema* pSchema=pCadre->GetSchema();
CWind* pWind=pCadre->GetWind();
int i,j,k,iNothEmetteur1,iNothEmetteur2;
int iNoattCleEmetteur1,iNoattCleEmetteur2;
int iNbAttributsEmetteur1,itabNoattEmetteur1[NB_MAX_ATTRIBUTS];
int iNbAttributsEmetteur2,itabNoattEmetteur2[NB_MAX_ATTRIBUTS];
int iJointure;
char chNomRelation[_MAX_PATH];
//--- lecture des paramtres
FILE* FileMenu=fopen(base.m_chNomFtmp,"rb");
fscanf(FileMenu,"%d%*c",&iNothEmetteur1);
fscanf(FileMenu,"%d%*c",&iNoattCleEmetteur1);
fscanf(FileMenu,"%d%*c",&iNbAttributsEmetteur1);
for(i=0;i < iNbAttributsEmetteur1;i++)
{
fscanf(FileMenu,"%d%*c",&itabNoattEmetteur1[i]);
}
fscanf(FileMenu,"%d%*c",&iNothEmetteur2);
fscanf(FileMenu,"%d%*c",&iNoattCleEmetteur2);
fscanf(FileMenu,"%d%*c",&iNbAttributsEmetteur2);
for(i=0;i < iNbAttributsEmetteur2;i++)
{
fscanf(FileMenu,"%d%*c",&itabNoattEmetteur2[i]);
}
fscanf(FileMenu,"%d%*c",&iJointure);
fgets(chNomRelation,_MAX_PATH,FileMenu);
fclose(FileMenu);
.

5.5.4.2. Dfinition et gestion des macro-commandes


Une macro-commande permet de conserver tous les paramtres ncessaires
lexcution dune ou de plusieurs commandes, indpendamment du schma sur

De lobjet la collection dobjets 175


lequel cette commande doit seffectuer. On peut ainsi conserver des parties dun
traitement complexe pour les excuter de nouveau plus tard, ou les conserver dans la
structure de la base de donnes comme des mthodes.
Lors dune requte, toutes les oprations sont conserves dans une macrocommande spciale, attache au cadre et conserve dans la structure du cadre de la
carte. Cette macro-commande nest rinitialise que si lutilisateur revient ltat
initial de la base. Elle permet dexcuter de nouveau la squence doprations
effectue dans le cadre depuis la dernire initialisation du cadre. Cette opration est
particulirement importante dans le cas o la base est modifie de faon externe, car
elle permet de ractualiser le rsultat de la requte.
Les macro-commandes sont conserves dans un rpertoire de lutilisateur. La
classe CMacro de SAVANE permet dencapsuler toutes les oprations ncessaires
la gestion des macro-commandes (A.2.1.4.).
5.5.5. La classe Clecture
La classe CLecture de SAVANE encapsule lensemble des procdures de
lecture et dcriture des relations de la base de donnes, quelles soient permanentes
ou temporaires (A.2.1.3.). La mthode Lire() de cette classe est utilise en
permanence pour lire les valeurs des objets dune relation, en utilisant le code
suivant :
CLecture lecture;
if(lecture.Open(pCadre,iNoth))
{
int i=lecture.Lire(v);
while(i != -1)
{
if(i == 1)
{
//--- traitement de lobjet
}
i=lecture.Lire(v);
}
lecture.Close();
}

Pour accder un attribut dune relation non temporaire, il faut rechercher le


numro interne de lattribut, partir de son numro externe iNoAttrExterne qui
provient du dialogue avec lutilisateur. Le numro interne est conserv dans la
variable membre m_iNumero de CAttribut (A.2.1.1.) :
iNoAttrInterne=pSchema->m_pRelations[iNoRel]->m_pAttributs[iNoAttrExterne]->m_iNumero ;

Cette indirection nest plus ncessaire lorsque la relation est temporaire, car les
valeurs des attributs de la vue externe sont rcrites dans lordre de la vue, comme
nous le verrons dans les paragraphes suivants. On a alors toujours
iNoExterne=iNoInterne.

176

Chapitre 5

5.5.6. SAVANE : les structures internes


5.5.6.1. Vecteur et raster
Comme nous lavons vu prcdemment, la localisation est conserve dans le
systme SAVANE sous forme vectorielle pour les objets de type zone, ligne ou
point, avec la prcision inhrente la dfinition smantique des objets. Par contre, le
systme cre une matrice raster pour la rsolution rapide de certaines oprations
impliquant des relations zonales ou des masques, lorsque la prcision de cette
matrice est suffisante pour lopration en question, ainsi que pour amliorer les
temps daffichage sur cran ou pour rechercher les valeurs dun objet en le
dsignant sur lcran. Cette opration de rasterisation est transparente pour
lutilisateur.
De nombreuses oprations peuvent ainsi tre effectues sans avoir reconstituer
le chanage des arcs en polygone, ou sans avoir se proccuper du problme des
zones incluses. Cette opration de rasterisation cre une image, chaque pixel tant
cod avec lindice de lobjet dans le fichier descriptif. On peut ainsi retrouver trs
rapidement la valeur des attributs dun point appartenant une zone, sans avoir
recrer le contour de la zone et tester lappartenance du point la zone partir de
ses arcs frontire.

Objets de type zone

nz,x,y,xb,yb,xh,yh,v1,v2,...
nz,x,y,xb,yb,xh,yh,v1,v2,...
....

nz,x,y,xb,yb,xh,yh,v1,v2,...
nz,x,y,xb,yb,xh,yh,v1,v2,...
....

fig. 5.13 : structure de limage raster associe une relation zonale

La rasterisation est effectue dans la fentre dtude, et ractualise chaque


changement de fentre dtude et chaque modification du fichier descriptif de la
relation. La dfinition de limage matricielle cre est un paramtre du systme
(habituellement fix entre 1600 et 3000). Dans la plupart des cas, cette rsolution

De lobjet la collection dobjets 177


offre une prcision suffisante. La prcision absolue dpend bien sr de la taille de la
fentre dtude : plus la fentre est grande, plus la taille du pixel rsultant de la
rasterisation sera petite. Le systme conserve cette image dans un fichier
temporaire, li la relation, et qui est dtruit lors de la rinitialisation de la requte,
la rinitialisation de la relation, le changement de la fentre dtude, ou le
changement de projection gographique.
Lavantage dune reprsentation matricielle rside dans la simplicit de la
structure, et dans le fait que lensemble des relations peuvent ainsi tre compares
pixel par pixel, puisque, dans une fentre donne, diffrentes rasterisations vont
crer des pixels gomtriquement identiques. Si lutilisateur le souhaite, il peut
galement conserver la reprsentation matricielle dun attribut dans une nouvelle
relation, dont le type ne sera plus zone, ligne, point, mais raster. Ainsi, cette
nouvelle relation nomme raster, toujours temporaire, pourra contenir, sous forme
matricielle, des attributs provenant de toutes les relations de la base, et sur lesquelles
on pourra appliquer trs facilement de nombreuses mthodes danalyse
(comparaison, calculs, etc.). Cette relation temporaire raster sapparente ainsi aux
systmes qui conservent la localisation sous forme matricielle, mais avec lavantage
davoir une taille de pixel variable, choisie par lutilisateur, et une localisation
provenant de donnes fiables conserves avec toute leur prcision sous forme
vectorielle. Cette particularit fait de SAVANE un systme double structure
interne raster-vecteur, vecteur pour le stockage des objets, raster pour la rsolution
oprationnelle de certaines oprations danalyse spatiale.
Cette proprit ne doit pas tre confondue avec la gestion et le traitement des
relations de type mosaque, dont les objets sont galement des pixels mais dont la
taille ne varie pas et est fixe par la dfinition smantique de la relation. Par contre,
une relation de type mosaque peut galement apporter un attribut la relation raster
(dans ce cas, lopration de conversion nest plus une rasterisation mais un rchantillonage, voir chapitre 6). Elle ne doit pas non plus tre confondue avec la
possibilit de crer une relation vectorielle zonale dont les objets sont des mailles
(carre, hexagonale) que nous verrons au chapitre 8.
La reprsentation matricielle dune relation zonale permet galement dacclrer
la visualisation des zones par plage sur un cran : il suffit deffectuer un rchantillonage de cette image en fonction de la taille du pixel de lcran, plutt
quun chanage des arcs en contours de taches et un remplissage de chaque tache,
avec le problme toujours dlicat des trous et des zones incluses. Pour une question
de performance, cette reprsentation matricielle temporaire est donc presque
indispensable lorsque la reprsentation de la localisation des zones utilise le mode
topologique (frontires), comme cest le cas dans le systme SAVANE.

178

Chapitre 5

5.5.6.2. Un algorithme de rasterisation


Lopration de rasterisation tant effectue de faon automatique en tche de
fond et chaque modification de la relation, lalgorithme utilis pour passer dune
description vectorielle une reprsentation matricielle doit tre trs efficace. Nous
en prsentons ici les principes et la ralisation.
Lalgorithme est bas sur le principe des algorithmes YX de rasterisation dune
zone (un point de lintrieur dune zone est caractris par un nombre impair
dintersections prcdents le point, le long dune droite horizontale coupant le
contour de la zone). Cet algorithme est tendu la rasterisation simultane de
plusieurs zones. Il comprend trois phases principales :
- calculs des points dintersection des arcs avec des lignes horizontales spares
dun pixel. La taille du pixel correspond la rsolution de la matrice obtenir.
- tri des points dintersection en Y, puis en X sur chaque ligne,
- pour chaque ligne du balayage, dtermination de lobjet zone compris entre
deux points dintersection conscutifs.
Le calcul des points dintersection des arcs doit grer avec prcision les
segments horizontaux, ne pas prendre en compte, ainsi que les extrmits des
segments qui ne doivent pas tre dupliqus. La mthode de tri des points doit tre
efficace.
Chaque arc des zones ayant une intersection avec la fentre dtude est dcoup
en segments de droite, en reprenant directement les points reprsentant larc.
Chaque segment est orient (du bas vers le haut, et de gauche droite), les segments
horizontaux sont carts, puis les intersections avec les lignes du balayage sont
calcules et stockes par insertion (sur Y, puis sur X) dans une structure qui
conserve galement pour chaque point le numro des zones adjacentes de larc, ou
la valeur dun attribut nominal de chaque zone adjacente. Le segment est cart si
les deux valeurs adjacentes sont identiques. On obtient donc pour chaque ligne une
liste des points dintersection se trouvant sur la ligne, trie par ordre croissant sur les
abscisses. On dtermine ensuite pour chaque point le code entrant et le code sortant,
en fonction du nombre de points dintersection confondus en chaque point
dintersection.
Cet algorithme, comme tous ceux de sa catgorie, exige une topologie sans
faille : une zone ouverte cre une erreur dans la rasterisation et fait dborder la
zone sur la zone adjacente.
Nous avons construit plusieurs classes pour mettre en uvre cet algorithme : une
classe CCellule, qui permet de stocker chaque point dintersection et le chaner
avec le point suivant, et une classe CYX, qui permet de connatre ladresse de la
premire cellule pour chaque ligne (membre m_Y) et qui regroupe les procdures de

De lobjet la collection dobjets 179


calcul des points dintersection (Points()), dinsertion des
(InsererCellule()), et de calcul du balayage (YX()) (A.2.2.2.).

cellules

Limage qui rsulte de la rasterisation est stocke dans un fichier sous forme
compresse, en utilisant une compression simple par segments horizontaux
permettant de regrouper les pixels contigus de mme valeur.
Lopration duale, permettant de passer dune image une reprsentation
vectorielle des zones, correspond une opration de vectorisation. Cette opration
sera utilise par exemple pour retrouver une reprsentation vectorielle aprs
traitement sur une reprsentation raster de la localisation. Nous prsenterons au
chapitre 8 lalgorithme de vectorisation dvelopp dans le systme SAVANE.
5.5.7. Les masques
5.5.7.1. La structure dun masque
Comme nous lavons vu plus haut, un masque correspond un domaine de
lespace. Chaque masque est reprsent par une double structure, une image raster
et un ensemble darcs qui correspondent aux contours du domaine. Limage raster
est cre la dfinition interne du systme (la dfinition de rasterisation) suivant la
projection gographique utilise, et est stocke sous forme dune image compresse
forme de 0 (hors du domaine) et de 1 (dans le domaine). Les arcs sont conservs
sous forme vectorielle, en coordonnes gographiques dans le datum de la base de
donnes. La structure du fichier est identique celle des fichiers des arcs dune
relation zonale. Chaque masque possde galement un fichier qui le dcrit (fentre
minimale, nombre darcs, taille du pixel de limage raster associe, etc.).
Toute modification de la fentre dtude ou de la projection gographique
implique la cration dune nouvelle image raster partir des arcs, par rasterisation.
On utilise lalgorithme de rasterisation que nous avons vu plus haut, simplifi,
puisquil ny a ici quune seule zone traiter. Dans la majorit des cas, les
traitements faisant intervenir un masque utiliseront la reprsentation matricielle du
masque.
5.5.7.2. Cration dun masque : zone tampon ou dfinition sur cran
Un masque peut tre cr principalement de deux faons : par saisie directe sur
cran ou partir des objets dune relation.
La saisie directe sur cran ne pose pas de problmes particulier : les contours du
masque sont saisis sur lcran, polygone par polygone. Les coordonnes sont
conserves en longitude-latitude, aprs avoir t transformes partir des

180

Chapitre 5

coordonnes cran (coordonnes cran carte cadre gographique). Limage


matricielle est calcule directement partir des contours.
La dfinition dun masque partir des objets dune relation est plus complexe,
surtout lorsque lon fait intervenir une distance : le masque correspond alors au
domaine de lespace se trouvant au maximum telle distance des objets de la
relation (appel alors zone tampon, ou encore buffer) (fig. 5.14). Pour la cration de
ce type de masque dans SAVANE, on va dabord crer limage matricielle
correspondante, et lon obtiendra les arcs par vectorisation de limage. Lalgorithme
de cration dpend du type de la relation utilise : pour une cration partir de
points, on remplit limage autour de chaque point en utilisant un disque de la taille
du tampon. Pour une cration partir de lignes, on applique ce disque autour de
chaque point provenant du dessin des ligne dans limage raster. Pour une cration
partir de zones, en utilisant limage de la relation ligne par ligne : on applique ce
mme disque sur les extrmits de chaque segment horizontal de limage, en
joignant les deux disques par un rectangle.

fig. 5.14 : la cration dun masque partir des points dune relation et dune distance ces
points

De lobjet la collection dobjets 181


5.5.7.3. Lalgbre des masques
De nombreuses oprations peuvent tre appliques aux masques dans SAVANE.
Il sagit dopration unaires (inverser, roder, dilater) et doprations binaires
(intersection, union, union exclusive, diffrence). Toutes ces oprations utilisent la
reprsentation matricielle du masque, et sont simples mettre en uvre. Seule la
dilatation demande quelque effort algorithmique, nous utilisons ici la mthode
prsente pour crer un masque avec une distance. Lrosion correspond une
dilatation de linverse du masque.
Grce ces oprations, nous pouvons obtenir des domaines de lespace
correspondant de nombreuses situations gographiques. Par exemple, dans la
figure 5.15, le domaine en bleu dans le cadre correspond la zone se trouvant plus
de trois cent mtres mais moins de cinq cent mtres dun htel. Il a t obtenu par
diffrence entre deux masques :

Fig. 5.15 : un masque rsultat de la diffrence de deux masques

Les masques sont conservs dans le rpertoire de lutilisateur. Ils peuvent donc
tre utiliss dans toutes les cartes construites par cet utilisateur.

182

Chapitre 5

5.5.8. La ralisation des oprations relationnelles classiques


5.5.8.1. La restriction
La restriction dune relation correspond la slection dobjets de la relation sur
un critre descriptif. La condition de slection peut porter sur plusieurs attributs :
elle utilise une formule logique qui est ensuite vrifie pour chaque objet (fig. 5.16).
Si un objet rpond la condition, il est conserv et recopi dans ltat temporaire de
la relation. A la fin de lopration, la visualisation de la relation doit tre actualise
pour reflter ce nouvel tat.

fig. 5.16 : dialogue de restriction par formule

Lopration de slection utilise un calculateur permettant de vrifier la syntaxe


de lexpression et de calculer sa valeur pour un objet. Nous avons dvelopp une
classe CCalculateur pour encapsuler lensemble de ces oprations (A.2.1.5.). La
procdure de slection scrit alors de faon trs simple :
//--- initialisation de la lecture
int iNoFichier=pSchema->FchoixDescriptif();
if(iNoFichier == -1)return;
CLecture lecture;
if(lecture.Open(pCadre,iNoth,iNoFichier,0))
{
//--- lecture des objets
float v[NB_MAX_ATTRIBUTS],fResultat;
float vprim[NB_MAX_ATTRIBUTS];
i=lecture.Lire(v);
while(i != -1)

De lobjet la collection dobjets 183


{
if(i == 1)
{
fResultat=(float) calculateur.Calcul(chFormule,v);
if(fResultat != 0 && fResultat > FINCONNU)
{
iNbObjets++;
if(pSchema->m_pRelations[iNoth]->m_iType < 10)
{
for(i=1;i <= iNba;i++)vprim[i]=v[tabp[i]];
lecture.Ecrire(vprim);
}
else lecture.Ecrire(v);
}
}
i=lecture.Lire(v);
}
lecture.Close();
//--- mise a jour de la relation
pSchema->m_pRelations[iNoth]->m_iNbObjets=-1;
if(pSchema->m_pRelations[iNoth]->m_iType < 10)
{
pSchema->m_pRelations[iNoth]->m_iType+=10;
pSchema->m_pRelations[iNoth]->m_iNoFichDescriptif=iNoFichier;
pSchema->m_iFdisDescriptif[iNoFichier]=1;
for(i=1;i <= pSchema->m_pRelations[iNoth]->m_iNba;i++)pSchema->m_pRelations[iNoth]>m_pAttributs[i]->m_iNumero=i;
pCadre->GetDlgStatExplorateur()->MiseAJour(iNoth);
}
else
{
int iNo=pSchema->m_pRelations[iNoth]->m_iNoFichDescriptif;
unlink(pSchema->m_chFprovDescriptif[iNo]);
pSchema->m_pRelations[iNoth]->m_iNoFichDescriptif=iNoFichier;
pSchema->m_iFdisDescriptif[iNoFichier]=1;
pSchema->m_iFdisDescriptif[iNo]=0;
//--- suppression de l'image si type 24
if(pSchema->m_pRelations[iNoth]->m_iType == 24)
{
pSchema->m_pRelations[iNoth]->m_iType=14;
int iFim=pSchema->m_pRelations[iNoth]->m_iNoFichImage;
pSchema->m_iFdisImage[iFim]=0;
}
//--- actualisation de l'explorateur cartographique
if(pCadre->GetExplorateur()->IsRelationInside(iNoth))
{
pCadre->Effacer();
carte.TracerUnCadre(pCadre);
}
}

La restriction sur un attribut nominal peut galement tre effectue en indiquant


uniquement les modalits de lattribut conserver. Le dialogue est alors diffrent, et
la restriction ne porte que sur un attribut (fig. 5.17).
Aprs avoir retrouv et conserv le code interne des modalits slectionnes, la
relation est restreinte en ne conservant que les objets correspondant ces valeurs. Le
principe de limplmentation est identique la slection par formule.

184

Chapitre 5

fig. 5.17 : dialogue de restriction sur un attribut nominal

5.5.8.2. La jointure
La jointure de deux relations correspond la restriction du produit cartsien des
deux relations sur un critre descriptif. Le rsultat est une relation non localise,
quel que soit le type des deux relations initiales. Une nouvelle relation non localise
est cre, elle contient les objets rpondant au critre de jointure. Les attributs
proviennent des deux relations initiales.
Si lon veut conserver la localisation de lune des relations initiales, il faut tre
sr de ne pas dupliquer les objets lors de la jointure. Cest pour cela que nous avons
dvelopp une autre opration, appele union, qui sapparente une jointure avec
les diffrences suivantes :
- un objet de la premire relation est conserv dans la relation rsultante si il
rpond au critre de jointure avec au moins un objet de la seconde relation ;
- la valeur des attributs provenant de la seconde relation correspond la valeur
des attributs du premier objet trouv dans la seconde relation satisfaisant au critre
de jointure.
Cette opration est notamment trs utile lorsque le critre de jointure est une
galit (qui-jointure) et quil porte sur une cl de la seconde relation, car lon sait

De lobjet la collection dobjets 185


alors que le rsultat de la jointure ne cre pas de doublons : au maximum un seul
objet de la seconde relation pourra tre mis en relation avec un objet de la premire
relation. Le rsultat dune union est alors identique au rsultat dune jointure, mais
permet de conserver la localisation de la premire relation.
Limplmentation de cette opration dans le systme SAVANE est donne dans
lannexe A.2.5.1.
5.5.9. La ralisation des oprations relationnelles tendues
5.5.9.1. La restriction spatiale
La restriction spatiale correspond la slection dobjet sur un critre de
localisation. Le systme SAVANE permet deffectuer des restrictions spatiales par
rapport une fentre gographique rectangulaire (fentre de travail) et des domaines
de lespace dfinis sous forme de masques. Lopration de slection recopie les
objets slectionns dans un nouveau fichier descriptif temporaire. Si la relation est
visualise dans le cadre, le dessin est automatiquement ractualis. Pour les types
zone et ligne, le fichier des arcs nest pas modifi, sauf dans le cas dune restriction
par domaine avec redfinition de la localisation, comme nous allons le voir un peu
plus loin.
5.5.9.1.1. La restriction spatiale par fentre dtude
Chaque cadre, correspondant une requte, possde une fentre de travail. Quel
que soit lopration effectue dans le systme, une restriction spatiale sera
automatiquement effectue dans cette fentre. Pratiquement, le systme utilise
lindexation spatiale en feuille et naccde quaux feuilles qui ont une intersection
non vide avec la fentre de travail. Ensuite, il naccde quaux objets dont la fentre
a une intersection non vide avec la fentre de travail. Lindexation spatiale et la
fentre dtude permettent damliorer considrablement les performances du
systme, lors de linterrogation des donnes.
Lors de la cration du cadre, cette fentre correspond lespace gographique
donn lors de la dfinition de la base. On peut changer cette fentre par de
nombreuses mthodes : coordonnes gographiques, coordonnes de projection,
espace occup par les objets dune relation, choix sur cran, dplacement, etc.
Chaque changement de fentre implique normalement une rinitialisation de la
requte. Cette rinitialisation doit tre faite par lutilisateur lui-mme.
5.5.9.1.2. La restriction spatiale par domaine
La restriction spatiale par domaine utilise un masque. Pour une relation, elle
permet de slectionner les objets se trouvant dans ou hors du domaine reprsent par

186

Chapitre 5

le masque. Cette restriction ne pose pas dambigut pour les objets de type point.
Par contre, pour les types ligne ou zone, il faut choisir entre une restriction
ensembliste ou une restriction spatiale. On a donc le choix entre une slection par
centrode (slection de lobjet si son centrode se trouve dans le masque), une
slection ensembliste (slection de lobjet si lintersection avec le masque est non
vide), et une slection avec redfinition de la localisation de lobjet (slection de
lintersection).
La slection par centrode ne pose aucune difficult de ralisation. On utilise la
reprsentation matricielle du masque pour tester lappartenance du centrode au
masque, en testant dans le masque la valeur du pixel correspondant la localisation
du centrode de lobjet.
La slection ensembliste est un peu plus complexe. Pour les zones, on utilise la
reprsentation matricielle de la relation et du masque, ce qui permet de comparer les
images pixel par pixel et tester lintersection dune zone avec le masque. On
conserve la zone si lintersection est non vide. Pour les lignes, on teste directement
lintersection de la ligne avec le masque en calculant dans le repre matriciel du
masque les pixels correspondant la ligne.
La slection de lintersection est un peu plus difficile mettre en uvre,
puisquelle impose une redfinition de la gomtrie des objets rsultants de
lopration. Pour les relations de type zone, deux mthodes sont disponibles pour
cette opration : une mthode rapide en raster, une mthode plus longue mais plus
prcise en vecteur. La mthode raster utilise la reprsentation matricielle de la
relation et du masque : la comparaison pixel par pixel est rapide et permet dobtenir
rapidement une image de la relation qui ne conserve que les pixels correspondant
la valeur 1 du masque. Cette image est ensuite balaye pour obtenir la liste des
objets existants et crer le nouveau fichier descriptif partir de lancien. Enfin,
limage est vectorise pour crer un nouveau fichier darcs correspondant aux
contours de ces nouvelles zones. La mthode vectorielle utilise directement les arcs
en calculant les intersections des arcs des zones avec les arcs du masque. Les zones
sont ensuite reconstitues partir des bouts ainsi forms. Lalgorithme classique
dintersection darcs segment par segment est utilis (voir chapitre 3). Il est
fortement acclr par la prise en compte de la fentre des arcs, qui permet
dliminer de nombreuses comparaisons inutiles.
5.5.9.2. Les jointures spatiales
Limplmentation des jointures spatiales dpend du type des deux relations et de
la qualification de jointure. Les seules jointures qui ne font pas perdre la localisation
sont les jointures avec une qualification d(O1,O2) = 0, le type du rsultat
correspondant alors celui de lintersection des objets. Ainsi, le rsultat dune
jointure zone-zone avec une qualification d(O1,O2) = 0 est une relation de type

De lobjet la collection dobjets 187


zone : les objets correspondent aux intersections des objets des deux relations. Le
rsultat dune jointure zone-point est une relation de type point, et le rsultat dune
jointure zone-ligne est de type ligne.
Comme pour les restrictions de domaine, deux mthodes sont disponibles pour la
ralisation des jointures spatiales lorsque lune des relations est de type zone. La
mthode raster compare les images des relations, limage de la relation rsultante
correspondant lintersection des deux images (fig. 5.18). Chaque zone du rsultat
rcupre les attributs des deux zones initiales. Limage du rsultat est vectorise
pour crer les contours des arcs correspondant aux zones de la jointure.

188

Chapitre 5

fig. 5.18 : une qui-jointure spatiale zone-zone

La ralisation de la jointure se droule ainsi en plusieurs phases :


- cration dune nouvelle image par calcul pour chaque pixel dun code rsultant
des valeurs du mme pixel dans les images des deux relations initiales,
- cration des tuples descriptifs correspondant aux combinaisons rencontres
dans la premire phase (ce qui revient liminer les tuples descriptifs en double),
- tablissement de la relation image-tuples,
- vectorisation de limage.
On trouvera en annexe le code de la procdure dqui-jointure gomtrique entre
deux relations de type zone, mthode raster (A.2.5.2.).
La mthode vectorielle cre les intersections de zones partir des arcs de
lensemble des zones initiales, puis cre les tuples descriptifs correspondant aux
objets graphiques ainsi crs.
Certaines jointures zone-zone crent de nombreuses petites zones qui nont pas
de sens smantique car elles proviennent uniquement des diffrences de prcision de
la reprsentation gomtrique et peuvent tre considres comme des artefacts. On

De lobjet la collection dobjets 189


peut supprimer ces zones parasites en liminant dans la nouvelle relation les zones
de trop petite taille, ou celles dont le rapport primtre/surface est trop faible.
5.5.9.3. Les semi-jointures spatiales
Pour viter la perte de la localisation de lune des deux relations, nous avons
dvelopp dans le systme SAVANE plusieurs procdures qui sont des semijointures gomtriques suivies dune agrgation des valeurs descriptives sur la cl
de localisation initiale. De mme, nous avons dvelopp des semi-jointures
classiques qui vitent les doublons dobjets gographiques. Ces oprations, lies
lanalyse spatiale, seront prsentes au chapitre 8.
5.5.10. La connexion dautres systmes de gestion de base de donnes
Le systme SAVANE dispose de son propre moteur de base de donnes
relationnel tendu, qui lui permet de grer de manire optimale les donnes
localises. La plupart des SIG ne fonctionnent pas de cette manire : ils utilisent un
systme relationnel classique pour grer les attributs descriptifs et ne grent que
linformation de localisation des objets.
Ces deux approches ont leurs avantages et leurs inconvnients. Les avantages
sont vidents : on dispose de la puissance et de la fiabilit des SGBD relationnels
commerciaux. Les inconvnients sont galement nombreux : toute opration
ncessite lunion des objets gr par le SIG et ceux, non localiss, grs par le
SGBD classique. Une requte un peu complexe demande donc plusieurs aller et
retour entre les deux systmes, lorsque cela est possible.
Nous avons dvelopp dans SAVANE une solution qui permet de bnficier des
avantages des deux systmes : des attributs descriptifs peuvent tre imports des
principaux SGBD relationnels (via ODBC, DAO, ou ADO) temporairement dans le
SGBD directement gr par SAVANE. Si limportation est temporaire, les attributs
ne sont utiliss que lors de la requte, mais une fois imports, ils sont considrs
comme les autres attributs et grs directement par le systme. Il ny a donc quune
seule connexion au SGBD externe. Cette particularit fait de SAVANE
virtuellement un SGBD double moteur de gestion : un moteur interne bas sur une
indexation primaire bidimensionnelle, et le moteur externe du systme externe
associ.
5.6. Conclusion
Lextension du modle relationnel au donnes localises constitue le premier
objectif de notre travail : bnficier de la simplicit et de la puissance du modle

190

Chapitre 5

relationnel pour la gestion des donnes gographiques. Nous avons ainsi dfini de
nouvelles oprations permettant dtendre lalgbre relationnelle sur lattribut de
localisation. Ces oprations utilisent la structure mtrique et la distance euclidienne
pour tendre les oprations classiques de lalgbre relationnelle (restriction,
projection, jointure) . Dautres oprations pourraient ainsi tre dfinies, en utilisant
la structure ensembliste (inclusion, intersection, appartenance) ou la structure
topologique (relations dadjacence, par exemple).
La jointure spatiale tend formellement lopration classique de jointure de
lalgbre relationnelle, mais la validit de son emploi savre beaucoup dlicate que
dans le cas classique, o lopration ne prsente aucune ambigut. En effet, comme
nous lavons vu au chapitres 3 et 4, lattribut de localisation na pas toujours la
mme prcision et la mme validit. Lopration de jointure telle que nous lavons
dfinie ignore ces diffrences. Elle est donc peu adapte de nombreuses situations,
surtout lorsque la jointure implique des relations dont limplantation spatiale na pas
le mme degr de validit. Pour construire un systme performant, il nous faudra
donc introduire de nouvelles oprations permettant de rsoudre ces problmes de
transfert dchelle et de mise en relation dobjets de prcision gographique
diffrentes. Ces oprations sont pratiquement toutes apparentes une jointure
spatiale suivi dune opration de regroupement, mais nous les prsenterons dans le
chapitre 8 consacr lanalyse spatiale : plus que des oprations de gestion, elles
utilisent une mise en relation sur la localisation plus pour rsoudre des problmes
danalyse que pour rpondre un besoin de bonne gestion de donnes.

De lobjet la collection dobjets 191

Bibliographie

[ABI 95] ABITEBOUL S., HULL R., VIANU V., Foundations of Databases, 1995, AddisonWesley
[BER 93] BERTINO E., MARTINO L., Object-Oriented Database Systems, 1993, AddisonWesley
[DAT 95] DATE C.J., Introduction to Database Systems, 1995, Addison-Wesley
[DAV 91] DAVID B., Modlisation, reprsentation et gestion dinformation gographique,
une approche en relationnel tendu, Thse de doctorat, 1991, Universit Paris VI
[DEL 91] DELOBEL C., LECLUSE C., RICHARD P., Bases de donnes : des systmes relationnels
aux systmes objets. 1991, InterEditions, Paris
[EGE 91] ENGENHOFER M., Spatial Query langages. Thse de doctorat, 1991, University of
Maine, USA
[FLO 93] DE FLORIANI L., MARZANO P., PUPPO E., Spatial Queries and Data models, in Frank
A. and Campari I.U., Spatial Information Theory, Lecture Notes in Computer Sciences 716,
1993, Springer-Verlag, p. 113-138
[GAR 83] GARDARIN G., Bases de donnes : les systmes et leurs langages, 1983, Eyrolles,
paris
[GRE 89] GREENE D., Implementation and Performance Analysis of Spatial Data Access
Methods, IEEE, Intl. Conference on Data Engineering, 1989, p.606-615
[GUN 89] GNTHER O., Efficient Computation of Spatial Joins. IEEE, Intl. Conference on
Data Engineering, 1989, p.50-59
[GUT 88] GTING R.H., Geo-Relational Algebra : A Model and Query Language for
Geometric Database System, Proccedings of Intl. Conference on Extending Database
Technology, 1988, p. 506-527

192

Chapitre 5

[HAS 82] HASKIN R.L. AND LORIE R.A., On extending the functions of a relational database
system. Association for Computing Machinery, Proccedings of SIGMOD, NY : ACM Press,
1982, p. 207-212
[LAR 93] LARUE T., PASTRE D., VIMONT Y., Strong Integration of Spatial Domains and
Operators in a Relational Database System, Intl. Symposium on Large Spatial Databases,
LNCS n 692, 1993, p. 53-72, Springer-Verlag
[LAU 93] LAURINI R., MILLERET-RAFFORT F., Les bases de donnes en gomatique, Herms,
1993, Paris
[LOR 84] LORIE R.A., MEIER A., Using a Relational DBMS for Geographic Databases.
GeoProcessing, 1984, p.243-257
[NEW 79] W. M. NEWMAN, R.F. SPROULL, Principles of Interactive Computer Graphics,
1979, Mc Graw Hill
[OOI 89] OOI B.C., SACK-DAVIS R., MC DONELL K.J., 1989, Extending a DBMS for
Geographic Applications, Intl. Conference on Data Engineering, p. 590-597
[PAV 82] PAVLIDIS T., Algorithms for Graphics and Image Processing, Computer Science
Press, 1982
[SAM 80] SAMET H., Tree Structure for region representation, Aangeenbgug, Autocarto 4,
vol. 1, 1980, pp 108-118
[SOU 86] SOURIS M., Systmes dinformation gographique et bases de donnes, Colloques
et Sminaires, Traitement des donnes localises, 1986,Editions de lOrstom
[SOU 87] SOURIS M., A Geographic Information System with relational architecture :
principles and example of use. in Primera conferencia sobre informatica y geografia, San
Jose, Costa Rica, 1987, pp 703-728
[ULL 88] ULMANN J.D., Principles of Database and Knowledge-Base Systems, 1988,
Computer Science Press
[WOR 90] WORBOYS M.F., HEARNSHAW H.M., MAGUIRE D.J., Object-Oriented data
Modelling for Spatial Databases, International Journal of Geographic Information Systems,
1990, vol. 4, p. 369-383

De lobjet la collection dobjets 193

Chapitre 6

Go-rfrencement et intgration dimages

Lobjet de ce chapitre est de montrer comment les images numriques


(tldtection spatiale, photographies ariennes, modles numriques, cartes
scannes) peuvent tre intgres en tant quinstances de classes dobjets
gographiques dans une base de donnes relationnelle et bnficier ainsi de la
gestion du systme dinformation gographique au mme titre que les autres classes
dobjets localiss (zones, lignes, points).
Nous introduirons le type dobjet dfini pour grer les images, puis les
diffrentes mthodes utilises pour crer les objets pixels dans un SIG, par
redressement et mosaquage des images brutes ou par cration directe partir
dobjets dun autre type. Nous passerons rapidement en revue les diffrentes
oprations pouvant tre utilises dans le cadre de la gestion relationnelle des objets
de type pixel, ainsi que les oprations permettant de passer du type pixel aux autres
types dobjets localiss. Enfin, nous montrerons comment la dfinition de classes
dobjet pour les principaux types de capteurs de donnes gographiques par
balayage permet dencapsuler dfinition des objets et mthodes dutilisation de ces
objets, facilitant ainsi lexploitation des ces donnes dans le cadre du SIG. Le
systme peut ainsi proposer des schmas de donnes incluant de nombreuses
mthodes associes aux attributs, et se charge de lensemble de la gestion de
donnes souvent trs volumineuses. Enfin, nous exposerons la mise en uvre de ces
principes et mthodes dans le systme dinformation gographique SAVANE.

196

Chapitre 6

6.1. Introduction
Les donnes de type image sont souvent considres comme des donnes un peu
part dans les SIG, ce qui donne lieu de nombreuses ambiguts sur la validit des
traitements effectus par rapport aux autres objets de la base de donnes. Cette
approche ne peut nous satisfaire : il est ncessaire de recourir un formalisme plus
prcis, et il convient dappliquer aux donnes provenant dun capteur de type raster
les mmes critres quaux autres donnes gographiques [EST 92].
On devra ainsi dfinir exactement quel est lobjet trait par le SIG. Le pixel
dune image brute est en effet rarement un objet localis de faon absolue avec
prcision : la position dun pixel nintervient souvent dans une image que de
manire relative, par rapport ses voisins. La plupart des oprations en tldtection
et traitement dimage ne considrent que lagencement des pixels entre eux, et ne
ncessitent pas de gorfrenciation absolue de chaque pixel. Mais lorsque lon veut
joindre ces pixels avec les objets dune base de donnes localises, le premier
problme est de localiser les lments dune image avec une prcision connue. Pour
cela, on se rend vite compte que le pixel de limage brute ne peut tre lobjet final. Il
est ncessaire de dfinir un nouvel objet, connu et parfaitement localis (avec une
prcision gographique donne), et de calculer pour cet objet la valeur dun attribut
en utilisant les donnes de limage, par une opration de r-chantillonnage. Mais il
est galement important de conserver linformation de voisinage prsente dans
limage de dpart, car lon connat la prcision de voisinage grce au capteur (par
exemple, le satellite SPOT permet une prcision relative de 10 mtres entre les
pixels; une photographie arienne peut tre scanne avec une prcision relative de
un mtre, etc.). La prcision nest bien sr quun ordre de grandeur, puisque la
projection gographique des images est en gnral inconnue (les images sont par
dfinition projetes, puisque elles sont donnes dans un plan, mais les
caractristiques de cette projection sont inconnues - elle ne pourrait tre trouve
quau moyen de la rsolution dquations un grand nombre dinconnues). On ne
peut donc parler de lunit des coordonnes de cette projection inconnue.
On a deux critres pour dfinir les objets : un critre de taille pour conserver
linformation de voisinage, et un critre de calcul pour conserver linformation
descriptive (la valeur physique correspondant au signal). On peut choisir des objets
qui existent dj (des zones par exemples), et calculer une valeur descriptive pour
ces objets (mais on perd en gnral linformation de voisinage). On peut choisir de
crer des objets simples (de nouveaux des pixels, mais cette fois-i considrs
comme des mailles), dont on dfinira exactement les caractristiques et dont on
connatra alors la position exacte dans un plan de projection donn. Toute la
difficult vient alors de dfinir la mthode permettant dassocier ces objets une
valeur descriptive venant de limage dorigine, par redressement et rchantillonnage. Pour cela, il faut essayer de savoir quels sont les pixels de limage

Gorfrencement et intgration dimages

197

dorigine qui sont candidats intervenir dans la valeur dun objet darrive, et il faut
dfinir la mthode employer pour associer une valeur descriptive lobjet partir
de ces pixels dimage.
Nous allons donc dfinir dans le schma relationnel un type dobjet pour grer
les images, puis introduire les diffrentes mthodes utilises pour crer les objets
dans un SIG, par redressement et mosaquage des images brutes, ou par cration
directe partir dobjets dun autre type. Nous prsenterons les principes de la
gestion des relations de type mosaque dans SAVANE, ainsi que les diffrentes
oprations pouvant tre utilises dans le cadre de la gestion relationnelle. Enfin,
nous prsenterons en dtail le module SAVAMER qui permet deffectuer le
redressement des images et la constitution de mosaques dans le systme SAVANE.
6.2. Dfinition dune classe dobjet pour les donnes venant dimages : le pixel
6.2.1. Dfinition de lobjet
Nous allons dfinir une nouvelle classe dobjet localis pour grer les images
gorfrences. Dabord, nous pouvons remarquer que chaque objet est un
ensemble de points de lespace, correspondant un lment de limage : ce sont des
zones. La gomtrie des objets est la plus simple possible, et est identique pour tous
les objets de la classe; la plupart du temps, elle ne sera mme pas prise en compte
dans les traitements, et la zone sera assimile son centrode. Cest justement cette
ambigut qui ne doit pas faire oublier la dfinition des objets, en terme de prcision
de leur localisation.
Par dfinition, lobjet est une zone carre, qui est appele pixel par similitude
avec les lments dimage, et sa localisation est donne par la position de son centre
et la taille exacte du cot du carr dans un plan de projection. Comme tous les objets
ont la mme taille, il suffit de connatre la position absolue dun seul objet pour
dterminer la position de tous les objets, si leur position peut tre donne
relativement cet objet. Lagencement des objets en grille permet donc de connatre
la localisation de chaque objet, pour peu que lon connaisse la position dun seul
objet, la taille commune des objets, et le nombre de colonnes de la grille. Cette
description est donc trs efficace en terme de mmoire et de slection des objets sur
un critre de localisation, puisquil suffit de stocker les valeurs des pixels et que
lagencement de ces valeurs dans la structure de stockage est suffisant pour
connatre la localisation des objets. On vite ainsi de conserver les coordonnes du
centre de chaque objet.
Les attributs correspondent aux valeurs affectes chaque pixel. Les donnes
provenant des images brutes peuvent tre de diffrents types, correspondant des

198

Chapitre 6

attributs nominaux, des attributs entiers (cods sur 1, 8, 16 ou 32 bits), rels,


reprsentant une couleur RGB (24 bits) ou RGBK (32 bits).
Par exemple, une image SPOT fournit trois ou quatre attributs, de type entier
cod sur 8 bits (256 valeurs maximum), une image TM en fournit sept, une image
scanne en vraie couleur en fournit un de type RGB, etc.
Une relation de type pixel sera donc dfinie par les critres suivants :
- la taille des objets (en fait la taille du cot du pixel, en mtre) ;
- le plan de projection utilis (en fait les paramtres de la projection
gographique) ;
- les attributs descriptifs.
6.2.2. Gestion des collections de pixels
La localisation dun objet de type pixel est donc donne par la position de la
valeur de ses attributs dans une grille. Mais le stockage des pixels en grille pose un
problme quant lexistence des objets, car il suppose lexistence de tous les pixels
de la grille. Il faut donc ajouter un attribut boolen indiquant lexistence relle de tel
objet dans la relation. Une grille est toujours rectangulaire : pour viter une
importante perte de volume de stockage lorsque le domaine dexistence des objets
est de forme quelconque, il convient de trouver une structure qui minimise la place
perdue dans la grille pour les pixels non existants, tout en conservant la simplicit
du stockage en grille.
Nous avons donc choisi naturellement de diviser lespace en petites rgions
(imagettes) et dindexer ces imagettes. Lensemble des imagettes constitue donc une
mosaque, et lensemble des pixels des imagettes dont lattribut dexistence est vrai
correspond lensemble des objets de la relation. La position dun pixel quelconque
de la mosaque est donne par sa position dans limagette auquel il appartient, et
par la position absolue dun pixel de limagette. Chaque imagette sera donc
caractrise par ces trois paramtres : position absolue dun pixel dans le plan de
projection (on prendra le pixel bas-gauche), nombre de colonnes et nombre de
lignes de limagette. Lexistence des objets est donne par la valeur de lattribut
dexistence. Les valeurs des attributs des objets sont donnes par les valeurs de
limagette correspondant la position de lobjet dans limagette (on a donc une
mosaque dimagettes par attribut).
Les oprations relationnelles (restriction, jointure) utilisent en priorit lattribut
dexistence. La restriction correspond par exemple une modification de la valeur
cet attribut.

Gorfrencement et intgration dimages

199

Les relations de type pixel seront donc composes de :


- une liste des imagettes existantes, dcrivant pour chaque imagette la
localisation du coin bas gauche du pixel bas gauche, le nombre de colonnes et de
lignes, et ladresse du dbut de limagette dans lensemble des grilles de valeurs
dattributs ;
- pour chaque attribut, un ensemble de grilles de valeurs.
6.3. Gorfrencement des images et cration des objets
Une fois dfini le schma dune relation de type pixel, les objets peuvent tre
crs partir dautres objets de la base de donnes (par changement de type, par
exemple par interpolation ou par rasterisation), mais le plus souvent, ces objets
seront crs partir dimages numriques provenant dun capteur (photographie
numrique, scanner, satellite, etc.).
Pour chaque pixel potentiel de lespace, il est alors ncessaire de rpondre
plusieurs questions :
- un objet doit-il tre cr ?
- quelles valeurs pour les attributs, partir des valeurs des pixels de limage
dorigine ?
Lopration de gorfrencement dune image permet de rpondre ces
questions. Cette opration vise crer une nouvelle image possdant les
caractristiques de taille et de projection gographique de la relation, et permettant
de connatre la localisation exacte de chacun de ses pixels. Lors de lintgration de
cette image dans la relation, seuls les pixels prsents dans les imagettes ayant une
intersection avec limage gorfrence seront physiquement crs dans la relation.
Lattribut dexistence des pixels crs mais non prsents dans limage gorfrence
sera initialis FAUX.
La cration dobjets de type pixel dans la base de donnes partir dune image
correspond donc deux oprations :
- la gorfrenciation de limage dorigine, par redressement gomtrique et rchantillonnage ;
- lintgration des pixels de limage gorfrence dans la relation, par
mosaquage.

200

Chapitre 6

6.3.1. Redressement dimage


Les images obtenues par un capteur ne sont pas directement go-rfrences :
elles comportent des dformations globales ou locales et doivent tre redresses
pour tre mises au mieux en conformit avec la ralit gographique, dans un plan
de projection. Nombreuses sont les causes de dformation [NOV 92]. Pour les
photographies ariennes ou les images satellites, on peut citer par exemple les
dformations dues loptique de prise de vue, aux conditions atmosphriques, la
position de linstrument de prise de vue, au relief de la surface, la projection
gographique [HOT 99].
Une fois dfinis les paramtres de limage darrive (taille du pixel et plan de
projection), le problme du redressement consiste trouver le ou les pixels de
limage dorigine qui correspondent un pixel de limage darrive. Le choix des
fonctions utiliser pour assurer au mieux cette correspondance dpend du type de
dformation prsume, des possibilits de prise de points de correspondance entre
image dorigine et image darrive (points dappui ou amers), et de la disponibilit
dun modle numrique de terrain. Corriger gomtriquement une image revient
toujours dterminer un modle de dformation entre les coordonnes dans limage
brute et les coordonnes dans le systme de rfrence utilis pour la relation crer.
Trois cas peuvent se prsenter :
- on connat les modles de dformation avec une grande prcision. Dans ce cas,
il suffit de modliser le redressement en prenant en compte les dformations
connues ;
- on ne connat pas les modles de dformation. On modlise alors arbitrairement
ces dformations avec une fonction donne, en gnral polynomiale. On calcule les
coefficients du modle laide de points dappui, points dont on connat les
coordonnes dans les deux repres (image et systme de rfrence de la relation
crer) ;
- on connat les modles de dformation, mais avec une prcision insuffisante.
On ajuste alors le modle laide de points dappui. Le nombre de points dappui
ncessaires dpend alors du modle.
Les deux derniers cas sont les plus courants en pratique. Les possibilits de
dtermination de points dappui sont donc fondamentales. Cette opration revient
localiser (dans le plan de projection) des points de limage dorigine.
Les modles de dformation et les mthodes de redressement qui en dcoulent
sont nombreux : ils dpendent essentiellement du type de dformations auxquelles
limage redresser est soumise, des possibilits de prise de points dappui, de la
disponibilit dun modle numrique de terrain [HOT 99]. Ils dpendent galement

Gorfrencement et intgration dimages

201

de la prcision souhaite par rapport aux donnes dorigine. Dans la pratique, on


utilise les fonctions suivantes :
- une translation : dans ce cas, limage dorigine est dj conforme la
projection gographique, la taille du pixel est connue, la translation nest utilise
que pour localiser limage mais neffectue aucune transformation sur les pixels. Un
seul point dappui est ncessaire pour effectuer une translation.
- une translation et une rotation : cest la transformation la plus simple, utiliser
dans le cas o limage dorigine est gographiquement correcte mais doit subir une
translation et une rotation pour tre en conformit avec le repre de la projection.
Les distances dans limage ne sont pas modifies. Deux points dappui sont
ncessaires pour effectuer cette transformation.
- une similitude : cest une translation et une rotation suivie dune homothtie
(mise lchelle). La similitude est utiliser lorsque, pour tre mise en conformit
avec une projection gographique, limage doit subir une translation, une rotation,
puis une mise lchelle. La mise lchelle est identique sur lensemble de
limage, la dformation est identique quelque soit la direction. Deux amers sont
ncessaires pour cette transformation.
- une dformation polynomiale de degr 1 : cette dformation est identique la
similitude, sauf pour la mise lchelle qui nest pas identique quelque soit la
direction. Trois points dappui sont ncessaires pour effectuer cette transformation.
- une dformation projective : cest une perspective centrale, dformation
naturelle idale obtenue sur une photographie, lorsque le terrain photographi
correspond un plan. Au minimum six points dappui sont ncessaires pour fixer les
coefficients de cette transformation, ce qui revient positionner le faisceau projectif
dans lespace. Lorsque la distance aux objets est grande par rapport la taille des
objets, la perspective centrale peut tre approche par une dformation polynomiale
de degr 1. Lorsque lon redresse une image de la Terre, cette transformation doit
tre combine une dformation prenant en compte laltitude et la courbure de la
Terre, sinon lchelle obtenue nest pas correcte. En effet, la dformation prcdente
ne tient pas compte de laltitude des points dans limage : les points sont projets
dans le plan comme sils taient tous laltitude zro, alors que la projection dans le
plan doit suivre une verticale, et non pas un rayon lumineux, partir de laltitude
suppose du point. Pour prendre en compte cette dformation, il faut connatre le
relief en tout point et donc disposer dun modle numrique de terrain.
- une dformation par grille ou par triangulation : cette dformation combine une
premire transformation globale (rotation, similitude, polynomiale, perspective
centrale), avec une dformation locale (en gnral polynomiale) dans chaque
triangle rsultant dune triangulation partir des points damers saisis. Cette
transformation est trs efficace lorsque lon ne dispose pas dun modle numrique
de terrain permettant de connatre laltitude en chaque point. En effet, elle tablit un
modle de dformation dans chaque triangle. La dformation correspond un

202

Chapitre 6

dcoupage de lespace en facettes (planes dans le cas dun polynme de degr 1), et
si le rseau de point damers est dense et homogne (et dautant plus dense que les
diffrences daltitude sont grandes), le redressement permet dobtenir directement
une image en conformit avec la projection gographique choisie. Ce type de
dformation permet galement dassurer une jointure parfaite entre diffrentes
images : une fois une image redresse, il suffit de saisir des points damers entre
limage redresse et limage recaler pour faire concider les deux images. La
transformation initiale permet de caler grossirement limage redresser : elle doit
correspondre au mieux au type de dformation globale laquelle est soumise cette
image. Le redressement polynomial de degr 1 ou projectif (si lon connat laltitude
des points damers) est souvent le plus adquat.
6.3.2. Le choix des points dappui
Disposer du modle de la dformation est peu courant en pratique. Pour une
photographie arienne par exemple, cela revient connatre les paramtres de
loptique du capteur, la position exacte du point focal, et laltitude de lensemble des
points de lespace photographi. La prise de points dappui est donc fondamentale.
Quelque soit la mthode de redressement employe, il est important de multiplier
les points dappui de manire mieux ajuster le modle et rduire lincertitude. Des
points de contrle permettront destimer la validit du modle employ.
Le choix des points dappui peut tre manuel ou automatique. Lorsque la prise
des points est manuelle, le choix devra se focaliser sur des points remarquables et
prcis, comme des intersections de routes, des arbres (pris au niveau du sol), des
angles de champs, etc. Dans la majorit des cas, cette prise de point seffectue sur
une carte (cest lune des fonctionnalits du module SAVAMER dcrit dans ce
chapitre). Lorsque lon ne dispose pas de cartes, ou que la prcision est insuffisante,
on aura recours la prise de points sur le terrain, par des mthodes godsiques
classiques ou par GPS.
La prise de points manuelle est une opration longue et fastidieuse ; elle peut
mme tre dangereuse car une grande attention est requise pour ne pas introduire
des erreurs. Des techniques de saisie automatique peuvent alors tre employes pour
dterminer des points remarquables quivalents entre limage redresser et le
document go-rfrenc, en mesurant des indices de corrlation locale. Ces
techniques sont particulirement efficaces lorsquil sagir de redresser une image en
utilisant comme rfrence une autre image go-rfrence. Elle est plus dlicate
entre une carte et une image pour des raisons de prcision. Le principe est le
suivant :

Gorfrencement et intgration dimages

203

- on effectue un premier redressement global de degr 1 ou 2 laide de


quelques points dappui saisi manuellement ;
- on effectue une recherche systmatique de points singuliers dans la premire
image. Pour chaque point singulier, on dtermine la forme dune fonction partir
des valeurs des pixels de limage proche du point singulier. On recherche ensuite
dans la seconde image le point qui offre la mme forme pour cette fonction. La
recherche est faite autour du point correspondant au redressement global initial. Le
choix de la fonction est important : on peut prendre une fonction sur les valeurs des
pixels, ou une fonction sur lagencement local de ces valeurs (comme une texture,
par exemple). Le rayon de la recherche est galement un paramtre important : il
dpend de lampleur des dformations locales estimes, ainsi que du relief suppos.
Enfin, le seuil de ressemblance ou de variance locale sont galement des paramtres
importants : ils permettront dtre plus ou moins exigeant sur la qualit du rsultat.
6.3.3. Le r-chantillonnage
Le redressement saccompagne galement dun r-chantillonnage : les pixels
dans limage darrive nont pas forcment la mme taille que les pixels dans
limage de dpart. En fait, les pixels ne sont jamais les mmes, puisquils sont
dforms par les nombreuses oprations de redressement. La dmarche est donc
inverse : la taille et la position des pixels de limage darrive tant fixes par
dfinition de la relation, on calcule la valeur en cherchant quel est ou quels sont les
pixels dans limage de dpart qui lui correspondent, aprs toutes les dformations
inverses. Le r-chantillonnage consiste donc choisir une fonction de calcul ou
dinterpolation pour la valeur du pixel partir des pixels qui lui correspondent dans
limage de dpart. Les mthodes les plus rpandues sont : plus proche voisin,
interpolation partir dune fonction bilinaire ou dune fonction bicubique sur les
voisins [GDT 93]:
- la rgle du plus proche voisin consiste affecter au point la valeur du point le
plus proche dans limage de dpart.
- la fonction bilinaire correspond une interpolation partir dun domaine de
2x2 pixels autour du point trouv, en traitant linairement les abscisses et les
ordonnes.
- la fonction bicubique utilise un polynme de degr 3 sur un domaine 4x4, en
traitant indpendamment les abscisses et les ordonnes.
6.3.4. Le mosaquage et lintgration dans une relation
Une fois redresse, les pixels de limage peuvent tre intgrs dans une relation
qui possde les mme caractristiques de taille de pixel et de projection

204

Chapitre 6

gographique. Cette opration est appele mosaquage. Le mosaquage permet de


choisir de faon interactive les pixels de limage redresse intgrer dans la
relation. Si un objet nexiste pas dans la relation, il est cr et la valeur de limage
est affect lattribut choisi, qui doit tre du mme type que limage (nominal,
entier, rel, RGB, etc.). Si lobjet existe dj, la valeur de limage remplace la valeur
de lattribut choisi. Dans la suite, nous appellerons mosaques les relations dont les
objets sont de type pixel.
Une mosaque provient de diverses images redresses et intgres dans un mme
ensemble. La correction gomtrique permet dassurer le bon assemblage
gomtrique des images. Mais il est courant davoir des images qui prsentent des
diffrences de valeurs : on constate alors un mauvais raccord des valeurs des pixels.
Pour palier ce problme, il convient deffectuer un redressement descriptif des
images aprs le redressement gomtrique. Ce redressement revient normaliser les
valeurs des diffrentes images avant de les mosaquer.
La ralisation dune mosaque peut donc tre dcompose en trois tapes :
- corrections gomtriques des images assembler ;
- corrections des valeurs pour normaliser lensemble des images ;
- assemblage des images
6.3.4.1. Les mthodes de correction gomtrique pour les mosaques
Les mthodes de correction gomtrique sont celles que nous avons vues au
paragraphe prcdent. Mais lorsque lon redresse une image dans le but de lintgrer
une mosaque, il est trs utile de se servir des zones de recouvrement entre images
pour la prise de points dappui, et assurer ainsi une superposition exacte des zones
communes. Le problme du mosaquage est bien connu en photogrammtrie
analytique. Plusieurs mthodes ont t dveloppes pour viter la propagation
derreurs lors de la prise de points dappui dans des zones de superposition [HOT
99].
6.3.4.2. Les mthodes de correction descriptive pour les mosaques
Les images dune mosaque sont gnralement obtenues des dates diffrentes,
ou avec des conditions de prise de vue diffrentes (ensoleillement, angle, etc.).
Comme les objets de mme nature doivent apparatre avec des tonalits identiques,
il faut minimiser leurs diffrences de couleurs ou de niveaux de gris de part et
dautre de la ligne de raccord. On opre gnralement lgalisation des valeurs
dune image par talement, en prenant des valeurs de rfrence calcules sur la base
dun ajustement des histogrammes sur une zone de recouvrement. Nanmoins, cette
mthode nest pas toujours satisfaisante, car elle suppose lajustement linaire, la
fois dans la zone de recouvrement (pour la constitution du modle) et dans

Gorfrencement et intgration dimages

205

lensemble de limage redresser. Ce nest que rarement le cas en pratique, car,


dans le cas de photographies ariennes ou spatiales par exemple, les diffrences
proviennent de multiples facteurs non linaires.
6.3.4.3. Lassemblage des images
Pour crer une mosaque, il est courant davoir des images dont une partie est
commune. Trois mthodes de mosaquage peuvent tre employes :
- remplacement de la zone de recouvrement par la zone correspondante dune
seule des deux images ;
- calcul de nouvelles valeurs pour les pixels de la zone de recouvrement, par
combinaison des valeurs des deux images (par exemple, la moyenne) ;
- dtermination dune ligne de jointure adapte, dans la zone de recouvrement,
aux diffrences de valeurs des deux images.
Le module SAVAMER, que nous allons dcrire dans ce chapitre, met en uvre
lensemble de ces techniques.
6.3.5. Un cas particulier : les satellites dobservation de la Terre
Les satellites dobservation de la Terre sont une source trs importante
dinformation gographique. Ils fournissent des images prises par des instruments
qui balayent la surface terrestre. Les donnes fournies par les satellites
dobservation de la Terre sont caractrises par :
- la partie du spectre lectromagntique utilise (visible, infra-rouge, ondes
radar) ;
- la rsolution au sol, ou plutt la taille du plus petit lment chantillonn sur le
terrain ;
- la rptitivit de lobservation ;
- la qualit des images.
La plupart des images provenant des satellites dobservation de la Terre de haute
rsolution (comme SPOT, LANDSAT, IKONOS, ASTER) subissent un prtraitement de base pour effectuer des corrections gomtriques ou radiomtriques
[GDT 93].
Ainsi, les niveaux de pr-traitement dune scne SPOT sont :
- Niveau 1A : galisation des dtecteurs dans chaque bande spectrale ;
- Niveau 1B : correction radiomtrique et gomtrique des dformations
systmatiques introduites par le systme : rotation de la Terre, effet de fil, angle de
vise. La prcision absolue de la localisation est denviron 800 m.

206

Chapitre 6

- Niveau 2A : corrections gomtriques pour restituer la scne dans une


projection gographique donne. Cette correction ne fait pas intervenir de points
dappui, la prcision absolue de la localisation est celle du niveau 1B.
- Niveau 2B : corrections gomtriques faisant intervenir quelques points
dappui. Limage est donc restitue dans une projection gographique, et la
prcision absolue de la localisation des pixels ne dpend en principe plus que du
relief et des conditions atmosphriques. Elle est dautant plus prcise que la vise
est plus verticale et le relief moins important.
- Niveau 3 : cest une correction de niveau 2B qui tient compte des dformations
dues au relief. Il faut alors disposer dun modle numrique de terrain pour
connatre laltitude approche en chaque point.
Le problme de la gorfrenciation est actuellement bien rsolu par les
fournisseurs dimages satellitales, condition de disposer de modles numriques de
terrain suffisamment prcis dans la zone concerne.
6.4. SAVANE et mosaques
Le systme SAVANE permet de grer des relations de type mosaque dans le
cadre du modle relationnel tendu. Nous allons dcrire dans ce paragraphe la
structure de ce type de relation ainsi que les particularits de gestion quelle
implique.
6.4.1. Structure des relations de type mosaque
Les relations de type mosaque permettent de conserver des objets pixel dont les
valeurs sont donnes sous forme dimage. Dans ce type de relation, les objets sont
trs nombreux (il nest pas rare davoir plusieurs dizaines de millions de pixels), et
reprsentent, comme nous lavons vu, la fois une surface ou un point. A cause de
ces caractristiques et pour grer ce type de donnes de faon efficace, la structure
de reprsentation interne est profondment diffrente de la structure des relations
vectorielles :
- les donnes sont conserves selon une projection gographique particulire, ce
qui permet dutiliser la mosaque dans cette projection sans avoir recalculer la
position de chaque pixel ;
- la position dun objet est donn par son agencement dans une grille, appele
encore imagette, et non par ses coordonnes ;
- lindexation nutilise pas une grille adaptative, mais une grille rgulire ;

Gorfrencement et intgration dimages

207

- une mosaque peut tre partage par plusieurs bases de donnes, pour ne pas
avoir dupliquer une information volumineuse si deux bases de donnes souhaitent
lutiliser.
A cause de ces caractristiques, la cration et la gestion dune relation de type
mosaque utilise des procdures particulires dans SAVATECA. Par exemple, le
dialogue de cration dune relation de ce type est diffrent, car il faut indiquer des
paramtres supplmentaires : la taille des pixels, le rpertoire de stockage et la
projection dans laquelle est conserve la mosaque. La taille de la grille dindexation
peut galement tre paramtre (fig. 6.1).

fig. 6.1. : le dialogue de cration dune relation mosaque

Pour les attributs, nous avons tendu les types de base (nominal, entier, rel) de
manire minimiser lespace de stockage de chaque valeur. Rappelons quun
attribut correspond ici la notion dimage ou de canal (pour les images satellitaires).
Ainsi, le type entier peut se dcliner en entier 8 bits (valeurs de 1 255, valeur
inconnue 0), entier 16 bits (valeurs de 1 65655, valeur inconnue 0), entier 32 bits
(fig. 6.2). Le type RGB correspond un codage de chaque valeur en 24 bits,
pouvant ainsi dcrire une couleur par ces trois composantes, chacune sur un octet
(rouge, vert, bleu). Le type rel correspond un codage sur 32 bits (en float) en non
sur 64 bits.

208

Chapitre 6

fig. 6.2. : le dialogue de cration dun attribut dune relation mosaque

Tous les fichiers dune relation sont stocks dans un rpertoire qui porte le nom
de la relation. Ce rpertoire peut tre nimporte o sur le rseau local, et son adresse
(indique lors de la cration ou de la modification de la relation) est conserve dans
le fichier base. La structure dune relation de type mosaque comprend un fichier
dcrivant la relation (taille du pixel, projection, taille des imagettes), et, pour chaque
attribut, un fichier index contenant la description des imagettes prsentes pour cet
attribut et un fichier descriptif contenant les valeurs des pixels (fig. 6.3).

Valeurs des pixels, imagette i


Index
imagette i
...

Valeurs des pixels, imagette j

imagette j
...

fig. 6.3 : structure interne des relations mosaques

Gorfrencement et intgration dimages

209

La description de chaque imagette comprend la fentre gographique occupe


par limagette (dans la projection de la mosaque), et ladresse de premier pixel de
limagette dans le fichier descriptif. Les pixels de chaque imagette sont ensuite
agencs comme dans une image, en ligne du bas vers le haut, chaque ligne tant
organise de la gauche vers la droite.
Chaque relation comprend galement deux fichiers spciaux indiquant
lexistence des pixels, pour lensemble des attributs. Le premier correspond
lindex des feuilles existantes, le second indique, pour chaque feuille, lexistence de
chaque pixel dans la feuille.
Des attributs temporaires peuvent tre crs dans une relation de type mosaque,
comme dans tout type de relation (nous dcrirons ces oprations au chapitre 8).
Dans ce cas, le fichier correspondant au nouvel attribut temporaire nest pas cr
dans le rpertoire de la mosaque, mais dans le rpertoire de lutilisateur.
6.4.2. Oprations relationnelles
Les pixels dune mosaque sont grs dans la base de donnes comme les objets
dune relation, et bnficient ainsi de lensemble des oprations disponibles, sans
quil soit ncessaire de recourir un formalisme spcial pour ce type dobjet. Ainsi,
slections, slections gographiques, calculs de nouveaux attributs, classifications,
calculs statistiques, utilisent dans le systme SAVANE un formalisme identique
quelque soit le type de la relation (zone, ligne, point, pixel, non localis). Par
exemple, le calcul dun indice de vgtation sur un domaine de lespace partir
dune mosaque provenant dune image satellite cre un nouvel attribut pour la
relation : lutilisateur nindique que la formule de calcul, et le nom du nouvel
attribut crer. Le systme de gestion se charge de lensemble des oprations.
Les oprations de restriction sur les mosaques noffrent aucune particularit
dpendant du type : les objets pixel peuvent tre slectionns sur un critre
descriptif comme sur un critre de localisation (slection sur un masque). Seul
lattribut dexistence est temporairement modifi. Il est par exemple trs simple
dtudier les valeurs dun attribut dune mosaque sur un domaine de lespace dfini
partir des objets dune autre relation localise.
Les oprations de jointure classique (sur un critre descriptif) nont que peu
dintrt pour les relations de type mosaque, car le rsultat nest pas localis et le
nombre dobjets crs peut tre trs grand. Par contre, les oprations de jointures
gomtriques, suivies ou non dune agrgation sur un critre descriptif, sont
intressantes et deviennent galement trs faciles mettre en uvre. Par exemple :

210

Chapitre 6

- lqui-jointure gomtrique zone-pixel permet de crer de nouveaux attributs


dans la relation mosaque, par intersection des zones et des pixels.
- lagrgation de pixels dans des zones permet de crer un attribut pour des
objets dune relation zonale en effectuant, par zone, une opration sur la valeur des
pixels se trouvant dans la zone. Lopration peut tre une somme, une moyenne, un
cart-type, la frquence dune valeur nominale, la surface occupe par les pixels,
etc. Par exemple, il est ainsi trs simple de calculer la moyenne de radiomtrie dans
une zone de vgtation, ou dajuster un modle de calcul entre canaux grce la
mise en relation avec les valeurs dun chantillon de zones.
- lagrgation de pixels dans dautres pixels effectue une opration de rchantillonnage, et permet ainsi trs facilement de comparer des images de
rsolutions diffrentes.
Bases sur ces oprations relationnelles, les oprations de gostatistique,
univaries ou multivaries, deviennent galement trs faciles mettre en uvre.
6.4.3. Cration de relations de type mosaque et oprations de changement de type
La cration dune relation de type pixel peut galement tre interactive et
intervenir tout moment lors dune requte :
- par dfinition directe des paramtres de la relation : taille du pixel, projection
gographique ;
- par rasterisation dune relation zonale, en calculant pour chaque zone les objets
pixel correspondants, et en affectant chaque pixel la valeur dun attribut de la zone
laquelle il appartient ;
- par interpolation partir de points ou darcs, en calculant pour chaque pixel du
domaine dtude une valeur par interpolation entre les points dorigine.
Les mosaques cres partir dautres objets de la base ont la mme structure
que les mosaques permanentes. Elles peuvent ensuite tre intgres de manire
permanente la base de donnes.
Ces oprations de cration dune relation de type pixel partir de relations
localises dautres types (zone, ligne, point, pixel) correspondent un changement
de type dobjet. Inversement, on peut crer des relations de type zone, ligne, point
ou pixel partir dune relation de type pixel :
- cration de zones, par vectorisation et lablisation sur un attribut nominal de la
relation mosaque (par exemple, pour crer les zones correspondant la
classification dun attribut) ;

Gorfrencement et intgration dimages

211

- cration de lignes, par vectorisation sur un attribut nominal (par exemple, pour
crer des courbes disovaleur partir dune interpolation) ;
- cration de points, par calcul direct des coordonnes de chaque pixel de la
mosaque ;
- cration de pixels, par r-chantillonnage permettant modifier la taille du pixel
dorigine.
Nous dtaillerons lensemble de ces oprations dans le chapitre consacr aux
changement de type dobjet (chapitre 9).
6.4.4. Utilisation des mosaques dans le cadre objet
6.4.4.1. La classe de base CMosaique
Les relations de type mosaque peuvent tre dcrites en tant quinstances dune
classe drive dune classe de base que nous appellerons CMosaique. Les attributs
de la relation sont des membres de la classe drive, et dpendent bien sr de la
dfinition de la relation correspondante.
Du fait de la forme et de lagencement des objets, le type mosaque possde de
nombreuses oprations spcifiques, provenant du traitement et de lanalyse
dimages, comme par exemple :
- morphologie mathmatique (rosion, dilatation, connexit),
- calculs gomorphologiques et hydrologiques : pente, orientation, courbures,
volume, drainage, etc.
- analyse dimage, filtrage, texture et segmentation,
- squelettisation et transformations de voisinage,
- anisotropie, reconnaissance de forme.
Ces oprations sont implantes en tant que mthodes de la classe de base
CMosaique. De mme, certaines procdures de visualisation sont propre au type et
sont implantes en tant que mthodes de la classe de base : clairements,
perspectives, compositions colores.
Les mthodes ont en gnral comme paramtres un ou deux attributs de la
relation correspondante linstance de la classe drive.
Pour la mise en uvre des mthodes, la structure des mosaques en imagettes ne
pose aucun problme algorithmique majeur. Il faut seulement grer efficacement les
relations de voisinage entre imagettes, pour pouvoir retrouver facilement les

212

Chapitre 6

relations de voisinage entre pixels quelque soit limagette laquelle ils


appartiennent.
6.4.4.2. Quelques classes drives
On peut dfinir une classe drive partir de la classe de base lorsque lon
connat les attributs et des mthodes spcifiques associes ces attributs. Par
exemple, les capteurs satellites SPOT ou TM permettent de dfinir des classes
drives, car les attributs et leurs caractristiques sont connus (les canaux
radiomtriques). Tous les indices particuliers au capteur (comme par exemple les
indices de vgtation, dont le NDVI, peuvent tre implants en tant que mthodes
propre la classe.

fig. 6.4 : un modle numrique de terrain

Les modles numriques de terrain offrent dautres classes drives. Si lunique


attribut correspond une valeur daltitude de chaque pixel, la dfinition de la classe
est fonction de la taille de lobjet (la taille du pixel). La classe hrite de nombreuses
mthodes de la classe de base, notamment pour toutes les oprations
gomorphologiques et hydrologiques.
En proposant ces classes drives, le systme peut faciliter considrablement
lutilisation des donnes de type pixel dans le SIG : il propose des schmas de
donnes incluant de nombreuses mthodes associes aux attributs, et se charge de
lensemble de la gestion de donnes souvent trs volumineuses. Lintgration de ce

Gorfrencement et intgration dimages

213

type de donnes dans le systme de gestion est complte et lexploitation de ces


donnes peut tre facilement accessible de non-spcialistes.
6.5. Le module SAVAMER
6.5.1. Prsentation gnrale
Le systme SAVANE comporte deux modules de saisie graphique, lun pour les
images, lautre pour les donnes vectorielles. Le module SAVAMER permet de
gorfrencer des images raster et de les intgrer dans une relation de type
mosaque.
A partir dune image non gorfrence, appele image de dpart dans la suite,
le module SAVAMER permet de crer une nouvelle image, appele image
darrive, par redressement et r-chantillonage. Les paramtres de cette nouvelle
image (projection gographique, taille de pixel, espace gographique) sont indiqus
par lutilisateur. Une fois cette opration effectue, le module SAVAMER permet
dintgrer les valeurs de limage darrive un attribut dune relation mosaque
dune base de donnes. Les paramtres gographiques et gomtriques (projection
gographique, taille et forme de pixel) de limage darrive sont donc connus : ce
nest pas le cas pour limage de dpart.
Le module SAVAMER permet la saisie de points dappui et le redressement
avec r-chantillonage, en donnant le choix de la fonction de redressement :
similitude, projection centrale, fonction polynomiale de degr 1 ou 3, tessellation,
etc. Plusieurs fonctions de redressement peuvent tre combines : il est courant
deffectuer une transformation globale (de type projective ou de degr1) suivie de
transformations locales (par exemple, redressement de degr 1 dans les triangles
issues dune tessellation partir de points dappui). La fonction de r-chantillonage
peut galement tre choisie : plus proche voisin, fonction bilinaire sur les voisins,
fonction bicubique sur les voisins.
6.5.2. La prise de points dappui
6.5.2.1. Principes gnraux et interface graphique
La premire tape du redressement, cest la prise de points dappui, cest--dire
de couples de points, lun dans limage redresser, lautre dans lespace
gographique. Le nombre de points dappui saisir dpend de la mthode de
redressement qui sera employe par la suite : un point suffit pour une translation,
deux points pour une rotation, une similitude, ou une fonction polynomiale plus
gnrale de degr 1, six points pour une perspective centrale, neuf points pour une

214

Chapitre 6

fonction polynomiale de degr 3, et le plus de points possibles dans le cas dun


redressement local par triangulation.
Linterface de SAVAMER comprend plusieurs fentres : une fentre gnrale
correspondant un espace gographique, dessin dans une projection gographique
donne par lutilisateur, et des fentres permettant dafficher une partie ou la totalit
de limage redresser. La fentre gographique permet de dessiner tous les objets
dj prsents dans les relations de la base de donnes, ainsi que des images dj
gorfrences, ou des documents provenant dune saisie vectorielle effectue avec
le module SAVEDIT.
La prise de points dappui seffectue visuellement en associant un point de la
fentre image un point de la fentre gographique . Il est galement
possible dindiquer directement les coordonnes gographiques dun point de
limage. Cest la mthode utilise lorsque lon redresse une carte scanne, en
choisissant des points dintersection des amorces de projection dans limage de la
carte scanne. On peut galement dessiner les amorces de projection dans lespace
gographique pour vrifier le bon placement des points dappui (fig. 6.5).

fig. 6.5 : linterface graphique du module SAVAMER

Cest galement la mthode utilise lorsque les points dappui proviennent dune
campagne de mesures directes sur le terrain : aprs avoir point un point sur
limage, on indique les coordonnes gographiques qui ont t releves sur le
terrain.

Gorfrencement et intgration dimages

215

Les points dappui sont conservs dans linstance dune classe CAmers
(A.3.1.). Cette structure conserve les points dappui dans divers systmes de
coordonnes. La procdure de sauvegarde cre un fichier qui conserve les points
dappui en coordonnes sphriques (pour le point gographique) et en coordonnes
image (pour le point de limage). Ce fichier est associ limage redresser. Sil
existe dj (des points dappui ont dj t saisis), il est automatiquement ouvert
lors de louverture de limage, et les points dj saisis sont dessins sur lcran.
6.5.2.2. La saisie manuelle des points dappui
La saisie manuelle consiste associer manuellement deux points, lun saisi dans
lespace gographique, lautre dans limage. Loprateur peut bien sr modifier la
position de chaque point avant ou aprs validation du point dappui (fig. 6.6).

fig. 6.6 : exemple de prise de points damers dans une zone commune deux images

Ds que deux points dappui ont t saisis, il est possible de calculer une
fonction polynomiale de degr 1 (en fait une similitude) pour passer dun repre
un autre. Une option trs utile permet dutiliser cette fonction pour proposer
automatiquement un point lors de la saisie ultrieure de points dappui : ds que
loprateur choisit un point dans lun des espaces (gographique ou image), le
systme propose automatiquement le point correspondant dans lautre espace. En
gnral, ce point nest pas trs loign du point rel (la diffrence correspond la
diffrence entre la similitude et la dformation relle modliser). Loprateur na
plus qu dplacer ce point laide des touches de dplacement du clavier, pixel par

216

Chapitre 6

pixel (la taille du pixel dpend de lespace visualis, qui peut bien sr tre choisi
tout moment par loprateur).
6.5.2.3. La saisie semi-automatique et automatique
La saisie semi-automatique permet dans certains cas damliorer la prcision de
la prise des points dappui. On utilise alors un indice de corrlation bas sur
lagencement des pixels dans limage redresser et dans une image dj
gorfrence ou dans une relation de la base de type mosaque. La recherche dune
meilleure ressemblance est effectue au voisinage du point propos par loprateur :
il permet souvent daffiner la prise du point de quelques pixels.
La saisie automatique permet de saisir automatiquement des points dappui ds
quun redressement polynomial initial peut tre effectu. Le principe de la
corrlation est identique celui de la saisie semi-automatique, mais ici les points
sont choisis par le systme en fonction de leur singularit dans limage redresser.
Le systme balaye limage la recherche des pixels qui sont trs diffrents de
leurs voisins, ou qui sont le centre dune structure remarquable. Il recherche ensuite
pour chaque point celui de limage dj redress qui lui ressemble le plus, au
voisinage du point calcul par la fonction polynomiale initiale de degr 1.
Nous avons construit des classes pour encapsuler lensemble des oprations de
calculs de la transformation polynomiale initiale (CSimilitude, CSystme1). Ces
classes sont galement tre utilises pour redresser lensemble dune image. Nous
les prsenterons dans le paragraphe suivant.
6.5.3. Le redressement et le r-chantillonnage
Les pixels de limage darrive sont dfinis sans ambigut, taille et position.
Pour savoir quelle valeur affecter un pixel de limage darrive partir des pixels
dune image de dpart, il faut calculer, par gorfrencement, quels pixels de
limage de dpart participent par leur position la dfinition de la valeur du pixel de
limage darrive, puis, par une opration de r-chantillonnage, il faut calculer une
nouvelle valeur partir de ces pixels. Nous effectuons donc cette opration en deux
tapes : calcul des coordonnes dans le repre de limage de dpart dun pixel de
limage darrive, puis calcul dune valeur partir des pixels voisins de cette
coordonne.
6.5.3.1. Le redressement
Le redressement consiste donc savoir quelles sont les coordonnes dans le
repre de limage de dpart dun pixel de limage darrive. On utilise pour cela une
fonction qui est cense approcher la dformation. Cette fonction peut tre

Gorfrencement et intgration dimages

217

parfaitement connue, mais cest rarement le cas. Par exemple, si une carte na pas
subit de dformation du papier, si le scanner utilis ne provoque aucune dformation
locale, la transformation est une similitude (si, bien sr, on conserve la mme
projection gographique. Sinon, il faut composer avec un calcul de changement de
projection). Si loptique dun appareil photographique de prise de vue ne provoque
aucune dformation, si les rayons lumineux sont rectilignes, si le terrain est
totalement plat, et si la prise de vue est orthogonale, la transformation est une
projection centrale suivie dun changement de projection gographique (tenant alors
compte de la courbure de la Terre). Evidemment, ces conditions ne sont jamais
remplies dans la pratique (une optique nest jamais parfaite, etc.).
On peut essayer de modliser la dformation de chaque lment (loptique, le
relief, les angles de prise de vue, les conditions atmosphriques) pour composer ces
dformations et aboutir une fonction globale modlisant la dformation. La
modlisation de certains lments ncessitent des donnes de positionnement (par
exemple, les phmrides des satellites) ou des points dappui (pour calculer par
exemple les angles de prise de vue, la position du point focal dun appareil de prise
de vue arienne), dautres ncessitent uniquement des paramtres intrinsques aux
appareils employs. Ces paramtres sont en gnral obtenus par chantillonage
initial (pour la dformation optique, par exemple).
Nous avons dvelopp dans SAVAMER des mthodes de modlisation
exclusivement bases sur les points dappui et non sur les paramtres intrinsques
des appareils de prise de vues ou de rasterisation. Ces mthodes sont les suivantes :
- modlisation par une transformation polynomiale de degr 1 (translation,
rotation, similitude, ou polynme gnral de degr 1) ;
- modlisation par une transformation polynomiale de degr 3 ;
- modlisation par une transformation perspective conique ;
- modlisation par une transformation perspective cylindro-conique ;
- modlisation par une transformation locale polynomiale de degr 1.
Les paramtres des fonctions correspondantes ces mthodes sont dtermins
uniquement par les points dappui. Les modlisation polynomiales de degr 1
ncessitent de 1 3 points dappui. Les modlisations perspectives demandent de 4
6 points. La modlisation locale polynomiale utilise au minimum quatre points
dappui : elle utilise une triangulation calcule partir de lensemble des points
dappui, et une fonction polynomiale de degr 1 dans chacun des triangles (fig. 6.7).
Le systme permet de combiner une dformation globale, polynomiale de degr
1 ou perspective, et une dformation locale par triangulation, en effectuant
successivement les deux transformations. La dformation par triangulation revient
modliser la dformation due au relief et aux autres paramtres de prise de vue par

218

Chapitre 6

un ensemble de facettes planes, aprs une premire transformation qui est cense
modliser la dformation idale (optique sans dformation, prise de vue
orthogonale, etc.) de manire globale. La surface modliser est reprsente par un
rseau de facettes triangulaires dont les sommets sont les points dappui redresss
par la premire transformation globale. On se trouve devant le classique problme
mathmatique visant approcher une fonction de deux variables connues
uniquement en un nombre fini de points distribus de faon quelconque dans son
domaine de dfinition. La discrtisation du domaine de dfinition est la premire
tape de rsolution de ce problme. Si les points sont distribus de manire
alatoire, une grille triangulaire dont les sommets sont les points initiaux rpond la
question, lorsque cette triangulation permet dassurer la continuit de la fonction
interpoler. La triangulation de Delaunay, duale de la tessellation de Vorono,
satisfait cette condition. Elle est par ailleurs utilise, tout comme la tessellation de
Vorono, dans la rsolution de nombreux problmes en gomtrie discrte ou
algorithmique [SHA 78] [ORO 93]. Nous prsenterons au paragraphe 6.6.3.3.
lalgorithme utilis dans SAVAMER pour calculer la triangulation de Delaunay
utilise lors du redressement par triangulation.

Gorfrencement et intgration dimages

219

fig. 6.7 : le dialogue de redressement de SAVAMER

La triangulation de Delaunay cre, partir des points dappui redresss par le


calcul global, un graphe planaire reprsent par ensemble de segments (fig. 6.8).
Ces segments sont ensuite rasteriss pour obtenir une image code, chaque code
reprsentant un triangle de la triangulation. Paralllement, on calcule et on conserve
pour chaque triangle les coefficients de la transformation bilinaire appliquer aux
points du triangle, grce aux coordonnes redresses des trois points dappui et de
leurs coordonnes correspondantes dans le repre de projection gographique. Le
redressement de limage se fait donc en plusieurs tapes :
- pour un point de limage darrive, recherche du triangle dans lequel se trouve
ce point, et calcul des coordonnes par transformation locale inverse ;
- calcul de ses coordonnes dans limage de dpart par transformation globale
inverse.

220

Chapitre 6

fig. 6.8 : triangulation obtenue partir des points dappui

Pour toutes les mthodes de redressement, il faut commencer par calculer la


fentre de redressement, cest--dire lespace gographique de limage darrive
concern par limage de dpart. Cette fentre permet de dterminer les paramtres
de limage darrive, dont on ne connat a priori que la rsolution. Le calcul de la
fentre utilise uniquement le redressement global, qui est effectu sur les quatre
coins de limage de dpart.
Plusieurs classes permettent dans SAVAMER dencapsuler lensemble des
calculs ncessaires aux oprations de redressement : CSimilitude, CSysteme1,
CSysteme3 (A.3.2.). La mthode Equations() de chacune de ces classes
calcule, partir des trois premiers points damers, les coefficients des formules de
calculs. Les mthodes ProjectionToImage() et ImageToProjection()
effectuent les calculs de changement de repre. Le calcul de la fentre de
redressement est effectu par la fonction FenetreDestination(). La mthode
Recalage() effectue la fois le redressement et le r-chantillonage.
6.5.3.2. Le r-chantillonnage
Comme nous lavons vu, le redressement saccompagne dune opration de rchantillonnage. Plusieurs mthodes peuvent tre employes pour effectuer cette
opration [GDT 93]. La plus simple consiste prendre la valeur du pixel de limage
dorigine le plus proche (plus proche voisin), mais il est galement courant de faire

Gorfrencement et intgration dimages

221

une moyenne sur les pixels voisins, par un calcul bilinaire ou bicubique. Ces trois
oprations de r-chantillonage sont implantes dans le module de redressement de
SAVAMER.
Le calcul bilinaire calcule la valeur en fonction de la position du point par
rapport aux quatre voisins, le calcul bicubique calcule la valeur en fonction de la
position du point sur une fentre de 4*4 voisins (A.3.2.).
Toutes les oprations de redressement crent une nouvelle image gorfrence,
munie dun fichier dcrivant ses paramtres de localisation (coordonnes du point
bas-gauche, taille du pixel, projection gographique, nombre de lignes, nombre de
colonnes). Le type de limage cre (codage sur 8, 16, 24 ou 32 bits) est toujours
identique celui de limage de dpart.
6.5.3.3. Un algorithme de triangulation
Plusieurs algorithmes ont t dvelopps pour crer une tessellation de Vorono
ou un graphe de Delaunay partir dun semis de points alatoirement distribus
dans le plan. On peut les classer en deux catgories : les algorithmes par
incrmentation, qui construisent la triangulation partir dun point intrieur
quelconque et en ajoutant les points un par un, en recalculant la triangulation pour
chaque point ajout, et les algorithmes de type diviser pour rgner , qui
emploient une mthode rcursive en divisant rcursivement la rgion en sousrgions jusqu ce que la triangulation finale soit atteinte. Les techniques
incrmentales ne sont pas trs optimises car en gnral de complexit en O(n2),
mais elles sont plus faciles mettre en uvre et demandent moins de ressources
mmoire.
Lalgorithme implment dans SAVAMER est du type incrmental. Il est dcrit
dans [FLO 85]. Il se divise en plusieurs oprations :
- triangulation de Delaunay pour un simple polygone ;
- insertion incrmentale de points dans la triangulation.
La classe CTessel regroupe lensemble des structures et des oprations
ncessaires la mise en uvre de lalgorithme de triangulation de [FLO
85] (A.3.3.).
6.5.3.4. Le redressement descriptif des dynamiques
La dernire tape avant lintgration dune image dans la base par mosaquage
concerne le redressement des valeurs de limage gomtriquement redresse. En
effet, une image peut tre gomtriquement correcte mais comporter dimportantes
diffrences de valeur avec des images voisines correspondant au mme attribut.

222

Chapitre 6

Dans SAVAMER, on peut oprer lgalisation des valeurs dune image


gorfrence par rapport une mosaque par talement, en prenant des valeurs de
rfrences calcules sur la base dun ajustement linaire des histogrammes.
Ltalement est calcul par rgression linaire partir des points dappui ou sur
lensemble des pixels de la zone de recouvrement. Si limage est de type RVB, la
rgression linaire est calcule sparment pour chaque composante de couleur.
6.5.4. Le mosaquage et lintgration dans une relation
Lopration de mosaquage permet dintgrer une image gorfrence un
attribut dune relation de type pixel. Le systme Savane gre ces attribut de manire
permettre des ensembles de pixels plus complexes que des images rectangulaires.
Lopration dintgration consiste donc, partir dune image gorfrence, crer
des objets pixels dans une relation (si ces objets nexistent pas dj), et affecter les
valeurs des pixels de limage un attribut dans cette relation. On constitue ainsi une
mosaque dont la gestion est entirement la charge du systme, et dont la
structure externe est identique celle des autres types de relation.
Le module SAVAMER permet de choisir le domaine intgrer, ainsi que la
mthode dintgration. Le domaine peut tre choisi de plusieurs manires (fig.
6.10) :
- par imagette, en slectionnant directement sur lcran les imagettes crer ;
- par rectangle, en choisissant le rectangle sur lcran ou en donnant ses
coordonnes gographiques ;
- par polygone, en dessinant sur lcran le polygone intgrer.
Si la valeur dun pixel existe dj, la mthode dintgration peut tre : remplacer
la valeur, ne pas remplacer la valeur, faire la moyenne (fig. 6.9).

fig. 6.9 : le dialogue dintgration dune image dans une mosaque

Gorfrencement et intgration dimages

223

fig. 6.10 : le choix des pixels intgrer : mthode par polygone

Lintgration dune image cre des imagettes pour lattribut slectionn dans la
relation. Une imagette est cre ds quun pixel doit tre cr dans lespace
correspondant. Lintgration peut ainsi tre effectue en plusieurs tapes, et la
mosaque crot au fur et mesure de la cration de nouvelles imagettes (fig. 6.11). Il
est bien sr galement possible de supprimer des pixels. Si tous les pixels dune
imagette doivent tre supprims, limagette elle-mme est supprime dans le fichier
servant dindex.

224

Chapitre 6

fig. 6.11 : exemple de constitution de mosaque dimages gorfrences

6.6. Conclusion
Lintgration des donnes de type image dans le processus relationnel permet de
bnficier de la simplicit du modle avec des donnes dont la structure est trs
diffrente des objets gographiques dont la localisation est dcrite par la gomtrie.
Elle permet surtout de ne pas avoir diffrencier la logique des oprations
relationnelles classiques (restriction, jointure) ou des oprations sur les attributs
(calculs, classifications, etc.) entre les diffrents types de localisation. Mais cette
intgration exige davoir une dfinition formelle de ce type dobjets, et dassurer la
validit de lattribut de localisation pour chacun des objets. Nous avons donc
introduit un nouveau type dobjet, le pixel, et un nouveau type pour les relations
reprsentant des collections de pixels, les mosaques, qui sont structures et gres
de faon trs diffrente des autres types de relations.
La validit de la localisation est assure par des oprations de redressement
dimages. La mise en uvre de ces oprations souvent complexes a donn lieu au
dveloppement dun module spcialis dans le systme SAVANE. Ce module
regroupe le redressement des images, la gorfrenciation des pixels, et leur
intgration dans une relation de la base de donnes. Le redressement peut tre
effectu par plusieurs mthodes. La plus complte utilise un redressement local de
degr 1 dans les triangles issues de la triangulation de Delaunay obtenue partir de
lensemble des points damers, et a lavantage de ne pas utiliser les paramtres
intrinsques de la prise de vue.

Gorfrencement et intgration dimages

225

Bibliographie

[EST 92] ESTES J., Remote sensing and GIS integration : research needs, status and trends.
ITC Journal, 1992, n 1, p. 2-9
[FLO 85] DE FLORIANI L., FALCIDIENO B., PIENOVI C., Delaunay-based Representation of
Surfaces Defined over Arbitrary Shaped Domains, Computer Vision, Graphics, and Image
Processing, 1985, n 32, p. 127-140
[GDT 93] GDTA, Les Spatiocartes, Cahiers Pdagogiques du GDTA, 1993
[HOT 99] HOTTIER, Photogrammtrie analytique, Cours ENSG, 1999
[NOV 92] NOVAK K., Rectification of digital Imagery. Photogrammetry Eng. And Remote
Sensing, 1992, vol. 58, p.339-344
[ORO 93] OROURKE J., Computational Geometry in C, 1993, Cambridge University Press
[REN 91] RENOUARD L., Restitution automatique du relief partir de couples
stroscopiques dimages du satellite SPOT, 1991, Thse de Doctorat prsente lEcole
Polytechnique
[SHA 78] SHAMOS M.I., Computational Geometry, PHD Thesis, 1978, Yale University

Chapitre 7

Contraintes d'intgrit spatiale et saisie


graphique

Les contraintes d'intgrit permettent d'assurer la cohrence des bases de


donnes et de renseigner sur leur niveau de qualit. Dans les systmes d'information
gographique, la qualit des donnes provient galement de la qualit de la
localisation des objets et de leur niveau de cohrence spatiale. Ce chapitre a pour
objectif de passer en revue l'ensemble des contraintes d'intgrit spatiale applicables
une base de donnes localises, contraintes qui permettent, si elles sont remplies,
de renseigner sur le niveau de qualit de la base de donnes, d'assurer la fiabilit des
processus utilisant ces donnes, et d'assurer ainsi la capacit du systme remplir
les fonctions attendues par les utilisateurs. De plus, avec les possibilits d'change
ou de partage de donnes, il est important de pouvoir renseigner l'utilisateur sur le
niveau de qualit et de cohrence des donnes qu'il reoit ou qu'il souhaite exporter
vers un autre systme.
Comme nous lavons vu, les systmes d'information gographique peuvent
utiliser de nombreux modles gomtriques internes pour reprsenter les objets
localiss, mais les contraintes d'intgrit lies la localisation doivent, lorsque cela
est possible, tre exprimes indpendamment de ces modles internes. Par contre, la
cohrence s'exprime par rapport une modlisation de la ralit en entits
gographiques, correspondant des collections d'objets gographiques
(classiquement des zones, des lignes, des points, des pixels), et les contraintes
d'intgrit spatiale sont exprimes en fonction de cette modlisation, sur les objets et
entre les objets. Les contraintes les plus classiques concernent par exemple la
fermeture des zones, la non-intersection dobjets, la connexit, les relations spatiales
entre les objets de diffrentes entits gographiques. Nous tudierons les contraintes

228

Chapitre 7

d'intgrit spatiale en nous basant sur le modle relationnel pour la modlisation de


la ralit et la gestion des collections d'objets gographiques. Nous tudierons
ensuite les possibilits de mise en uvre de ces contraintes en fonction des
diffrents modes de reprsentation gomtrique de la localisation, lors du processus
de saisie graphique.
Nous prsenterons enfin en dtail le module SAVEDIT de saisie graphique sur
cran, qui met en uvre au sein du systme SAVANE un certain nombre de
contraintes dintgrit. Nous prsenterons larchitecture de ce module et les
algorithmes utiliss pour rsoudre les nombreux problmes graphiques soulevs par
la mise en uvre interactive des contraintes dintgrit.
7.1. La qualit dans les bases de donnes gographiques
7.1.1. Le problme gnral de la qualit dans les bases de donnes gographiques
La connaissance de la qualit de la localisation dans les bases de donnes
gographiques devient de plus en plus importante pour assurer une bonne utilisation
de ces bases de donnes, avec notamment la multiplication des changes de donnes
entre les SIG. Il n'est plus rare en effet d'avoir travailler sur des donnes trs
htrognes, et il devient de plus en plus important de dfinir des critres de
contrle et de qualit pour la localisation des donnes gographiques et leurs
relations dans lespace. Ces critres ne peuvent pas se rsumer de simples
problmes de prcision, comme cela a t longtemps le cas pour la cartographie. Les
bases de donnes grent des collections dobjets, et l'attribut de localisation prend
ses valeurs dans un espace de dimension deux ou trois, ce qui introduit des critres
qui ne sont plus seulement lis une relation d'ordre, mais la structure de cet
espace : topologie, mtrique, relations ensemblistes, etc. [LAU 93]. Par exemple, le
respect des critres topologiques (fermeture, connexit, relations spatiales entre
objets) pourra contribuer faire la diffrence entre des donnes ne pouvant tre
utilises qu' des fins de dessin automatique et des donnes pouvant tre intgres
dans une base de donnes et utilises dans un systme d'information gographique.
Il n'existe pas de description simple de l'incertitude lie la modlisation de la
ralit par des objets et des collections dobjets gographiques. Cette modlisation
est nanmoins toujours lie une chelle gographique de description, qui associe
choix des attributs descriptifs et description de la localisation. Mais, lors de
lutilisation des objets, la description de la localisation peut ne plus correspondre
la description smantique de l'objet car les SIG donnent la possibilit de choisir une
chelle diffrente de l'chelle de validit pour l'utilisation et la mise en relation
d'objets. Ceci provoque bien sr des problmes de cohrence entre les objets
rsultant des traitements ainsi effectus. De nombreuses rponses ont t proposes

Contraintes d'intgrit spatiale

229

pour tenter de rsoudre les problmes d'intgrit et de cohrence lors de l'utilisation


des objets et de leur mise en relation [GOO 89] [ML 95]. Mais lorsque cela est
possible, il est plus efficace d'assurer la cohrence de la base de donnes
gographiques lors de la constitution des objets, en respectant des contraintes
d'intgrit spatiale qui ne dpendent que de la dfinition formelle des objets.
L'approche que nous proposons ici vise donc assurer la cohrence intrinsque
des objets dans une base de donnes gographiques. Cette cohrence ne dpend pas
des traitements effectus, elle dpend uniquement de la dfinition des objets par
rapport l'objectif de modlisation de la ralit. La dmarche s'inscrit donc dans
l'approche base de donnes [DAT 90].
D'une manire gnrale, l'information sur la qualit des donnes gographiques
peut tre dcompose en diffrents domaines : la gnalogie (information sur les
sources des donnes), l'actualit (validit temporelle), la cohrence logique (contrle
de l'intgrit des donnes), la prcision gomtrique, la prcision smantique,
l'exhaustivit [FAI 96]. Nous ne traiterons ici que de cohrence logique lie la
localisation : nous chercherons dcrire l'ensemble des contraintes d'intgrit
permettant de renseigner sur le degr de cohrence spatiale d'une base de donnes
gographiques. L'intgrit ne couvre pas le plus vaste domaine de l'erreur dans les
SIG, mais le respect des contraintes permet de minimiser la gnration d'erreurs lors
des traitements, permettant ainsi de grer ces erreurs de manire plus fiable [GOO
89], [GUP 95].
7.1.2. La cohrence spatiale
La cohrence spatiale s'exprime par rapport une modlisation de la ralit en
entits gographiques, correspondant la dfinition de collections d'objets
gographiques. Comme nous lavons dj vu au chapitre 3, une entit, ou collection
d'objets gographiques, sera dfinie par :
un type de localisation (classiquement : zone, ligne, point, pixel),
des attributs descriptifs (la description smantique des objets),
des relations et des contraintes spatiales entre les objets.
Ds lors, on peut donc exprimer la cohrence spatiale selon ces trois
composantes : une cohrence gomtrique (adquation entre la description
gomtrique des objets et le modle gomtrique dfini pour la collection), et une
cohrence smantique (adquation entre modlisation de la ralit d'une part et
relations entre les objets d'autre part). Les rgles d'intgrit spatiale visent assurer
ces deux niveaux de cohrence. Par exemple, assurer qu'un objet d'une collection
de type zone soit bien une zone (un domaine ferm de l'espace, cest une condition

230

Chapitre 7

gomtrique), que deux parcelles d'un cadastre ne se chevauchent pas (la condition
de non-intersection est smantique, et provient de la dfinition mme dun cadastre),
qu'un btiment appartienne une et une seule parcelle (cest galement une
condition smantique, mais qui porte sur les relations spatiales entre les objets de
deux collections distinctes).
7.1.3. Les contraintes d'intgrit spatiale
L'un des objectifs des SIG, en tant que systmes de gestion de collections
d'objets gographiques, est d'assurer la cohrence spatiale, au mme titre qu'un
systme de gestion de bases de donnes classique (SGBD) doit assurer la cohrence
et l'intgrit des donnes.
Le modle relationnel conventionnel (les attributs ne peuvent tre que
quantitatifs ou qualitatifs) est trs efficace dans le domaine de l'intgrit des donnes
et de la cohrence, et il a d'ailleurs t en partie conu dans cette optique. Il propose
des rgles d'intgrit permettant d'assurer la cohrence des donnes d'une base. Ces
rgles concernent l'unicit de la cl (existence et unicit d'un identifiant pour chaque
objet), les contraintes par rfrence entre relations (un ensemble d'attributs d'une
relation est dfini comme cl dans une autre relation), et les contraintes de domaine
(les valeurs d'un attribut doivent vrifier une assertion logique). On peut galement
tendre les contraintes par rfrence aux contraintes par jointures, en imposant des
contraintes de domaine au rsultat d'une jointure entre deux relations [GAR 84].
On a donc tout intrt tendre les contraintes dintgrit du modle relationnel
conventionnel de nouveaux types d'objets - avec l'introduction de la localisation
comme attribut. Le modle relationnel nous guide alors naturellement dans la
modlisation de la ralit et dans la dfinition des contraintes d'intgrits lies ces
nouveaux types. En effet, si l'attribut de localisation est dfini comme une cl
primaire des collections d'objets localiss, il doit vrifier le principe d'unicit (qui
correspond alors au principe d'unicit d'un phnomne dans l'espace-temps : au
mme moment, on ne peut avoir deux objets de la mme collection au mme
endroit). Les contraintes de domaine peuvent tre tendues la dimension 2, la
fois sur la gomtrie (position) et sur la topologie (fermeture, simplicit, connexit,
relations entre objets voisins). Les contraintes par rfrence peuvent galement tre
tendues la dimension 2, notamment au niveau de la gomtrie (contours
communs, hirarchie entre objets). Enfin, des contraintes par jointure peuvent
galement tre proposes, en utilisant la localisation comme attribut de jointure
entre les objets (une bouche d'gout ne peut se trouver que dans une rue : le rsultat
d'une jointure gomtrique entre bouches d'gout et immeubles doit tre vide).
D'une manire gnrale, les contraintes d'intgrit spatiale sont exprimes sur les
attributs des objets, que ces attributs concernent la description ou la localisation. Le

Contraintes d'intgrit spatiale

231

modle relationnel tendu nous fournit donc tous les principes permettant
d'exprimer la cohrence spatiale d'une base de donnes gographiques
indpendamment du modle gomtrique interne au SIG.
Le modle objet supprime la notion de domaine pour les attributs, puisqu'un
attribut peut lui-mme tre un identifiant d'objet d'une autre classe. De ce fait, les
contraintes d'intgrit sont plus difficiles dfinir et mettre en uvre pour les
bases de donnes orientes objet que pour le modle relationnel. Nanmoins, il
convient de respecter des contraintes d'intgrit dans le cadre du modle orient
objet, sous peine de dgrader considrablement les objectifs assigns aux SGBD et
de perdre les bnfices acquis du relationnel [BEN 93].
On peut tablir pour le modle objet des rgles de cohrence encapsules comme
les mthodes : la dfinition d'une classe peut inclure la dfinition de mthodes de
cohrence sur et entre les membres de la classe. Ainsi, lorsqu'une classe drive d'une
autre, et que ces deux classes possdent un attribut de localisation (hirarchie de
dcoupage par exemple), on devrait pouvoir exiger que ces attributs suivent la
hirarchie des objets (par exemple, les arcs des objets d'une classe sont forcment
des arcs des objets d'une classe qui en drive).
7.2. Les contraintes d'intgrit pour les bases de donnes
Les contraintes d'intgrit permettant d'assurer la cohrence spatiale d'une base
de donnes vont donc s'exprimer dans le cadre du modle relationnel tendu aux
donnes localises. Nous allons dcrire comment ces contraintes s'expriment pour
les objets et les collections d'objets dans les bases de donnes gographiques.
7.2.1. Le cadre relationnel
Nous avons vu que la localisation des objets gographiques s'exprime soit par
des lments de l'espace (pour les objets dont la localisation peut tre ramene un
point), soit par des sous-ensembles de l'espace (lignes ou zones).
La schmatisation gomtrique de la localisation des objets gographiques en
zone, ligne, point, pixel tablit une classification naturelle sur laquelle repose la
fois l'extension du modle relationnel et la dfinition de classes d'objets
gographiques pour le modle objet. Toutes les considrations ultrieures seront
bases sur la classification en zone, ligne, point, pixel, classification qui permet de
schmatiser la gomtrie des objets gographiques et de dfinir des collections
dobjet du mme type.

232

Chapitre 7

Un arc n'est pas un objet gographique, mais seulement un objet gomtrique.


Les contraintes d'intgrit gomtrique sont exprimes sur les points et les arcs,
c'est--dire sur les objets gomtriques qui permettent de dfinir la localisation des
objets gographiques.
7.2.2. Les contraintes d'intgrit
L'un des objectifs des SGBD, c'est d'assurer le maintien et la cohrence des
donnes par rapport aux schmas (contrle des types), ainsi que la cohrence des
donnes entre elles (par exemple, un enfant de moins de cinq ans ne peut avoir un
niveau d'tude lev). On appelle contrainte d'intgrit toute rgle que doivent
suivre les donnes, pour spcifier les valeurs permises pour certaines donnes,
ventuellement en fonction d'autres donnes.
L'une des contraintes d'intgrit souvent utilise est la contrainte d'unicit de cl:
on impose l'existence d'une cl (identifiant unique) pour tout objet d'une entit. Tout
objet d'une entit vrifiant cette contrainte devra donc avoir une valeur bien
dtermine (et unique) pour cette cl.
On dfinit galement les contraintes dites de rfrence : on impose une
association de n'associer que des objets existants dans la base (par exemple, un acte
de vente ne peut tre enregistr que si l'acheteur et le bien existent dj dans la
base).
Les contraintes les plus courantes sont les contraintes de domaine : on prcise le
domaine de variation de l'attribut (par exemple, lge d'une personne est compris
entre 0 et 140). La contrainte peut tre plus complexe, et faire appel aux valeurs de
plusieurs attributs. Elle se prsente alors comme une assertion logique qui doit tre
vrifie pour l'ensemble des objets de la relation. On peut tendre les contraintes de
domaine aux contraintes par jointure : c'est alors le rsultat d'une jointure entre deux
relations qui devra rpondre une contrainte de domaine (par exemple, un fils ne
peut pas tre plus g que son pre).
7.2.3. Les contraintes d'intgrit pour les donnes localises
Lorsque les attributs sont de type simple, comme c'est le cas dans les SGBD
classiques, les contraintes d'intgrit s'expriment par des assertions logiques fondes
sur l'galit ou la relation d'ordre en dimension 1, comme toute opration algbrique
sur les attributs.
Lorsque l'on tend le modle aux donnes gographiques, l'attribut de
localisation doit lui aussi tre soumis des contraintes d'intgrit. Ces contraintes

Contraintes d'intgrit spatiale

233

s'expriment alors dans l'espace, soit par des assertions ensemblistes (appartenance,
intersection, etc.), soit par des assertions topologiques (voisinage, fermeture,
connexit, etc.), soit par des assertions mtriques (contraintes sur les distances entre
objets). Par exemple, la contrainte d'unicit de cl est fondamentale pour une bonne
modlisation de la ralit en entits gographiques, car cette contrainte pour la
localisation permet d'assurer l'unicit d'un phnomne en un lieu, et d'tre sr que la
localisation de tout objet gographique est bien dfinie.
Les contraintes d'intgrit peuvent porter sur l'attribut de localisation lui-mme,
mais la localisation peut galement tre utilise comme attribut de jointure pour
exprimer une contrainte de domaine entre attributs descriptifs simples (par exemple,
un immeuble de huit tages ne peut se trouver dans une zone limite deux tages).
Les contraintes d'intgrit interviennent lors de la constitution de la base de
donnes. La saisie des donnes graphiques correspondant la localisation doit ainsi
prendre en compte ces contraintes pour assurer la cohrence de la base, sachant que
toute modification ultrieure est particulirement dlicate. Dans le paragraphe
suivant, nous allons dcrire, pour l'attribut de localisation, l'ensemble des contraintes
d'intgrit qui peuvent tre ncessaires la bonne cohrence d'une collection
d'objets localiss. Certaines contraintes sont ncessaires et doivent toujours tre
vrifies. Les autres sont optionnelles, mais les SIG devraient proposer un
formalisme (langage et mthodes) pour permettre leur mise en uvre lors de la
constitution ou la modification d'une base de donnes [LAU 91], [UBE 96].
7.3. Les contraintes dintgrit spatiale
7.3.1. Une typologie des contraintes dintgrit spatiale
Nous allons tudier les contraintes d'intgrit portant sur l'attribut de localisation
selon la classification suivante :
les contraintes gomtriques, portant sur les composants gomtriques servant
schmatiser les objets gographiques (arc, point, segment) : simplicit, extrasimplicit, ultra-simplicit ;
les contraintes topologiques de type, permettant d'assurer l'intgrit
gomtrique d'un objet, en fonction de son type : forme de l'objet, relations entre les
lments gomtriques constituant un objet, (fermeture, connexit, centrode). Ces
conditions dpendent du type de localisation (zone, ligne, point, pixel) ;
les contraintes relationnelles, permettant d'assurer l'intgrit d'une collection
d'objets par rapport sa dfinition smantique : unicit de cl (existence et unicit
d'un objet en un point), appartenance un domaine (assertion logique sur l'attribut
de localisation), contraintes de voisinage (assertion logique sur les couples d'objets

234

Chapitre 7

d'une mme collection, rpondant un critre topologique ou mtrique), relations


gomtriques entre les objets d'une collection ;
les contraintes topologiques de jointure : contraintes topologiques entre les
objets de deux collections (assertion topologique sur les couples d'objets rsultant
d'une jointure gomtrique entre deux collections : intersection, inclusion, position,
hritage, etc.) ;
les contraintes descriptives de jointure : contraintes descriptives (assertion
logique sur les attributs descriptifs des couples d'objets rsultant d'une jointure
gomtrique entre deux collections), contraintes d'hritage (par exemple, un canton
ne peut avoir plus d'habitants que le dpartement auquel il appartient).
Les contraintes gomtriques et topologiques de type correspondent la
cohrence gomtrique. Les contraintes relationnelles et topologiques de jointure
correspondent la cohrence smantique. Certaines contraintes gomtriques ou
topologiques de type devront toujours tre vrifies (par exemple, une zone doit
toujours tre ferme), d'autres dpendent de la dfinition smantique de la collection
(un rseau routier doit toujours tre connexe, mais un rseau tlphonique peut ne
pas l'tre). Du fait des rpercussions immdiates de leur non-respect, les contraintes
gomtriques et topologiques de type sont celles qui ont t mieux tudies [EGE
91], [HAD 92], [LAU 91 93 94], [UBE 96], [TAN 95].
Cette typologie des contraintes d'intgrit est fonctionnelle : elle est
indpendante du mode de stockage et de reprsentation interne des objets, et ne
prend pas en compte les particularits d'un systme par rapport un autre. Par
contre, leur mise en uvre sera fonction du mode de reprsentation interne utilis
par le systme de gestion de ces objets [LAU 93].
7.3.2. Les contraintes gomtriques
Les contraintes gomtriques s'expriment sur les points ou les arcs servant
schmatiser les objets gographiques. Rappelons que les arcs sont constitus de
segments, les extrmits des segments sont appels points de larc, et les deux points
extrmits de larc sont appels des nuds. Nous pouvons dfinir les conditions
gomtriques ou topologiques sur les arcs et les points, conditions qui nous
serviront exprimer les contraintes d'intgrit sur les objets gographiques euxmmes :
la simplicit d'un arc : l'arc ne doit pas avoir d'intersection avec lui-mme
(aucun des segments qui le constituent ne doit recouper un autre segment qui le
constitue). Cette contrainte sexprime sur larc lui-mme, et ne fait pas intervenir
dautres objets (fig. 7.1).

Contraintes d'intgrit spatiale

arc simple

235

arc non simple

fig. 7.1 : Simplicit des arcs

On imposera pratiquement toujours aux arcs d'tre simples, mme si cette


condition n'est pas ncessaire du point de vue de la cohrence des objets. Mais elle
simplifie les oprations sur les arcs, notamment dans les cas o le sens de l'arc est
pris en compte.
l'extra-simplicit d'un arc : l'arc ne doit avoir d'intersection avec aucun autre
arc constituant un objet de la mme collection (seuls les nuds peuvent tre des
points communs entre les arcs de la relation) (fig. 7.2).

les arcs sont extra-simples

les arcs ne sont pas extra-simples

fig. 7.2 : Extra-simplicit des arcs

l'ultra-simplicit d'un arc par rapport une autre collection : l'arc ne doit avoir
d'intersection avec aucun arc constituant un objet de cette autre collection.

236

Chapitre 7

inclusion d'un arc : un arc est inclus dans un autre si tous les points de l'arc
appartiennent l'autre arc et si deux points conscutifs dans l'arc inclus sont deux
points conscutifs dans l'autre l'arc.
fermeture : un ensemble d'arcs est dit ferm s'il existe un chemin ferm
constitu par ces arcs (fig. 7.3).

ensemble d'arcs ferms

ensemble d'arcs non ferms

fig. 7.3 : Fermeture dun ensemble darcs

connexit : un ensemble d'arcs est dit connexe s'il existe un chemin connexe
constitu par ces arcs (fig. 7.4).

ensemble d'arcs connexe

ensemble d'arcs non connexe

fig. 7.4 : connexit dun ensemble darcs

La plupart des systmes imposent ds la saisie graphique des conditions de


connexit sur les arcs, qu'ils soient composants d'une zone ou d'une ligne, le critre
de connexit tant uniquement fonction de la distance sparant leurs nuds. Si les
nuds de deux arcs sont proches (leur distance est infrieure un seuil donn), alors
ces deux nuds doivent tre identiques (les arcs doivent appartenir une mme
composante connexe). Les systmes assurent alors automatiquement cette contrainte
en modifiant la position des nuds.

Contraintes d'intgrit spatiale

237

Dans une base de donnes gographiques, on doit imposer aux objets


gomtriques, arcs et points, dappartenir des objets gographiques : les nuds ou
arcs isols (dit baladeurs ou libres ) sont interdits.
7.3.3. Les contraintes topologiques de type
Les contraintes topologiques de type sont les mieux respectes, sous peine de
dgradation considrable de la validit des oprations spatiales les plus simples.
Elles concernent les objets de type zone et de type ligne. Il n'y a aucune contrainte
topologique de type sur les objets point ou sur les objets pixel.
7.3.3.1. Fermeture et centrode
On impose aux zones d'tre par dfinition des ferms de l'espace : les arcs
dcrivant une zone doivent donc toujours constituer un chemin ferm, dfinissant la
zone de manire unique. Cette condition doit imprativement tre vrifie pour
assurer la bonne cohrence des objets zone, et permettre les calculs gomtriques ou
topologiques (primtre, surface, remplissage, etc.). Les arcs dcrivant une zone
doivent galement tre simples.
On impose galement toujours la condition d'appartenance du centrode la
zone, par dfinition mme du centrode (un point appartenant un objet de type
zone et reprsentant le centre de la zone).
On peut galement demander aux objets ligne dtre ferms : les arcs dcrivant
la ligne doivent alors constituer un chemin ferm.
7.3.3.2. Connexit
On peut demander aux zones d'tre connexes (une zone est alors reprsente par
un seul polygone). Cette condition n'est pas toujours requise, certains systmes
acceptant que l'objet zone ne soit pas forcment connexe. La connexit est alors une
exigence qui dpend de la dfinition smantique de la collection d'objet, et non pas
du type.
On peut imposer aux rseaux d'tre connexes. Les objets sont alors des lignes
qui doivent tre relies entre elles pour former un graphe connexe. D'une manire
plus gnrale, un objet constitu de plusieurs lignes forme un graphe. On peut
imposer cet objet d'avoir des proprits topologiques correspondant cette
structure de graphe : fortement connexe (cas gnral des rseaux routiers),
symtrique, complet, planaire.
Toujours dans le cas des lignes, on peut assortir la condition gomtrique de
connexit de deux arcs d'une condition sur la valeur des lignes auxquelles

238

Chapitre 7

appartiennent les arcs. Par exemple, deux courbes de niveaux doivent tre relies si
elles ont un nud proche et si et seulement si elles ont mme valeur.
7.3.3.3 Surface et primtre
On peut imposer une contrainte descriptive sur la surface, sur le primtre (pour
les zones), ou sur la longueur (pour les lignes) d'un objet. C'est en fait une contrainte
descriptive classique, puisque la surface, le primtre, la longueur sont des attributs
numriques classiques, leur seule particularit tant de pouvoir tre calculs
directement partir de la gomtrie des objets.
7.3.4. Les contraintes relationnelles
Les contraintes relationnelles concernent la cohrence smantique dune
collection dobjets. Elles font donc appel aux relations gomtriques ou
topologiques entre les objets dune mme collection.
7.3.4.1. Contrainte d'unicit de cl
Du fait mme de la dfinition dune entit gographique, la localisation (espace
et temps) doit tre considre comme une cl primaire d'une relation localise. En
effet, si tel n'est pas le cas, on pourrait avoir dans une mme relation deux objets
diffrents mais situs au mme endroit. Dans une base de donnes gographiques,
cette ventualit relve d'une mauvaise schmatisation de la ralit et d'une
mauvaise dfinition des objets. On doit donc imposer la localisation d'tre une cl,
et la relation de satisfaire la contrainte d'unicit de cl pour cet attribut. Cela
signifie simplement que tout objet doit tre localis et que cette localisation doit tre
connue pour que l'objet soit prsent dans la base, et que deux objets d'une mme
relation ne peuvent partager le mme lieu. Cet identifiant d'objet n'est pas forcment
directement visible par l'utilisateur de la base de donne, mais il doit exister : un
objet doit tre diffrenci d'un autre par sa localisation. On peut mme caractriser
une relation localise par cette contrainte, en disant quune carte doit tre une
tessellation du plan [PL 97].
La contrainte d'unicit de cl pour la localisation est forte. Elle assure dans les
bases de donnes relationnelles localises la mme fonction que le principe de
l'existence d'un identifiant d'objet dans les bases de donnes orient objet.
Ce principe doit galement tre respect dans les bases spatio-temporelles, et il
porte alors sur la localisation dans l'espace-temps (dans une relation, on ne peut
avoir deux objets au mme lieu et au mme instant). A un instant t fix, on retrouve
les contraintes sur la localisation du cas non temporel. On peut galement imposer
des contraintes d'intgrit sur la localisation dans l'espace-temps (par exemple, en

Contraintes d'intgrit spatiale

239

donnant une contrainte de domaine sur la vitesse de dplacement d'un objet). Dans
la suite, nous ne considrerons plus que les bases non temporelles (ou l'tat d'une
base temporelle un instant t fix).
La contrainte d'unicit de cl pour les points ne pose aucun problme : on ne
peut pas avoir dans une relation de type point deux objets distincts au mme endroit.
Cette condition est facilement vrifiable.
La contrainte d'unicit pour les lignes impose deux lignes d'une mme relation
de n'avoir aucune intersection. Deux lignes ne peuvent donc se rencontrer qu'aux
extrmits de leurs arcs (sur les nuds), et ne doivent donc pas se croiser : tous les
arcs doivent vrifier la condition d'extra-simplicit. Par contre, il n'est pas forcment
requis un arc d'tre simple (une ligne peut se croiser sur elle-mme). Il est parfois
normal que des lignes se croisent (par exemple, c'est souvent le cas dans un rseau
de rues avec les passages souterrains ou ariens), mais elles ne se croisent alors que
dans leur projection en deux dimensions : une bonne schmatisation de la ralit
doit, dans ce cas, prendre en compte trois dimensions dans l'espace, et le principe
d'unicit est alors vrifi.
La contrainte d'unicit pour les zones impose deux zones quelconques d'une
mme relation d'avoir une intersection vide. On considre que les points des arcs
servant dfinir les zones n'appartiennent pas la zone : deux zones peuvent donc
partager les arcs qui les constituent (ils acquirent alors le statut topologique de
frontire), mais les domaines ouverts (le domaine ferm moins les frontires)
constitus par ces arcs doivent avoir une intersection vide. Deux arcs constituant des
zones d'une mme relation ne peuvent donc pas se croiser : tous les arcs doivent
vrifier le principe d'extra-simplicit ou d'inclusion.
On aura donc divers problmes rsoudre, dpendant du mode de saisie
graphique. Les erreurs d'extra-simplicit proviennent souvent d'arcs saisis par erreur
deux fois ou d'une mauvaise prcision dans le raccord des nuds. On a galement
des problmes d'extra-simplicit, d'inclusion et de fermeture lorsque des arcs sont
frontires de zones appartenant des documents diffrents.
7.3.4.2. Contrainte d'appartenance un domaine
On peut imposer aux objets d'une relation d'appartenir un domaine de l'espace.
Cette condition correspond la condition classique de vrification d'une assertion
logique pour les donnes de dimension 1, l'assertion portant ici sur l'attribut de
localisation et pouvant tre exprime soit sous forme ensembliste, soit sous forme
mtrique, suivant la dfinition du domaine. Cette contrainte permet galement de
sassurer de la validit des coordonnes des points : tous les objets situs sur le
globe terrestre doivent vrifier une contrainte minimum (longitude de 0 360,
colatitude de 0 90).

240

Chapitre 7

7.3.4.3. Contraintes descriptives de voisinage


On peut imposer une contrainte sur les valeurs d'un attribut en fonction d'une
condition de voisinage entre objets d'une mme collection. En gnral, on fixera des
conditions sur l'cart entre les valeurs pour deux objets voisins. Ce type de
contrainte intervient par exemple pour les courbes de niveaux : la diffrence des
valeurs de deux courbes voisines ne doit pas dpasser une valeur d'quidistance
donne. Dune manire plus gnrale, on peut imposer un attribut descriptif de
satisfaire une proprit fonctionnelle par rapport la position dans lespace (par
exemple, continuit uniforme).
Il faut dfinir la condition de voisinage pour chaque type d'objet, par exemple :
deux lignes sont voisines s'il existe un segment de droite reliant un point dans
chaque ligne et ne coupant aucune autre ligne (ou encore si tout segment de droite
reliant la ligne une autre ligne coupe l'autre ligne),
deux points sont voisins au sens de Vorono (ils sont contigus dans le graphe
dual de Delaunay),
deux zones sont voisines s'il existe un arc frontire appartenant aux deux
zones,
deux pixels sont voisins sils ne sont spars que dune maille.
Par exemple, imposer un modle numrique de terrain de ne pas contenir de
cuvette (un point plus bas que tous ses voisins) est une contrainte descriptive de
voisinage qui permet dassurer la validit de nombreux calculs en hydrologie (cest
un des rares exemples de contraintes dintgrit sur les objets de type pixel).
7.3.4.4. Contraintes topologiques
Les contraintes topologiques concernent les relations topologiques entre deux
objets dune mme collection. Comme les objets dune mme collection sont de
mme type (zone, ligne, point, pixel), et que, pour une bonne modlisation de la
ralit, ils doivent de plus satisfaire au principe dunicit de cl (pas dintersection
entre les objets dune mme collection), les contraintes topologiques au sein dune
mme collection ne concernent donc que ladjacence et la connexit.
On peut ainsi contraindre une collection zonale tre une tessellation de
lespace (contrainte dadjacence) : les arcs schmatisant les zones doivent alors
constituer un graphe planaire.
Pour les collections de type ligne, les contraintes de connexit ne concernent pas
seulement les arcs dun objet isol, mais portent sur tous les objets entre eux.
Lensemble des objets doit alors rpondre une condition topologique : former un
graphe connexe, fortement connexe, symtrique, complet, planaire.

Contraintes d'intgrit spatiale

241

Il ny a pas de contraintes topologiques sur les collections de type point ou pixel.


7.3.4.5. Contraintes mtriques
Les contraintes mtriques suivent le mme principe que les contraintes de
voisinage, mais les conditions topologiques sont remplaces par des conditions sur
la distance entre les objets. La distance entre deux zones ou deux lignes est dfinie
comme le minimum des distances entre tous les points des deux objets
(d(O1,O2)=min(d(x,y),x O1,y O2).
7.3.5. Les contraintes de jointure
Les contraintes spatiale de jointure sont des conditions que l'on impose entre les
objets de deux collections distinctes, soit directement sur les relations spatiales entre
objets, soit sur les valeurs des couples d'objets rpondant un critre spatial. Si les
contraintes portent uniquement sur les relations spatiales entre objets (intersection,
inclusion, position respective, distance, etc.), on parle de contrainte topologique (par
exemple, une route ne doit pas avoir d'intersection avec un immeuble, une bouche
d'gout doit se trouver dans une rue, etc.). Si les contraintes portent sur les valeurs
des couples d'objets rpondant un critre de localisation, on parle de contrainte
descriptive (par exemple, le nombre d'tage d'un immeuble ne doit pas dpasser le
nombre d'tage permis par la zone de rglementation auquel l'immeuble appartient).
On nomme ces contraintes d'intgrit spatiale contraintes de jointure, car elles
correspondent des conditions topologiques, mtriques, ou descriptives sur le
rsultat d'une jointure gomtrique entre deux collections d'objets localises.
Les objets mettre en relation appartiennent des collections diffrentes, et ces
collections peuvent tre de type gographique diffrent. Nous allons donc d'abord
tudier l'expression des relations spatiales entre entits gographiques quelconques,
avant d'tudier la mise en uvre formelle des contraintes d'intgrit par jointure
spatiale.
7.3.5.1. Les relations spatiales entre objets gographiques
Pour modliser la ralit, il n'est pas suffisant de dfinir des entits
gographiques. Il faut galement dfinir des relations spatiales entre ces entits. Ces
relations spatiales sont importantes, notamment pour la reprsentation des
connaissances [FRA 93] [EGE 90], le raisonnement spatial [FRA 96] [EGE 94], et,
bien sr, les contraintes d'intgrit spatiale [UBE 96]. Elles peuvent tre classes de
la manire suivante [PUL 88][EGE 89] :
les relations bases sur un ordre spatial li la dfinition dune origine ou dun
axe (par exemple, une direction),

242

Chapitre 7

les relations topologiques qui dcrivent voisinages et proprits ensemblistes


(par exemple, disjoint, adjacent, intersecte),
les relations mtriques lies une distance.
Les relations topologiques ont donn lieu de nombreux travaux, car ce sont les
plus importantes vis vis du raisonnement et de la cohrence spatiale [EGE 90]
[FRA 92b] [CLE 93] [CUI 93] [BOU 94] [MOL 94] [FRA 96]. Ainsi, plusieurs
modles thoriques de reprsentation des relations topologiques ont t proposs :
le modle des 9-Intersections, qui sappuie sur les notions topologiques
dintrieur et de frontire : une relation topologique entre deux objets est dcrite par
les 9 intersections de lintrieur, la frontire, et lextrieur du premier objet avec
lintrieur, la frontire, et lextrieur du second objet.
le modle RCC (Region Connection Calculus) utilise une approche
axiomatique fonde sur le calcul de prdicats du premier ordre. La base du
formalisme est la relation de connexion x est connect y , qui signifie que les
ensembles x et y partagent un point. Un ensemble dautres relations est dfini
partir de cette relation de connexion [CUI 93] [COH 93].
le modle CBM (Calculus Based Method), qui, partir de cinq relations
ensemblistes (touch, in, overlap, disjoin, cross) et doprateurs de frontires, permet
de coder toutes les situations topologiques entre deux objets [CLE 95].
Afin de faciliter lutilisation des modles de reprsentation, on peut grouper les
relations topologiques en fonction du type de lobjet et du type de relation [UBE
97]. La dfinition mathmatique comprend les notations suivantes : pour un
ensemble Y, Y reprsente lintrieur, Y reprsente la frontire, Y- reprsente
lextrieur. Le type polygone correspond au type zone limit aux domaines
connexes de genre 1 (zones sans trou). Le nombre de relations indique le nombre de
cas possibles de relations topologiques diffrentes pour chaque regroupement
(daprs [UBE 97]).

Nom de la relation
EGALITE
DISJOINT

Le groupe Point / Point


Dfinition mathmatique
(P1 P2 = 0)
(P1 P2 = )

Nombre de
relations
1
1

Le groupe Point / Ligne


EXTREMITE
SUR
DISJOINT

(P L = 0)
(P L = 0)
(P L = )(P L = )
Le groupe Point / Polygone

1
1
1

Contraintes d'intgrit spatiale


DANS
SUR
DISJOINT

(P R = 0)
(P R = 0)
(P R = )(P R = )
Le groupe Ligne / Ligne

CROISE

(L1 L2 = 0)

11

JOINT

(L1 L2 = 0)

14

RENCONTRE

(L1 L2 = 0)

23

COUVRE

(L1 L2 = 1)

13

DISJOINT

(L1 L2 = )(L1 L2 = )

243

1
1
1

(L1 L2 = )(L1 L2 = )
DANS
DEHORS
CROISE
RENCONTRE
BORDE
DISJOINT

Le groupe Ligne / Polygone


(L R = 1)(L R = )
(L R = )
(L R = 1)(L R = 1)
(L R = 0)(L R 1)
(L R = 1)
(L R = )(L R = )
(L R = )
Le groupe Polygone / Polygone

9
10
12
11
13
1

CONTIENT-DANS

(R1 R2 = 2)(R1 R2 = )

DEHORS

(R1 R2 = )
(R1 R2 = 2)(R1 R2 = 1)

RECOUVRE

2
1

BORDE

(R1 R2 = 1)
(R1 R2 = )(R1 R2 = 0)
(R1 R2 = )(R1 R2 = 1)

DISJOINT

(R1 R2 = )(R1 R2 = )

RENCONTRE

7.3.5.2. Les contraintes topologiques


Les contraintes topologiques permettent de spcifier quelles relations
topologiques sont interdites ou imposes entre les entits gographiques de la base
de donnes. Elles nimposent de contraintes que sur la localisation des objets. La
difficult de mise en uvre vient de la description des situations par des relations
topologiques lmentaires ou des regroupements de relations. Des langages de
contraintes ont ainsi t proposs par plusieurs auteurs [HAD 92] [UBE 97].
Les contraintes topologiques les plus courantes sont nanmoins assez simples,
comme par exemple les contraintes dinclusion des objets dune entit dans les
objets dune autre entit (pour un cadastre, les btiments doivent tre inclus dans les

244

Chapitre 7

parcelles), ou les contraintes de non-intersection (les rues ne doivent pas croiser les
parcelles).
7.3.5.3. Les contraintes descriptives
Ces contraintes s'expriment sur un attribut descriptif obtenu par jointure
gomtrique entre deux collections (mise en relation d'objets par leur localisation).
Elles n'imposent pas de conditions sur la localisation, mais sur les valeurs des
attributs des couples d'objets qui satisfont une condition topologique ou mtrique
de jointure. Ce sont des contraintes sur le rsultat descriptif de vritables requtes
spatiales : zone dans zone, point dans zone, agrgation, zones adjacentes,
dispersion
Par exemple, on peut imposer un immeuble de n'avoir pas plus d'tages que ne
le permet la zone d'occupation du sol dans laquelle il se trouve (pour mettre en
uvre cette contrainte, il faut, pour chaque immeuble, calculer par go-jointure le
nombre d'tages maximum de la zone d'occupation du sol dans laquelle il se trouve,
et comparer avec le nombre d'tages de l'immeuble). On peut imposer un modle
numrique de terrain de ne pas prsenter de diffrences de valeurs avec des valeurs
ponctuelles daltitude (cette contrainte correspond la condition dgalit -ou de
faible diffrence- sur le rsultat dune qui-jointure gomtrique entre les deux
collections dobjets : des points cots, des pixels dun modle numrique).
Pour toutes les contraintes d'intgrit faisant intervenir une distance, par jointure
ou par appartenance, on peut introduire une incertitude de manire grer
l'incertitude de la mesure de la localisation (la prcision gomtrique). La
propagation de cette incertitude rend les contraintes moins fortes et permet ainsi
d'viter les rejets injustifis dans les contrles de cohrence.
7.4. Modles gomtriques et mise en uvre des contraintes dintgrit spatiale
Jusqu' prsent, nous avons tudi les contraintes spatiales indpendamment de
la structure interne et des mthodes de stockage des lments graphiques dans tel ou
tel systme. En fait, les mthodes de stockage sont essentiellement construites de
manire faciliter les contrles de cohrence. Par exemple, la mthode de stockage
la plus simple (de type dessin o tous les lments sont mlangs) ne permet aucun
contrle de cohrence : c'est un problme constant dans les SIG que de rcuprer
des cartes digitalises sans aucune relation avec la structure de la base de donnes.

Contraintes d'intgrit spatiale

245

7.4.1. Les diffrentes mthodes de stockage


Les modles de stockage peuvent tre classs en deux grandes familles : les
modles spaghetti, qui offrent uniquement des primitives gomtriques pour la
reprsentation des objets gographiques, et les modles topologiques, qui
conservent la fois des primitives gomtriques et des relations topologiques entre
les primitives ou les objets gographiques. Plus le modle est simple, plus le cot de
la digitalisation est faible, et plus le stockage est direct. A l'inverse, si le modle est
peu structur, il n'offre que peu de contrle au niveau des objets, et rend difficiles
sinon impossibles les recherches suivant un critre spatial.
7.4.1.1. Les modles spaghetti
Le modle le plus simple consiste stocker les lments graphiques sans aucune
structure : les points, les arcs, les libells, sont digitaliss comme du dessin. Seul
l'indication d'un niveau, ou d'un attribut graphique (comme une couleur ou un type
de symbole), permet de diffrencier l'appartenance une collection. Si la notion de
polygone n'est pas prsente, il est impossible de reconstituer les objets de type zone,
ou plus gnralement d'tablir une correspondance entre les objets gographiques et
les lments gomtriques qui dfinissent sa position dans l'espace. C'est le modle
spaghetti anarchique, qui ne permet pratiquement aucun contrle de cohrence.
Seuls des contrles de type gomtrique sur les arcs sont possibles (de type
simplicit ou extra-simplicit). Les documents de ce type sont malheureusement trs
nombreux, car souvent issus de logiciels de dessin, et donc digitaliss sans
structuration au pralable. Pour intgrer ces documents dans un SIG, il est souvent
ncessaire de recourir une dition : labelisation des objets, organisation des arcs en
polygones, sparation des niveaux et regroupement suivant les entits
gographiques. On arrive alors la notion de modle spaghetti simple, polygonal,
polygonal unifi, o l'lment gomtrique reste l'arc, mais structur par rapport
son appartenance un polygone. Ces modles ne conservent pas de topologie, mais
permettent en gnral de la reconstituer en utilisant les rfrences entre les objets si des contraintes gomtriques sont respectes, telle que fermeture des chemins,
simplicit, etc. La sparation des objets par entit gographique reste fondamentale
pour la vrification de la cohrence de l'ensemble. On est donc dans un cas o la
cohrence spatiale ne peut tre assure que par le respect de contraintes d'intgrit
gomtrique, souvent difficiles tablir et respecter du fait de la faible
structuration des lments graphiques digitaliss.
7.4.1.2. Les modles topologiques
On parle de modle topologique lorsque l'on introduit des relations topologiques
d'adjacence, de frontire ou de connexit dans la description gomtrique des objets.
On peut ainsi conserver les relations de connexion entre arcs, les relations entre arcs
et nuds, l'appartenance d'un arc un polygone, etc. Le modle le plus rpandu

246

Chapitre 7

s'appuie sur les notions de points, de nuds et d'arcs, avec des relations entre les
points initiaux, les points finals, les faces gauche et droite, et les arcs sortants,
gauche et droit (modle surfacique planaire).
Les modles topologiques offrent alors de nombreuses possibilits de contrle
de cohrence, grce la conservation explicite des relations d'adjacences et de
connexions entre arcs. Mais, comme pour les modles spaghetti, la cl d'un bon
contrle de cohrence est la bonne gestion des entits gographiques : on peut alors
vrifier la cohrence pour les objets d'une mme collection avant de vrifier la
cohrence entre collections, en suivant les principes que nous avons noncs dans
les paragraphes prcdents. Il est pour cela essentiel de structurer les documents en
fonction de la dfinition des entits gographiques avant de les digitaliser.
7.4.2. La vrification de la cohrence spatiale
Pour les contraintes gomtriques, les contraintes topologiques de type, et les
contraintes relationnelles, la vrification de la cohrence spatiale utilise des
oprations gomtriques simples. La difficult de mise en uvre vient donc plus de
la dfinition des contraintes et de la structuration de l'information que de la
ralisation informatique des oprations. Mises part les contraintes gomtriques,
toutes les oprations de vrification de la cohrence spatiale exigent de pouvoir
reconstituer les relations entre les objets et les lments graphiques utiliss pour la
description de leur localisation. Cette reconstitution est d'autant plus simple que le
modle gomtrique utilis est plus complexe. Une fois cette reconstitution
effectue, les contrles de cohrence utilisent des oprations gomtriques
lmentaires, telles que :
les contrles de simplicit et d'extra-simplicit bass sur la recherche
d'intersections entre segments d'arcs,
pour les objets de type point, les contrles d'unicit de cl faisant appel
uniquement des calculs de distance,
les contrles de fermeture bass sur des parcours d'arcs et donc sur des calculs
de distances et de parcours entre les nuds des arcs constituant un polygone,
pour l'unicit de cl concernant les objets de type zone, il faut assurer la
simplicit et l'extra-simplicit des arcs, et l'ajustement des frontires entre zones
adjacentes (union d'arcs),
les trous dans les zones sont des problmes relevant de l'unicit de cl (un trou
ne doit pas tre considr comme une autre zone, car deux zones d'une mme
collection partageraient alors un mme lieu). Certains systmes grent ce problme
par le sens des arcs des polygones, d'autres par la prise en compte directe de
l'adjacence. Le contrle gnral de l'unicit de cl pour les zones exigent de tester la
non-intersection de deux zones d'une mme collection. On peut utiliser pour cela, en

Contraintes d'intgrit spatiale

247

plus de la vrification d'extra-simplicit des arcs, une vrification de non-inclusion


par un algorithme de type y-x.
les contrles de connexion impliquant des calculs de distances entre nuds.
Les contraintes topologiques de jointure font appel en gnral des conditions
de non-intersection ou de non-inclusion entre objets dont les types peuvent tre
diffrents. Elles utilisent les mmes algorithmes graphiques que prcdemment :
vrification de l'extra-simplicit des arcs, non-inclusion, calculs de distance, etc.
7.5. SAVANE, saisie graphique et contraintes d'intgrit spatiale
Le systme SAVANE comprend un certain nombre de contrles d'intgrit
spatiale. Ces contrles se situent essentiellement au niveau de la saisie des donnes,
dans le module SAVEDIT. Ils concernent l'unicit de cl, la fermeture de zones, le
placement du centrode, la connexit, la simplicit des arcs, l'extra-simplicit des
arcs, les contrles de valeur, les contrles de jointure. Nous allons en dcrire
l'implmentation aprs avoir prsent rapidement le module de saisie.
7.5.1. Prsentation du module SAVEDIT
7.5.1.1. Les principes de la saisie graphique avec SAVEDIT
Le module SAVEDIT permet la saisie graphique sur cran, partir de
documents scanns puis gorfrencs (notamment grce au module SAVAMER,
comme nous lavons vu dans le chapitre prcdent). La saisie graphique doit suivre
la modlisation de la ralit et la structure de la base de donnes qui en dcoule :
chaque collection dobjet doit tre saisie sparment lune de lautre, et donnera lieu
la cration dun document spar. La saisie cre directement des documents dont
la structure est proche du modle de stockage topologique de SAVANE pour la
localisation : il ne sagit pas de saisie de type spaghetti, mais bien dune saisie avec
topologie permettant de nombreux contrles dintgrit, dont certains sont effectus
de manire interactive ou en arrire-plan.
chaque objet saisi sera affecte une valeur, correspondant un attribut de
lobjet servant de cl pour les autres attributs descriptifs. Cet attribut, nomm cl
dans le logiciel, servira dattribut de jointure lors de lintgration dans la base de
donnes des valeurs des autres attributs descriptifs de lobjet. SAVEDIT permet
galement de saisir directement une valeur numrique pour chaque objet (par
exemple, lors de la saisie de courbes de niveaux, on peut saisir directement la valeur
de la courbe dans un attribut numrique sans avoir passer par un identifiant
nominal, ce qui serait trs lourd. Aucune cl descriptive nominale nest saisie, et

248

Chapitre 7

aucune autre valeur, part celle directement saisie dans SAVEDIT, ne pourra tre
affecte aux objets dans la base de donnes).
Linterface utilisateur de SAVEDIT est identique celle du module SAVAMER.
Lors de lentre dans le logiciel, on indique une base de donnes, un utilisateur et
une vue externe. Une fois la base ouverte, lcran de SAVEDIT correspond un
espace gographique, dans lequel on peut dessiner des objets existants dans la base
de donnes, des documents dj saisis, des images gorfrences, et des fonds
graphiques gorfrencs, au format DXF. Cet espace gographique peut tre
modifi grce aux boutons de zoom de la barre doutils ou grce aux commandes du
menu WIND. Lutilisateur peut galement choisir la projection gographique parmi
les nombreuses possibilits qui lui sont offertes, et les objets de la base de donnes
seront dessins dans cette projection gographique.
La saisie seffectue ensuite, aprs avoir cr un document ou ouvert un
document existant. Cest lors de la cration dun document que lon doit indiquer le
type du document (zone, ligne, point) et le type de lidentifiant saisir pour chaque
objet (nominal, numrique). On peut galement indiquer un certain nombre dautres
paramtres facultatifs (nom de loprateur, datum, chelle de prcision). Le
processus de saisie est diffrent suivant le type du document. La saisie de points ou
de lignes est trs simple, la saisie de zone est un peu plus complexe. Des options de
visualisation sont disponibles pour tous les types de document (affichage de la cl
ou de la valeur des objets par exemple).
Le principe de la saisie est donc trs diffrent dun logiciel de saisie graphique
de type CAD. Avec SAVEDIT, les diffrents niveaux sont spars dans des
documents diffrents, chaque document correspondant aux objets dune relation de
la base. On nindique lors de la saisie aucun attribut graphique (de type couleur,
paisseur de trait, ), mais on doit donner pour chaque objet un identifiant
descriptif.
7.5.1.2. Saisie et indexation gographique
Comme nous lavons vu au chapitre 5, lindexation graphique dans la base de
donne utilise directement le dcoupage gographique en feuille ou coupure de
carte. Il convient donc de dfinir ou de conserver ce dcoupage lors de la saisie
graphique. La saisie des objets dune mme relation donne donc lieu en gnral la
cration de plusieurs documents de saisie, chaque document couvrant un espace
gographique donn, correspondant ce dcoupage en feuilles. Pour lefficacit la
fois du systme de saisie (SAVEDIT) et du systme dindexation dans SAVANE, il
est prfrable de ne pas dpasser un certain nombre dobjets par document (environ
2000 pour les zones, 5000 pour les lignes ou les points), mme si le systme de
saisie supporte un nombre dobjet par document bien suprieur (150000).

Contraintes d'intgrit spatiale

249

Si le contrle du dcoupage est assez simple lorsque lon saisit des objets partir
de cartes existantes, il est plus complexe lorsque les objets sont imports partir de
documents numriques saisis sur un autre systme nutilisant pas ces principes
dindexation. Dans ce cas, il faut utiliser les options de dcoupage automatique lors
de limportation.
7.5.1.3. La saisie de points
Le processus de saisie de points est trs simple : il suffit, une fois dans le mode
de saisie de points, de cliquer avec la souris sur lcran pour saisir un point. Le point
est valid, avec sa cl, lorsque lutilisateur appuie sur le bouton accepter du
dialogue de saisie (ou sur la touche Entre). Un point peut tre ensuite dplac,
supprim, ou sa cl modifie, lorsquil est slectionn par lutilisateur.
7.5.1.4. La saisie de lignes
La saisie de lignes est galement trs simple, chaque arc saisi correspondant un
objet. Pour saisir un arc, il suffit de saisir les points de larc (plusieurs modes de
saisie sont disposition de lutilisateur : point par point, en continu sur la distance
ou sur la surface entre trois points contigus), indiquer la valeur de la cl, puis
valider.
Un arc peut tre modifi par la suite : ajouter, dplacer ou supprimer des points,
filtrer, lisser, modifier la cl descriptive. On peut galement le couper en deux, le
dplacer, le fermer sur lui-mme, etc. Un menu contextuel contenant ces options
peut tre visualis lorsquun arc est slectionn dans lcran.
Certaines procdures permettent de rgler directement lors de la saisie de larc
des contraintes de connexit : une option permet de joindre automatiquement les
extrmits des arcs lorsque la distance est infrieure une valeur qui peut tre
paramtre, en pixels cran (la valeur absolue dpend donc de la fentre de
visualisation : plus le territoire de la fentre est troit, plus le pixel cran est grand,
en valeur absolue). De mme, dplacer lextrmit dun arc proche de lextrmit
dun autre arc va joindre automatiquement les deux arcs si loption est active.
7.5.1.5. La saisie de zones
La saisie de zones se fait en deux temps : dans un premier temps saisie des arcs
frontires de la zone, et dans un second temps saisie de lobjet zone lui-mme avec
indication de la valeur de la cl descriptive. La saisie dun arc seffectue
indpendamment de la zone, avec les mmes possibilits que pour la saisie darc
dans le cas des objets de type ligne. Par contre, lors de la dfinition de lobjet zone,
il faut indiquer la valeur de la cl descriptive ainsi que tous les arcs formant la
frontire de la zone. Un arc ne peut bien sr ntre frontire que de deux zones.

250

Chapitre 7

Comme pour les lignes, certaines options permettent dassurer directement des
contraintes de connexit lors de la saisie. Par exemple :
- jointure automatique des extrmits proches,
- cration automatique dun nouveau nud par division dun arc dj saisi,
lorsque lon saisit un nouveau nud proche de cet arc.
- cration automatique dun nud avec division des arcs chaque intersection
darcs.
De plus, certaines options de saisie darcs sont spcifiques aux arcs de
zones pour assurer la cohrence topologique :
- inclusion dun arc dans les arcs frontires dune zone,
- exclusion dun arc des arcs frontires dune zone,
- indication de visibilit (certains arcs, crs uniquement pour assurer la
fermeture des zones, ne devront pas tre visualis dans une reprsentation
cartographique).
- option permettant dassurer la persistance de la connexit des arcs, dans le cas
de modification dun nud (les extrmits des autres arcs sont alors galement
dplaces).
A chaque zone est affect un identifiant interne (un numro, partir de 20 ; les
20 premiers numros sont rservs). Chaque arc conserve les numros des deux
zones adjacentes dont il est frontire. Un arc est dit libre sil nest affect aucune
zone (ses deux numros de zones adjacentes ont pour valeur 0). Un arc est dit
pendant si lune de ses extrmits nest rattache aucun autre arc. Un document en
fin de saisie ne doit contenir ni arcs libres ni arcs pendants. Nous employons
indistinctement le terme bout ou nud pour dsigner lextrmit dun arc.
7.5.1.6. Saisie, datum et projection gographique
Chaque point saisi sur lcran est transform immdiatement en coordonnes
gographiques (longitude, colatitude) selon la projection gographique utilise.
Tous les points sont donc conservs en coordonnes sphriques. Le datum dun
document peut tre dclar pour information, et peut tre modifi par la suite : dans
ce cas, lutilisateur a le choix de transformer ou non les coordonnes des points
saisis. Ceci peut tre ncessaire car tous les objets dune base de donnes SAVANE
doivent tre exprims dans le mme datum. Si le document dorigine nest pas dans
le datum de la base de donnes dans laquelle il est destin tre intgr, il faut
dabord le saisir dans son datum dorigine, puis transformer toutes les coordonnes
saisies grce loption de changement de datum.
Le changement de datum utilise les formules de Molodensky telles quexposes
dans le chapitre 4.

Contraintes d'intgrit spatiale

251

7.5.2. Les contraintes sur les objets gomtriques


7.5.2.1. Les classes CArc et CSaveditDocument
La classe CArc de SAVEDIT permet dencapsuler lensemble des membres et
des procdures ncessaires la manipulation dun arc et la vrification des
contraintes gomtriques (A.4.1). Lallocation mmoire pour les points (tableau
m_ArrayPoint) est dynamique. Elle utilise les fonctionnalits de la classe CArray
de la MFC (Microsoft Fundation Class).
Toutes les variables et procdures lies au document de saisie sont regroupes
dans une classe nomme CSaveditDocument (A.4.2).
7.5.2.2. Nettoyage des arcs
De nombreux tests peuvent tre effectus pour viter davoir des arcs
inconsistants. On peut ainsi :
- liminer les arcs de moins de deux points (cas impossible en thorie, mais
pouvant provenir dun dfaut du logiciel),
- contraindre les coordonnes des points saisis rester dans des limites
gographiques donnes,
- liminer les arcs trop petits. Certains arcs trs petits peuvent tre crs
accidentellement par les options de division ou de jointure automatique, et sont
ensuite difficiles slectionner sur lcran pour les liminer manuellement.
Ces procdures ne posent aucun problme algorithmique. Elles sont
implmentes dans la mthode NettoyerTousLesArcs() de la classe
CSaveditDocument (A.4.2).
7.5.2.3. Simplicit
La simplicit des arcs est une contrainte qui doit toujours tre respecte, sous
peine dincohrence future, surtout lorsquil sagit darcs formant le contour de
zones. En effet, certains logiciels ne supportent pas les arcs qui ne sont pas simples
et crent automatiquement un polygone correspondant la boucle pour liminer le
problme. Mais cette solution nest pas agrable, car elle peut entraner des
incohrences avec des fichiers de valeurs descriptives. Le contrle de simplicit
teste pour chaque arc lintersection de tous les segments deux deux (fig. 7.5). Il
utilise la procdure SegmentIntersection() que nous avons vue au chapitre 3
(A.4.1).

252

Chapitre 7

fig. 7.5 : test de simplicit sur un arc dans SAVEDIT

7.5.2.4. Extra-simplicit
Lextra-simplicit teste lintersection de chaque arc avec tous les autres. On teste
pour cela lintersection de chaque segment dun arc avec les segments de tous les
autres arcs. Bien sr, les arcs qui ne peuvent avoir dintersection sont carts tout de
suite (on utilise le rectangle incluant larc), sinon le test serait trs long.
7.5.2.5. Fusion darcs
La fusion darc permet de rsoudre le problme de lincohrence entre deux
documents, ou dviter la saisie directe de portions darc en double. Cette procdure
peut tre active lors de la saisie (on parle alors de snapping), en correction sur un
arc, ou pour lensemble des arcs du document. En saisie, chaque point digitalis est
compar lensemble des arcs dj saisi ; sil existe un arc proche, cest--dire
une distance infrieure au minimum donn pour la fusion (cest un paramtre qui
peut tre choisi par lutilisateur), il est remplac par le point de larc en question. Ce
point est calcul en utilisant la procdure PointLePlusProche(). En correction, la
procdure est effectue sur lensemble des points de larc, arc qui est ensuite filtr
pour liminer les ventuels points en double. Effectu sur lensemble du document,
la fusion compare lensemble des arcs entre eux (A.4.1).
Dans le cas des zones, il faudra aprs la fusion liminer les arcs en double,
puisque la fusion cre des portions identiques au sein darcs diffrents.

Contraintes d'intgrit spatiale

253

7.5.2.6. Suppression darcs en double


Avec le modle topologique (arcs frontires), lune des erreurs les plus courantes
provient des arcs saisis en double. Un arc en double provoque une erreur dextrasimplicit, quelquefois difficile identifier car, si les deux arcs se recouvrent
exactement, lerreur nest pas visible lcran. Il convient dliminer les portions
darcs en double sans dtruire la cohrence de lensemble. Lalgorithme utilis dans
SAVEDIT teste, sur lensemble du document, les portions darcs identiques, et
dcoupe les arcs pour liminer lune des portions en question. La portion qui reste
sert alors de frontire aux deux zones concernes. La procdure seffectue en
plusieurs
tapes,
grce

de
SupprimerLesArcsEnDouble()
CSaveditDocument (A.4.2) :
- pour chaque arc, chercher les autres arcs qui peuvent avoir une intersection,
- si un arc est candidat, rechercher partir de lun des nuds un point commun,
- si lon a trouv un point commun, on recherche si les points suivants sont
galement communs, dans chacun des arcs. Pour le second arc, on doit tester dans le
sens de larc, puis dans le sens inverse, car les deux arcs nont pas forcment t
saisis dans le mme sens.
- si lon a trouv une squence commune, on dcoupe le premier arc en trois arcs
( moins que le premier point de la squence commune soit un bout de larc), le
second de mme, et lon limine lun des deux arcs correspondant la partie
commune.
7.5.2.7. Union darcs
Lunion darcs permet de regrouper plusieurs arcs pour en faire un seul. Elle
permet dallger le document en diminuant le nombre des arcs et donc des nuds.
Elle intervient en gnral aprs une jointure automatique des arcs sur les nuds.
Pour unir plusieurs arcs, il faut chaner les arcs qui peuvent ltre en testant
lensemble des nuds du document, et en changeant lordre des points dun arc si
ncessaire. Pour un document de type zone, le chanage sarrte ds quun nud
apparat dans plus de deux arcs du document.
7.5.3. Les contraintes sur les objets gographiques
7.5.3.1. Le nettoyage des zones
Comme pour les arcs, quelques procdures permettent dassurer une bonne
cohrence de lensemble du document, comme par exemple la suppression des
zones sans arc, la suppression des arcs sans zones (arcs libres), ou la dtection des
arcs pendants. Ces procdures interviennent en gnral lors de la rvision finale du
document.

254

Chapitre 7

7.5.3.2. La fermeture de zones


On teste la fermeture des zones en vrifiant le nombre doccurrences
dapparition dun bout pour tous les arcs constituant la zone. Ce nombre doit
toujours
tre
un
multiple
de
2 (mthode
de
IsZoneFermee()
CSaveditDocument, A.4.2).

fig. 7.6 : test de fermeture dune zone

La fermeture des zones est lun des tests les plus importants, car la cohrence
des zones intervient dans de nombreux problmes graphiques. De plus, les erreurs
de fermeture sont trs pnalisantes pour la saisie, si elles ne sont pas corriges au fur
et mesure. Il est en effet difficile de corriger la cohrence dun document
comportant de nombreuses erreurs de fermeture de zone. Dans SAVEDIT, une
option permet de visualiser automatiquement toute erreur de fermeture de zone : les
nuds ouverts sont indiqus par un cercle rouge (fig. 7.6). Avec cette option, le test
de fermeture est effectu pour lensemble des zones chaque fois que lon dessine
les zones sur lcran.
On peut galement tester la fermeture des zones grce loption de remplissage
des zones fermes par une couleur (fig. 7.7). Cette option permet de visualiser le
document en cours de saisie en utilisant une image raster de lensemble des zones
fermes. Limage raster est cre par rasterisation en utilisant les arcs des zones,
aprs test de fermeture. Elle est actualise de faon dynamique chaque
modification de zone. On utilise pour cela lalgorithme de rasterisation prsent au
chapitre 5, avec une dfinition de rasterisation gale la rsolution de lcran.

Contraintes d'intgrit spatiale

255

fig. 7.7 : visualisation de la fermeture par remplissage en couleur

7.5.3.3. Connexit et fermeture des arcs pour le type ligne


Pour les objets de type ligne, la connexit ou la fermeture des arcs nest pas une
contrainte gomtrique, mais elle sexprime nanmoins sur les arcs saisis. Il est donc
utile davoir des outils permettant de joindre deux arcs sur leurs extrmits ou de
fermer un arc sur lui-mme. Lutilisateur doit effectuer ces oprations
manuellement, en slectionnant larc (pour le fermer sur lui-mme) ou les deux arcs
(pour les joindre), lorsque cela est ncessaire la cohrence de lensemble.
7.5.3.4. Unicit de cl (zones scantes, zones incluses)
La contrainte dunicit de cl est fondamentale pour assurer la cohrence du
modle relationnel. Il faut donc viter que deux zones dun mme document ne se
recouvrent.
Le cas de zones scantes est le plus simple : il peut tre contrl grce aux
procdures de contrle sur les arcs (extra-simplicit). Par contre, il faut faire
particulirement attention au problme des zones incluses, car une zone incluse peut
facilement tre saisie sans que la topologie soit prise en compte, si lon oublie
dinclure larc dans la zone qui la contient. Il faut donc tester lintersection des
zones lorsquil y a possibilit dinclusion.
On teste pour cela les possibilits dinclusion pour lensemble des couples de
zone dun document. Ce test utilise le rectangle minimum des zones. Lorsque deux
zones sont candidates, on rasterise ces deux zones dans un espace dfini partir de

256

Chapitre 7

la plus petite. Les deux images ainsi obtenues doivent tre disjointes. La
rasterisation utilise lalgorithme prsent au chapitre 5 pour la rasterisation dun
masque.
7.5.3.5. Centrode de zones
Comme un centrode peut tre dplac par loprateur de saisie, il est important
de tester lappartenance des centrodes leur zone pour assurer la cohrence
globale. Rappelons que le centrode est utilis lors de lexploitation des donnes
pour des oprations dagrgation ou dappartenance, ainsi que pour placer des
lments cartographiques (symboles, labels, etc.).
On teste lappartenance dun centrode une zone ferme en utilisant un
algorithme YX : une ligne traversant la zone doit couper son contour avec un
nombre impair dintersection avant un point intrieur (thorme de Jordan). Dans la
pratique, on calcule le nombre dintersection dune ligne horizontale passant par le
centrode avec lensemble des arcs formant le contour de la zone, en ne retenant que
les points dintersection qui se trouve avant le centrode (de la gauche vers la
droite). Si la ligne passe par un nud (extrmit commune plusieurs arcs) cette
intersection ne doit tre compte quune seule fois.
7.5.3.6. Valeurs adjacentes (courbes de niveaux)
Cette contrainte descriptive de jointure est trs utile pour trouver les erreurs lors
de la saisie de courbes de niveaux. Elle permet de trouver les courbes adjacentes
dont la diffrence des valeurs ne se situe pas dans un intervalle donn. Elle est
complmentaire dune recherche dextra-simplicit des arcs, qui doit normalement
tre effectue auparavant. Nous considrerons que deux lignes sont voisines s'il
existe un segment de droite reliant un point dans chaque ligne et ne coupant aucune
autre ligne.
Pour vrifier cette contrainte, lalgorithme dvelopp dans SAVEDIT discrtise
lespace de manire trouver rapidement les conditions dadjacence. Le principe
est le suivant :
- on calcule la fentre du document ;
- on fait passer n lignes horizontales (y=constante, dans le plan de projection)
travers ce document, en calculant pour chaque ligne horizontale les points
dintersection de cette ligne avec les objets du document. Les intersections sont
conserves avec le numro de lobjet auquel elles appartiennent ;
- pour chaque ligne horizontale, les points sont tris en x. Ensuite, on teste la
diffrence des valeurs des objets de deux points contigus, par rapport lintervalle
des valeurs admissibles, donnes par lutilisateur.

Contraintes d'intgrit spatiale

257

On peut rpter lopration en inversant x et y. Bien sr, la prcision du test


dpend du pas de calcul. Plus n est grand, plus on se rapproche de la dfinition
exacte de la relation dadjacence, et moins on aura de possibilit de voir une courbe
chapper au contrle. Le temps dexcution est proportionnel n. Outre les erreurs
sur les valeurs, ce test permet de mettre en vidence des problmes de connexit
entre deux lignes : un espace entre deux lignes de mme valeur permet une ligne
horizontale ou verticale de traverser cet espace, et donc de provoquer une erreur sur
les valeurs.
Voici la procdure TestValeur() de la classe CSaveditDocument
correspondant ce test (A.4.2). Les points dintersection sont stocks dans des
cellules et tris sur x par insertion. La structure est identique celle utilise pour la
rasterisation.
7.5.3.7. Valeurs adjacentes (points cots)
Cette contrainte descriptive permet de trouver les erreurs lors de la saisie de
points cots . Elle permet de trouver les points voisins dont la diffrence des valeurs
ne se situe pas dans un intervalle donn. Ici, deux points sont voisins sils sont
contigus dans la triangulation de Delaunay. La vrification calcule donc la
triangulation de Delaunay pour lensemble des points saisis (avec lalgorithme
prsent au chapitre 6), puis calcule la valeur de la diffrence de deux points
contigus dans la graphe correspondant la triangulation.
7.5.4. Quelques procdures automatiques : algorithmes
Nous allons prsenter ici rapidement quelques procdures et algorithmes un peu
plus complexes qui permettent damliorer considrablement les performances du
logiciel de saisie graphique. Ces procdures sont en cours de dveloppement dans le
module SAVEDIT.
7.5.4.1. La dtection automatique des contours de zone
La constitution automatique de zones partir des arcs saisis peut amliorer
considrablement les temps de saisie, car loprateur na plus indiquer la
main les arcs constituant le contour de chaque zone. Mais pour que cette
procdure puisse fonctionner, il faut que le document soit dj en bon tat (pas
darcs libres, pas darcs pendants). Cette opration correspond la cration
automatique de la topologie pour les zones.
Deux mthodes peuvent tre utilises :

258

Chapitre 7

- une mthode semi-automatique, avec lindication pour chaque zone dun point
intrieur. Lalgorithme recherche alors lensemble des arcs ncessaires pour fermer
le polygone contenant le point.
- une mthode automatique : le programme cre des polygones partir de
lensemble des arcs et calcule un centrode pour chaque polygone. Les objets zone
correspondent aux polygones. Cette mthode ne peut rsoudre le problme des
zones incluses : elles seront toujours considres comme des objets, et le document
cr ne comportera donc aucun trou .
7.5.4.2. La saisie semi-automatique darc par suivi de contour
La saisie automatique permet de saffranchir de la saisie manuelle des arcs : elle
correspond une opration de vectorisation partir dune image du document
scann. Mais la vectorisation brute est peu efficace, car elle peut crer de nombreux
arcs parasites, et ne cre pas les objets ou la topologie de lensemble. Nous
dveloppons donc une mthode semi-automatique qui permet loprateur de crer
des arcs en indiquant la ligne suivre et en donnant la direction du suivi de contour
lorsque lalgorithme rencontre un ambigut.
Pour crer les arcs partir dun document scann, nous utilisons une mthode
par suivi de contour partir du document transform en une image noir et blanc
[BAR 88]. Les contours correspondent au squelette obtenu partir des zones noires.
Loprateur indique le dbut de larc saisir, puis la direction du suivi en pointant
sur un autre point de larc. Lalgorithme suit la ligne et sarrte ds quil rencontre
une branche dans la ligne. Loprateur indique alors si larc est termin ou la
direction dans laquelle le suivi doit continuer.
7.5.5. Le format des documents SAVEDIT
Quelque soit le type du document, SAVEDIT cre un fichier dextension .car
indiquant les caractristiques du document. Ce fichier texte a laspect suivant :
.Version 7
.Nom seismes
.Date Wed Feb 23 18:14:59 2000
.Operateur Importation de points
.Datum WGS84
.Echelle 0
.Type 1
.Attribut 2
.TailleCle 40
.Datum non prcis
.Projection
2.0000000000e+000
6.3781370000e+006
6.6943799901e-003
9.9960000000e-001
1.6740000000e+004
0.0000000000e+000
0.0000000000e+000
0.0000000000e+000
0.0000000000e+000

Contraintes d'intgrit spatiale

259

0.0000000000e+000
0.0000000000e+000
0.0000000000e+000
0.0000000000e+000
0.0000000000e+000
0.0000000000e+000
0.0000000000e+000
0.0000000000e+000
0.0000000000e+000
0.0000000000e+000
0.0000000000e+000

Chaque ligne qui commence par un . correspond un paramtre du document.


Par exemple, .Type indique le type du document (1 : point, 2 : ligne, 3 :
zone), .Attribut indique le type de lidentifiant (1 : numrique, 2 : nominal, 3 : les
deux). .Projection indique la projection gographique privilgie pour laffichage
du document lors de la saisie (20 paramtres), mais les coordonnes sont conserves
en longitude-latitude dans un datum, qui est normalement prcis par une ligne
.Datum.
Un document de type point comporte un seul fichier, dextension .pt. Tous les
objets sont crits les uns la suite des autres (A.4.2).
Un document de type ligne comporte deux fichiers, lun dextension .lg, lautre
dextension .arc. Le fichier dextension .lg comporte la description des objets, et le
fichier dextension .arc comporte la description des arcs constituant les objets lignes.
Un document de type zone comporte galement deux fichiers, dextension .zon
et .arc. Le fichier dextension .zon comporte la description des objets, et celui
dextension .arc la description des arcs constituant les frontires entre zones. Les
fichiers dextension .arc ont la mme structure, quelque soit le type des objets
auxquels se rfrent les arcs (A.4.2).
7.6. Conclusion
La mise en uvre de contraintes d'intgrit dans les bases de donnes
gographiques est essentielle, car plus que d'autres ces bases sont difficiles
maintenir et mettre jour, et de nombreux traitements gographiques ne sont
valables qu' la stricte condition d'une bonne cohrence des donnes. Ce n'est qu'au
prix d'un bon respect des contraintes d'intgrit gographique que l'on pourra
assurer une bonne utilisation de la base de donnes.
Les contraintes d'intgrit sont dtermines par la modlisation de la ralit en
collections d'objets du mme type (qui correspond la dfinition de la structure de
la base de donnes). Les contraintes gomtriques et topologiques de type peuvent
intervenir trs tt dans le processus de constitution de la base. On a mme tout
intrt les traiter de faon interactive lors de la saisie des donnes elles-mmes, car

260

Chapitre 7

toute modification graphique dans un grand ensemble d'objets gomtriques est par
la suite dlicate, si l'on veut maintenir la cohrence de l'ensemble, du fait de la
propagation possible d'erreurs.
Une base de donnes gographique doit finalement tre considre comme un
ensemble complexe, comprenant la dfinition d'un ensemble de collections, la
dfinition de contraintes d'intgrit pour chaque collection, de contraintes d'intgrit
entre les collections, et des mthodes dutilisation pour les collections d'objets. Un
SIG devrait tre capable de proposer et de grer cette structure complte, avec un
langage de description et de manipulation des collections et des relations entre
collections, que ce soit pour les contraintes d'intgrit comme pour les mthodes
dexploitation des donnes.

Contraintes d'intgrit spatiale

261

Bibliographie

[BAR 88] BARUCH O., Line Thinning by Line Following, Pattern Recognition Letters, 1988,
Vol. 8, p. 271-276
[BEN 93] BENKAZEN V., DOUCET A., Bases de donnes orientes objet, 1993, Armand Colin
[BOU 94] BOURSIER P., TAO-YUAN J., A model for Handling topological relationships in a
2D environment, Proceedings of the 6th International Symposium on Spatial Data Handling,
1994, Vol 1, pp 73-88, Endinburgh
[CLE 93] CLEMENTINI E., DI FELICE P., VAN OOSTREROM P., A Small Set of Formal
Topological Relationships Suitable for End-User Interaction, Proceedings of the 3th
Symposium on Large Spatial Databases, 1993, Lecture Notes in Computer Sciences 692, pp
277-295, Singapore
[CLE 95] CLEMENTINI E. DI FELICE, CALIFANO G., Composite Regions iin Topological
Queries, Information Systems, 1995, Vol. 20, n7, pp 579-594
[COH 93] COHN A.G., RANDELL D.A., CUI Z., BENNETT B., Qualitaiv Spatial Reasoning and
Representation, Preceedings of QUARDET 93, PP 513-522, Barcelona, Spain, 1993
[CUI 93] CUI Z., COHN A.G., RANDELL D.A. , Qualitativ and Topological Relationships in
Spatial Databases, Proceedings of the 3th Symposium on Large Spatial Databases, 1993,
Lecture Notes in Computer Science 692, pp 296-315, Singapore
[DAT 90] DATE C., A Contribution to the study of database integrity, in Relational Database
Writing, 1990, Addison-Wesley
[DAV 94] DAVID B., FASQUEL P., Qualit dune base de donnes gographique : concepts et
terminologie, Bulletin dinformation de lIGN, 1994, n 67, Paris
[EGE 89] EGENHOFER M.J., A Formal Definition of Binary Topological Relationships,
Proceedings of the 3th International Conference on Foundations of data Organization and
Algorithms, 1989, Lecture Notes in Computer Science 367, Paris, France, pp 457-472

262

Chapitre 7

[EGE 91] EGENHOFER M.J., FRANZOZA R.D., Point-Set Topological Relations, International
Journal of Geographic Information Systems, 1991, 5-2, pp 161-174
[EGE 94] EGENHOFER M.J., CLEMENTINI E., SHARMA J., Modelling topological spatial
relations : strategies for query processing, Computer and graphics, 1994, vol. 18, n6, pp
515-522
[FAI 96] FAIZ S.O., Modlisation, exploitation et visualisation de l'information qualit dans
les bases de donnes gographiques, Thse de Doctorat, 1996, Univ. Paris XI Orsay
[FRA 92] FRANK A.U., Qualitative Spatial Reasoning about Distances and Directions in
space, Journal of Visual Langages and Computing, 1992, vol. 3, n 4, pp 343-371
[FRA 96] FRANK A.U, Qualitative spatial reasoning : cardinal directions as an example.
International Journal of Geographical Information Systems, 1996, Vol. 10, n3, pp 269-290
[GOO 89] GOODCHILD M., GOPAL S., Accurancy of Spatial Databases, 1989, Taylor &
Francis
[GUP 95] GUPTILL S.C., MORRISON J.L.,
Pergamon/Elsevier Science, 1995

Elements

of

Spatial

Data

Quality,

[HAA 96] HAADZILACOS T., TRYFONA N., A model for expressing topological integrity
constraints in geographical databases, in Proceedings : Theories and Models of SpacioTemporal Reasoning in Geographic Space, 1996, International Conference GIS, Pisa, Italy.
A. Frank, I. Campari, U. Fomentini (Ed.), pp 252-268
[LAU 94] LAURINI R., Dtection et corrections d'erreurs topologiques dans les bases de
donnes gographiques, Actes des premires journes de la recherche CASSINI, 1994, Lyon,
France, pp 105-114
[LAU 93], LAURINI R., MILLERET-RAFFORT F., Les bases de donnes en gomatique, 1993,
Herms, Paris
[LAU 91] LAURINI R., MILLERET-RAFFORT F., Cohrence dans les bases de donnes
spatiales, VIIe journes Bases de donnes Avances, INRIA, 1991, pp 471-488, Lyon
[MOL 94] MOLENAAR O, KUFONIYI O., BOULOCOS T., Modelling topological relationships in
vector maps, Proceedings of the 6th International Symposium on Spatial Data Handing, 1994,
pp 112-126, Endinburgh
[ML 95] MLLER J.C., LAGRANGE J.P., WEIBEL R., (ed.), GIS and Generalization, GIS
DATA I, 1995, Taylor & Francis
[ORO 93] OROURKE J., Computational Geometry in C, 1993, Cambridge University Press
[PUL 88] PULLAR D.V., EGENHOFFER M.J., Toward formal definitions of topological relations
among spatial objects, Procedings of the third International Symposium on Spatial Data
Handling, 1988, Sydney, Australia, pp 225-241
[PL 97] PLMER, GRGER, Archiving Integrity in Geographic Information Systems Maps
and Nested Maps, Geoinformatica, 1997, vol.1, n 4, pp 345-367, Kluwer Academic, Boston

Contraintes d'intgrit spatiale

263

[SOU 86] SOURIS M., Systmes dinformation gographique et bases de donnes, Colloques
et Sminaires sur le Traitement des donnes localises, 1986, pp 29-87, Editions de lOrstom,
Paris
[TAN 95] TANZI T., UBEDA T., Contrle topologique de la cohrence dans les bases de
donnes gographiques : application aux rseaux , Revue Internationale de Gomatique,
1995, Vol. 5, n2, pp 133-155
[UBE 96] UBEDA T., SERVIGNE S., Geometric and Topological Consistency of Spatial Data,
1996, in Proceedings: First International Conference on Geocomputation, Leeds, UK
[UBE 97] UBEDA T., Contrle de la qualit spatiale dans les bases de donnes gographiques
: Cohrence topologique et corrections d'erreurs, Thse soutenue l'INSA de Lyon, 1997

Troisime partie : Analyse spatiale et cartographie

266

Chapitre 8

Analyser 267

Chapitre 8

Analyser : calculs et analyse spatiale

8.1. Introduction
Lobjectif des SIG nest pas seulement de reprsenter des objets lmentaires
pour les grer et les restituer graphiquement avec des cartes. A partir dune
modlisation de la ralit qui se veut la plus complte mais aussi la plus simple
grer, le systme doit nous permettre danalyser les objets ainsi modliss pour en
construire dautres, plus complexes, plus synthtiques, soit pour construire une
modlisation dun problme spcifique, soit pour dcouvrir par une dmarche
empirique des situations nouvelles. Cette dmarche nest pas spcifique aux donnes
localises, mais la localisation, qui tait souvent vue comme un fait et non une
causalit, doit galement intervenir dans ce processus danalyse.
Lanalyse spatiale recouvre un ensemble de mthodes et doutils qui permettent
dinterprter et de rendre compte des relations qui existent entre des objets localiss,
afin de dcouvrir ou de mettre en vidence des rgles gnrales dorganisation de
lespace [PUM 97]. Son objectif est essentiellement de dcrire une disposition
particulire de certains objets, de leur organisation spatiale, de reprer des
structures, dexpliquer une localisation par dautres. Pour cela, il faut dceler en
quoi la localisation apporte un lment utile la connaissance des objets tudis et
peut en expliquer les caractristiques, en partie ou en totalit. Lanalyse spatiale
permet dintroduire la localisation comme une cause explicative dun phnomne,
ou lintroduire dans une analyse statistique qui habituellement lignore.

268

Chapitre 8

Les dmarches de lanalyse spatiale sont multiples. Elle peut tendre un simple
rsum de linformation contenue sur une carte thmatique, par exemple en
localisant le centre de gravit dun semis de points ou en dessinant des zones
homognes. Elle peut chercher faire apparatre des structures spatiales connues,
comme certains types de rseaux ou une organisation de type centre-priphrie. Elle
peut aussi viser tester la pertinence dun modle spatial, ou aider simuler un
processus spatial. Quelle que soit la mthode employe, lanalyse portera toujours
sur un ensemble dobjets, et non sur un individu isol.
Lanalyse spatiale a besoin pour cela de beaucoup de donnes localises. Et cest
l quinterviennent les SIG, pour aller au-del de leurs simples possibilits de
gestion de donnes localises bien efficaces en tant que telles mais insuffisantes
pour tudier un phnomne et rpondre des problmes dorganisation du territoire
tudi. Au del de cette fonction de gestion de donnes, les SIG doivent contenir les
outils et instruments permettant de remplir tout ou partie des fonctions de lanalyse
spatiale. Et cest bien ce qui fait alors la puissance de ces systmes, car il sont les
seuls permettre la fois la gestion de la localisation et son introduction dans un
processus danalyse. Mais ces outils sajoutent aux outils statistiques ou
mathmatiques existants quils utilisent dailleurs largement et ne les remplacent
pas. Un SIG se doit donc galement dincorporer ou de donner accs aux mthodes
classiques de lanalyse de donnes. Lun des intrts majeurs de lutilisation de la
statistique dans un SIG rside dans la possibilit dtudier facilement la localisation
des variations dun attribut descriptif, et de rechercher les relations entre variation
dun attribut et localisation des objets [SAN 89].
Aprs un bref rappel des principaux concepts de lanalyse spatiale, nous
prsentons dans ce chapitre les oprations qui permettent de mettre en uvre des
procdures danalyse spatiale dans le module dexploitation des donnes du systme
SAVANE. Ces oprations ne sont plus des oprations de lalgbre relationnelle
tendue, et sapparentent plus des programmes dapplication ou des mthodes. Le
SIG, initialement systme de gestion de type relationnel, soriente maintenant vers
une approche objet, avec lintroduction de mthodes sur les collections dobjets. Les
mthodes lies la localisation dpendent pour la plupart du type des objets.
8.2. Rappels sur lanalyse spatiale
8.2.1. Structures spatiales et objets gographiques : gnralisation et agrgation
Comme nous lavons vu loccasion des exemples donns au chapitre 3, la
description dun phnomne gographique complexe, statique ou dynamique, fait
appel de nombreuses chelles de description et la dfinition de nombreux objets
suivant une modlisation qui nest pas toujours vidente construire. Cest partir

Analyser 269
de cette schmatisation que lutilisateur gographe va pouvoir construire des objets
plus complexes, extraire des modles, des organisations, des structures, pour aboutir
une vision plus synthtique [HAG 73]. En fait, cest bien souvent le travail
danalyse spatiale qui va permettre de dfinir ces chelles de description et les
attributs qui lui correspondent, partir dune information de base donne par
rapport dautres objets gographiques. Cest ce qui fait lambigut et la difficult
de cette dmarche souvent rcursive, et qui amne souvent un SIG contenir des
collections dobjets correspondant diffrents niveaux danalyse. Cest la fin
dune analyse gographique quapparat lidentification de nouveaux objets
spatiaux : on utilise linformation connue pour des objets gographiques pour en
dfinir dautres, plus cohrents par rapport un problme donn, ou relevant dune
autre chelle dobservation, plus synthtique. Les gographes font rfrence ces
diffrents niveaux dobservation en parlant de changement dchelle gographique
de lanalyse. Lanalyse spatiale permet donc de passer dun modle de la ralit un
autre.
Diffrents modles concernent bien souvent diffrentes chelles de description.
Lanalyse spatiale consiste alors utiliser des oprations permettant de passer dune
chelle une autre sans provoquer derreur dans la conception de ces nouveaux
objets. Par exemple, le passage dune chelle une autre peut seffectuer en
runissant des units spatiales de niveau infrieur. On parlera alors dun processus
dagrgation. Mais les agrgations possibles sont trs nombreuses. Une grande
partie du travail danalyse spatiale consiste explorer quels sont les regroupements
dunits de base qui sont les plus pertinents, selon diffrents types de critres, pour
produire des dcoupages intressants une autre chelle, gnralement pour mettre
en vidence des structures spatiales impossible voir partir des donnes non
agrges. Cette tape ne modifie pas seulement la nature spatiale des objets
gographiques, elle en modifie galement la description et les attributs. Lanalyse
spatiale va donc bien plus loin quune simple mise en relation dobjets sur un critre
de localisation. Elle permet de dfinir des oprations permettant dtendre la
jointure spatiale en fonction de la validit smantique des objets.
Dans un processus de changement dchelle, la dfinition de nouveaux objets est
le rsultat dune abstraction qui repose sur un processus dlimination de dtails ,
appel gnralisation [RIM 90] [PUM 97]. Ainsi, un ensemble dobjets htrognes
un niveau dagrgation gographique peut apparatre homogne un niveau
suprieur, parce que lon oublie volontairement lhtrognit interne pour ne
retenir que les traits qui permettent la comparaison avec dautres units spatiales
situes au mme niveau dobservation. La mme remarque sapplique lorsquon
agrge des units spatiales de base en fonction non plus de leur ressemblance pour
un attribut ou un ensemble dattributs, mais daprs les relations quelles
entretiennent les unes avec les autres.

270

Chapitre 8

Lopration dagrgation est toujours dlicate et il est ncessaire dobserver des


rgles prcises pour contrler la perte dinformation lors de la gnralisation, surtout
lorsquil ny a pas hirarchie spatiale des dcoupages. La distribution spatiale dun
phnomne est un critre important dans de nombreux cas [PUM 97]. Ces rgles
nous ont amen dvelopper plusieurs mthodes dagrgation spatiales dans le
systme SAVANE.
La dsagrgation le passage un dcoupage plus fin - pose encore plus de
problmes de validit, et sapparente dans de nombreux cas un problme
dinterpolation. En effet, elle est souvent employe pour remdier une carence
dinformation : on va alors chercher de linformation un autre niveau de validit
(plus faible), en faisant implicitement une hypothse duniformit de la rpartition
spatiale de cette information. Cette hypothse trs forte ne doit pas tre oublie lors
de lutilisation du rsultat obtenu.
La plupart des procdures dagrgation ou de dsagrgation sont dangereuses
lorsquelles sapparentent des interpolations : pour un point de lespace, la donne
nest plus quapproche et sa validit dpend de lopration qui a t effectue et
des hypothses sous-jacentes. Nous sommes bien face la dfinition de nouveaux
objets, avec leur validit spatiale propre, et le rsultat dune opration de ce type
doit bien tre considr comme une nouvelle modlisation de la ralit : lopration
employe fait partie du processus de dfinition du modle. Loubli de cette rgle
peut amener de graves erreurs dans lutilisation ultrieure des objets ainsi construits.
8.2.2. Distribution spatiale dun phnomne
O ? Comment ? Pourquoi l et pas ailleurs ? Ces questions, comme nous
lavons dj soulign au chapitre 3, sont au cur de nombreuses questions
gographiques [LAU 93]. La rpartition dun phnomne est une question
essentielle dans lanalyse ds que lon dcide de prendre en compte la localisation
de ce phnomne. On sintresse la rpartition de lensemble form par tous les
objets : la structure spatiale propre de chaque objet nimporte plus et peut tre
ramene un point, car on cherche tudier lagencement des objets les uns par
rapport aux autres. On cherche caractriser larrangement gographique des lieux
en explicitant les principes de leur distribution, indpendamment dun attribut
descriptif particulier : les mthodes prsentes ici ne prennent en compte que la
localisation des objets tudis (qui peuvent bien sr avoir t slectionns
auparavant sur un caractre descriptif).
La simple cartographie de la distribution dobjets par leur centrode donne dj
une vision synthtique dun phnomne. Pour aller plus loin, on peut dfinir le
centre dun ensemble de point, point remarquable le plus reprsentatif possible de

Analyser 271
lensemble (point mdian, centre de gravit). Bien sr, cette reprsentation, image
de la mdiane ou de la moyenne en deux dimensions, ne rend pas compte de
lhtrognit de la situation. On peut utiliser pour cela une mesure de la
dispersion. Cette dispersion peut tre value par rapport un point remarquable ou
calcule comme une mesure gnralise des carts entre lensemble des points. On
peut galement classer le territoire, et compter le nombre dobjets par classe, par
analogie un histogramme sur une variable de dimension 1. Les classes seront
habituellement des objets de surface gale et de gomtrie simple, telle des mailles
carres. Et lon calculera plutt des densits que des effectifs, pour avoir des valeurs
qui ne dpendent pas directement de la taille des mailles. Bien sr, on peut
galement utiliser une classification de lespace en utilisant un dcoupage dj
existant, mais ce dcoupage peut introduire un biais dans ltude de la dispersion,
car il ne faudrait pas que le dcoupage utilis soit corrl la distribution que lon
cherche tudier.
Enfin, la distribution spatiale peut tre galement caractrise par la forme du
semis de points, correspondant larrangement et lespacement entre les points.
Cette distribution peut tre compare quelques forme de rfrences : distribution
spatiale rgulire, concentre, alatoire. On peut pour cela utiliser de nouveau des
mailles et des calculs de dispersion comme les courbes de concentration ou lindice
de Theil, ou encore comparer la distribution avec une distribution spatiale de
rfrence dont la loi de formation est connue.
8.2.3. Homognit spatiale, relations de voisinage, regroupement
Dans le paragraphe prcdent, nous avons vu quelques mthodes danalyse
concernant uniquement la position des objets, indpendamment de la valeur dun
attribut de ces objets. Mais bien souvent la valeur dun attribut est corrle la
position relative des objets entre eux ou la forme du semis de point. Il est donc
naturel de chercher dfinir des indices de ressemblance provenant la fois de la
position relative des objets dans lespace et de la valeur dun caractre de ces objets.
Lide de voisinage, de continuit, de connexit est sous-jacente ces indices
refltant lhomognit spatiale dun ensemble dobjets.
Lanalyse spatiale sintresse donc directement la dfinition ou la
dtermination densembles homognes partir dune collection dobjets
lmentaires. La notion dhomognit est toujours relative une srie dattributs et
une certaine chelle dobservation. Les mesures dhomognit, le plus souvent
exprimes sous forme dindice, sont nombreuses. La statistique classique fournit
dj un certain nombre doutils permettant de mesurer le degr dhomognit dune
collection dobjets, mais sans toutefois prendre en compte les relations de voisinage
entre les objets.

272

Chapitre 8

Mais on sait que bien souvent il y a interaction spatiale entre les objets dune
collection : cest le cas lorsque la rpartition spatiale des objets par rapport un
attribut descriptif nest pas alatoire. On se doit alors dintgrer la localisation dans
ltude statistique du phnomne, sous peine, par exemple, de biaiser la dfinition
dun chantillon dans lequel on utiliserait ultrieurement la localisation dans le
processus danalyse. La gostatistique fournit des outils permettant de vrifier
lexistence dune corrlation entre voisinage et variation dun attribut descriptif. Si
lon veut introduire le voisinage dans le calcul de la ressemblance, il faut utiliser
ces outils, et notamment lautocorrlation spatiale qui permet de mesurer lintensit
de la relation entre la proximit des objets et leur degr de ressemblance.
Enfin, le regroupement dobjets suivant ces critres nobit plus seulement une
classification descriptive, mais introduit le voisinage et la continuit pour aboutir
la dfinition de nouvelles partitions de lespace minimisant certains critres. En
particulier, lanalyse de la variance permet dobtenir une agrgation dobjets
gographiques qui cre le plus ou le moins de diffrence entre les classes ainsi
dfinies.
8.3. SAVANE : exploration des donnes et statistique
Lutilisateur qui souhaite analyser un ensemble dobjets gographiques
commencera sans aucun doute par reprsenter graphiquement lensemble des objets
pour visualiser leur rpartition spatiale, et il poursuivra son exploration par lanalyse
statistique des attributs lis ces objets, et la poursuivra en essayant de dterminer
les relations entre rpartition spatiale et variation descriptive.
La dmarche exploratoire peut ainsi se dcliner :
- analyse de la rpartition spatiale dun ensemble dobjets ;
- analyse de la rpartition statistique dun ou plusieurs attributs descriptifs dun
ensemble dobjet ;
- mise en vidence et analyse des relations entre les variations de la localisation
et variations dun ou plusieurs attributs descriptifs.
Un systme dinformation gographique tourn vers lanalyse devra donc
comporter la fois des fonctions de reprsentation graphique et de cartographie et
des fonctions statistiques permettant dexplorer les attributs des objets [BEG 94].
Cest le cas du systme SAVANE, et nous exposerons en dtail au chapitre suivant
les principes de la reprsentation cartographique du module dexploitation.
Lexploration graphique de la rpartition des objets est trs simple, car on utilise en
gnral des paramtres cartographiques proposs par dfaut par le systme.
Lexploration des attributs peut quant elle porter sur des objets individuels ou sur

Analyser 273
des collections dobjets. Lexploration individuelle utilise des procdures
lmentaires dinterrogation sur une valeur dattribut descriptif ou sur un point de
lespace. Lexploration dune collection dobjet fait appel aux procdures
statistiques classiques et celles, moins rpandues, de la gostatistique.
8.3.1. Lexploration individuelle
Lexploration individuelle consiste rechercher les valeurs des attributs dun
objet, que lon peut choisir graphiquement sur lcran (fig. 8.1) ou en indiquant la
valeur de lun de ses attributs.
Dans le premier cas, un seul objet est slectionn dans la relation. Il est retrouv
grce sa localisation. On utilise pour cela les procdures de distance un point,
une ligne, ou le test dinclusion dun point dans une zone.

fig. 8.1 : interrogation sur cran des objets prsents dans le cadre gographique

Dans le second cas, plusieurs objets peuvent correspondre une valeur dun
attribut. Le rsultat est donn dans une liste, pour les attribut descriptifs, et dessin
sur une carte, pour lattribut graphique lorsque la relation est localise.

274

Chapitre 8

8.3.2. Lexploration statistique


Lexploration statistique des attributs des objets dune base de donnes est une
opration fondamentale dans un processus danalyse et dinterprtation. Cette
exploration fait appel la statistique univarie (moments dun attribut numrique)
ou multivarie (corrlations, rgressions, analyse factorielle, etc.).
Si lon peut facilement avoir accs des logiciels statistiques extrieurs au SIG,
il nous a sembl nanmoins ncessaire de dvelopper quelques fonctions
lmentaires qui permettent rapidement de visualiser la rpartition statistique dun
phnomne. Nous avons donc dvelopp un module dexploration statistique
permettant de calculer les moments statistiques dun attribut, de calculer et
visualiser un histogramme, de calculer un indice de corrlation, de visualiser une
droite de rgression linaire ou un nuage de points suivant deux attributs (fig. 8.2).
Toutes ces oprations sont appliques aux objets dune mme relation.

fig. 8.2 : statistiques univaries sur un attribut dune collection dobjets

Enfin, le calcul du rsidu par rapport une distribution standard (linaire,


exponentielle, normale, de Poisson, etc.) peut tre ajout au schma comme un
nouvel attribut sur les objets, selon le principe de cration de nouveaux attributs que
nous allons exposer au paragraphe suivant. La cartographie du rsultat permet de
mettre en avant la rpartition gographique des carts une distribution donne (fig.
8.3).

Analyser 275

fig. 8.3 : exemple de reprsentation des carts par rapport une distribution donne

8.4. SAVANE et mthodes sur les attributs descriptifs


Nous allons prsenter dans ce paragraphe de nouvelles oprations concernant les
attributs descriptifs dune relation. Ces oprations sont la base des oprations
dexploration et danalyse des donnes. Elles permettent pour la plupart de modifier
temporairement le schma des relations en ajoutant de nouveaux attributs.
Combines aux oprations de lalgbre relationnelle tendue, elles sont une tape
importante dans la mise en uvre de nombreuses oprations danalyse spatiale.
Lanalyse spatiale ne seffectue pas en utilisant des procdures toutes faites :
lutilisateur devra construire lui-mme sa dmarche en utilisant les nombreuses
oprations lmentaires qui sont sa disposition et qui sinspirent pour la plupart
des principes que nous avons rappels lors de lintroduction : gnralisation,
agrgation, changement dchelle, classification.
8.4.1. Le principe de la cration de nouveaux attributs descriptifs
La cration de nouveaux attributs partir des attributs descriptifs dune relation
est une opration fondamentale dans un processus de requte exploratoire. Cest
lopration de modlisation la plus lmentaire : on peut ainsi modifier
temporairement le schma dune relation en introduisant de nouveaux attributs
calculs partir des attributs initiaux. Le module SAVANE permet la cration de
nouveaux attributs par calcul numrique, par calcul logique, par classification, par

276

Chapitre 8

agrgation, par combinaison, par comparaison, par tri. Toutes les oprations que
nous prsenterons dans ce paragraphe concernent les attributs dune seule collection
dobjet : les calculs ne font jamais intervenir de mise en relation dobjets de
plusieurs relations. Elles peuvent sappliquer tous les types de relation, puisque la
localisation nintervient pas dans ces calculs. Nous verrons dans le paragraphe
suivant des oprations qui crent de nouveaux attributs en faisant intervenir la
localisation des objets, et qui dpendent donc du type des relations mises en jeu.
Mais le principe de la cration de nouveaux attributs reste le mme.
Tous les attributs crs lors dune requte sont temporaires : la base de donnes
nest jamais modifie dans SAVANE. La relation temporaire est une copie de la
relation permanente et se trouve physiquement dans le rpertoire du cadre
correspondant la requte, qui lui-mme se trouve dans le rpertoire de la carte. La
gestion des tats temporaires permet plusieurs utilisateurs diffrents de travailler
sur la mme base, sans risque dinterfrence, et la base garde son intgrit. Si lon
veut intgrer de faon dfinitive le rsultat dun calcul entre attributs, il faut
exporter cet attribut pour lintgrer avec SAVATECA dans une opration
dadministration. Il est bien sr prfrable de conserver le calcul sous forme de
macro-commande ou de mthode, car on peut alors tre sr que lexcution de la
macro-commande sera base sur des valeurs actualises des attributs.
Pour grer la vue externe du schma, il faut connatre la place dans le schma
interne de chaque attribut du schma externe. Cette place est conserve dans la
variable m_iNumero membre de la classe CAttribut. Lorsquun nouvel attribut
est cr dans une relation, celle-ci devient temporaire si elle ne ltait pas dj : la
relation rsultante ne contient plus que les objets de la fentre dtude et, pour
chaque objet, elle ne contient plus que les attributs permanents prsents dans la vue
externe, plus les attributs temporaires. La classe CRelation contient une variable
permettant de connatre le nombre dattribut de la relation dans son tat initial
(m_iNb0) et dans son tat temporaire (m_iNba). Lors de lcriture dune relation
temporaire, les attributs permanents sont rcrits dans lordre de la vue externe, les
attributs temporaires la suite. La variable m_iNumero devient alors toujours
gale la place de la variable dans le schma externe.
Lors de laccs un attribut dune relation non modifie, il faut dabord
rechercher le numro interne de lattribut, partir de son numro externe iNoatt
qui provient du dialogue avec lutilisateur :
iNovar=pSchema->m_pRelations[iNoRel]->m_pAttributs[iNoAttr]->m_iNumero ;

val=v[iNovar] ;

La procdure NouvelAttribut() de la classe CSchema regroupe


lensemble des oprations ncessaires la cration de lattribut temporaire dans le
schma de la base de donnes (A.2.1.2.).

Analyser 277

8.4.2. Calculs numriques et logiques


On peut crer un attribut par calcul numrique ou logique entre les attributs
dune mme relation. Il suffit dindiquer la formule de calcul, comme dans le cas
dune restriction par condition de slection (fig. 8.4).
Lattribut cr contient pour chaque objet de la relation la valeur rsultant du
calcul. La vrification de la formule et le calcul pour chaque objet utilise la classe
CCalculateur dont nous avons vu le schma au chapitre 5 (A.2.1.5.). Le calcul est
bas sur le parcours dun arbre (fils gauche-frre droit) dexpressions (binaires) et
de termes (unaires), reprsentant la formule de calcul. Lexpression peut contenir
des oprateurs numriques ou des oprateurs logiques.

fig. 8.4 : le dialogue de cration dattribut par calcul numrique ou logique

Pour une relation non mosaque, le code de la procdure permettant de crer un


nouvel attribut par calcul est donn dans lannexe A.2.5.3.
Pour une relation de type mosaque, le principe est le mme mais le code est plus
complexe, car les valeurs dattributs doivent tre lues dans des fichiers diffrents, et
le rsultat du calcul peut ne pas correspondre au type de lattribut crer, qui est
choisi par lutilisateur. Par exemple, une somme de deux attributs cods sur un octet

278

Chapitre 8

(correspond des valeurs entires de 0 255) peut dpasser 255. Si lattribut crer
doit tre cod sur 8 ou 16 bits, il faut donc galement choisir une mthode de rtalement des valeurs (fig. 8.5 et 8.6).

fig. 8.5 : le dialogue de cration dun attribut dune mosaque

fig. 8.6 : le calcul dun indice de vgtation (NDVI) partir des canaux 3 et 4 dune image
Thematic Mapper

Analyser 279
8.4.3. Classifications et mthodes de discrtisation
Lopration de classification permet de transformer un attribut quantitatif en un
attribut qualitatif, cest--dire prenant ses valeurs dans un ensemble fini. Cette
opration est trs importante car la vision de la distribution de lattribut est
synthtique, et il est facile de reprsenter un nombre fini de valeurs sur une carte. La
classification est un processus trs classique en analyse de donnes.
La mise en uvre de la classification dun attribut ne pose pas de problmes
particuliers. Lattribut cr est nominal : ses modalits, qui ont t entres par
lutilisateur du systme, sont conserves dans un fichier temporaire, nomm
ftvaleurs, qui a la mme structure que le fichier fpvaleurs, qui lui contient
lensemble des valeurs des attributs nominaux permanents. Le fichier ftvaleurs est
propre une requte, et donc un cadre dune carte : il se trouve physiquement dans
le rpertoire du cadre de la carte. Le type dun attribut est conserv dans la variable
membre m_iType de la classe CAttribut. Il est cod 1 pour les attributs
nominaux permanents, 5 pour les attributs nominaux temporaires. En consultant
cette variable, le systme sait dans quel fichier (fpvaleurs ou ftvaleurs) il doit aller
chercher les modalits de lattribut.
Nombreuses sont les mthodes de dfinition des classes. La classification peut
tre arbitraire (des intervalles donns, par exemple), mais bien souvent lutilisateur
choisira la mthode de dfinition des classes en fonction de la rpartition des valeurs
de lattribut. Dans SAVANE, nous avons implment les procdures les plus
courantes utilises pour discrtiser une variable numrique (fig. 8.7) :

fig. 8.7 : le menu de classification de SAVANE

Par exemple, pour la classification par quantile (classification par intervalles


avec des classes deffectifs gaux), la dtermination des bornes des classes impose
le tri des valeurs de lattribut. On doit donc lire la valeur de tous les objets de la
relation, pour lattribut classer, puis trier ces valeurs pour dterminer les bornes
des classes. Pour les relations de type mosaque, le nombre dobjet peut tre trs

280

Chapitre 8

grand, et le tri serait alors trop long pour une procdure interactive. On regroupe
donc les valeurs en effectuant une premire discrtisation arbitraire, puis en
calculant le nombre dobjets pour chaque classe de cette premire discrtisation.
Dans tous les cas, le calcul des classes est automatique et seffectue lors du dialogue
avec lutilisateur du systme (fig. 8.8) :

fig. 8.8 : dialogue de dfinition des classes par quantiles

Le code de la procdure permettant de lire et de trier les valeurs dun attribut


dune relation non mosaque peut tre consult dans A.2.5.4.
8.4.4. Agrgations descriptives
Lagrgation descriptive concernent le regroupement des valeurs dun attribut
par rapport un autre attribut, toujours qualitatif nominal, et servant de cl
dagrgation. Elle permet de modifier le niveau de perception en changeant, en
quelque sorte, de cl descriptive. Par exemple, les donnes dun recensement,
disponibles au niveau de la commune, peuvent tre agrgs au niveau du
dpartement. Bien sr, lagrgation nest possible que si lon dispose dun attribut
indiquant pour chaque commune le nom du dpartement auquel elle appartient : il
sagit dune agrgation descriptive, o les deux attributs utiliss sont descriptifs.
Cette opration ne fait pas intervenir la localisation des objets, mais seulement la
valeur des attributs descriptifs choisis. Nous verrons plus loin les go-agrgations,
qui, elles, utilisent la localisation comme cl dagrgation, et qui ne sont valables
quentre relations localises.

Analyser 281
Notons quil y a dpendance fonctionnelle entre lattribut choisi comme cl
dagrgation et lattribut cr : la relation rsultante nest plus en deuxime forme
normale. Si cette situation ne doit pas exister dans une base de donnes bien
constitue, ici nous sommes dans un tat temporaire au milieu dune requte, et cette
dpendance est tout fait admise. Le nouvel attribut contenant le rsultat de
lopration peut tre cr dans la mme relation, ou dans tout autre relation
comportant un attribut nominal ayant le mme ensemble de modalits que la cl
dagrgation. Dans lexemple prcdent, si lon dispose dans la base dune relation
dpartement , il est possible de crer le nouvel attribut dans cette relation. Si
celle-ci est localise, il sera alors possible dutiliser sa localisation soit pour dessiner
le rsultat, soit pour poursuivre lanalyse en faisant, si ncessaire, intervenir la
localisation des dpartements.
Plusieurs oprations sont disponibles pour effectuer lagrgation et crer le
nouvel attribut (fig. 8.9). Si lattribut agrger est numrique, on peut effectuer une
somme, une moyenne, un cart-type, une variance, un minimum, un maximum. Si
lattribut est nominal, on peut calculer la frquence, relative ou absolue, dune
modalit particulire. Le choix de lopration dpend bien sr de la nature
smantique de lattribut (par exemple, on ne peut faire de somme que sil sagit
deffectifs, et non de taux mais le choix de lopration est laiss lutilisateur, car
il ny a pas de renseignement smantique de ce type dans la base de donnes).

fig. 8.9 : le choix de lopration dagrgation descriptive

Notons enfin que si la cl dagrgation est une cl de la relation, lopration


dagrgation na pas dintrt. Et dans ce cas, si le rsultat doit tre cr dans une

282

Chapitre 8

autre relation, lopration dagrgation est identique lopration dunion que nous
avons vue au chapitre 5.
8.4.5. Comparaison dattributs
Il est souvent utile de pouvoir crer un nouvel attribut par comparaison
dattributs numriques dune mme relation. Cette opration cre deux nouveaux
attributs : lun est nominal, et correspond au nom de lattribut qui correspond au
rang choisi pour la comparaison, lautre est numrique et contient la valeur de cet
attribut. Cette opration permet de rpondre aux questions du type : dans chaque
commune, quel est le parti politique arriv en seconde position, et combien
dlecteurs sont-ils concerns ? Quelle est lessence la moins reprsente dans ces
zones forestires, et combien darbres sont-ils concerns ?
8.4.6. Combinaison dattributs
La combinaison dattributs concerne les attributs nominaux. Elle permet de
combiner deux attributs nominaux en crant un troisime attribut, nominal lui aussi,
qui combine les valeurs des deux autres.
8.4.7. Ordre
La cration par ordre perme de crer un nouvel attribut numrique partir dun
attribut numrique de la relation. Le nouvel attribut donne le rang (croissant ou
dcroissant) de lobjet dans lensemble des objets de la relation par rapport aux
valeurs de lattribut choisi. Il permet par exemple de classer les entreprises par
rapport limpt sur les bnfices. On pourrait par la suite facilement calculer le
pourcentage que reprsente les vingt premires entreprises dans limpt national.
8.5. Lutilisation de la localisation pour la cration de nouveaux attributs
descriptifs
Les oprations relationnelles tendues la localisation permettent dj de
rpondre un certain nombre de requtes en utilisant la localisation de certains
objets. Ainsi, la restriction spatiale dune relation sur un masque cr partir des
objets dune autre relation permet de rpondre toutes les interrogations du type
o ? . La jointure spatiale permet de mettre en relation des objets de deux
relations en utilisant leur localisation, sur un critre de distance. Mais ces oprations
sont avant tout des oprations de gestion, visant utiliser le principe de la
dcomposition relationnelle pour grer au mieux des collections dobjet. Elles ne

Analyser 283
crent jamais de nouveau attributs. La go-jointure a en particulier le dfaut majeur
de faire perdre la localisation du rsultat lorsque lon nutilise pas un critre
d(O1,O2)=0. Ces oprations ne permettent pas non plus de mettre en uvre le
transfert dchelle. Nous avons donc dvelopp un certain nombre doprations pour
rpondre ces questions. Ces mthodes, pour la plupart, sont spcifiques au type
des relations et peuvent tre considres comme des mthodes sur les types
gnraux que sont les zones, les lignes, les points, les pixels.
Les oprations que nous prsentons dans ce paragraphe permettent de crer de
nouveaux attributs descriptifs, mais elles ne modifient pas la gomtrie des objets ni
ne crent de nouveaux objets ou de nouvelles relations. Nous verrons au paragraphe
6 de ce chapitre les oprations permettant la modification dobjets ou la cration de
nouveaux objets partir des relations existantes.
8.5.1. Surface, primtre, coordonnes
La surface et le primtre sont typiquement des mthodes pouvant tre
appliques uniquement au type zone.
Le calcul du primtre dune zone utilise les arcs frontire de la zone et la
distance euclidienne dans le plan de projection gographique. Il ne pose aucune
difficult. Le rsultat est toujours exprim en mtres.
Le calcul de la surface dune zone utilise galement les arcs frontire de la zone.
La surface est calcule dans le plan de projection, sans tenir compte de laltitude des
points (cest une surface projete). Elle peut tre exprime en mtres carrs, en
hectares, en kilomtres carrs. Nous avons mis en oeuvre deux mthodes de calcul,
une mthode par rasterisation et une mthode par calcul direct :
(1) La mthode par rasterisation calcule pour chaque zone une image raster
binaire de la zone dans la plus petite fentre contenant la zone. La rasterisation
utilise une rsolution fixe de 1600*1600 pixels. On compte ensuite le nombre de
pixels appartenant la zone, et lon approche ainsi sa surface puisque lon connat la
taille du pixel de la rasterisation. Cette mthode est rapide mais elle introduit une
incertitude sur le calcul due la dfinition de la rasterisation.
(2) La seconde mthode calcule la surface directement partir des arcs. Cette
mthode rend ncessaire le chanage des arcs en polygones ferms et la dtection
des polygones inclus. Le contour des polygones doit tre orient. La surface dun
polygone dont le contour est reprsent par les points de coordonnes
(x0,y0,x1,y1,..,xn,yn), dans le sens trigonomtrique, est donn par la formule :
n

S=1/2

i =1

(xiyi+1 yixi+1)

(le point xn+1,yn+1 correspond au point x0,y0)

284

Chapitre 8

La surface dun polygone inclus doit tre soustraite ou ajoute suivant le degr
dinclusion. La mthode utilise pour chaner les arcs dune zone en polygones et
calculer le degr dinclusion dun polygone est identique celle utilise pour
exporter des zones au format ShapeFile (chapitre 3, A.2.2.6.).
Dans SAVANE, les coordonnes des objets napparaissent pas directement dans
le schma des attributs : la localisation est implicite au type et ne peut tre utilise a
priori quau travers des oprations de gestion et danalyse spatiale. Mais il peut tre
utile de faire apparatre explicitement les coordonnes du centrode dans le schma
des attributs, notamment lorsque lon dsire introduire la localisation dans une
opration statistique multivarie ou pour exporter cette localisation vers un autre
systme. Une opration permet donc de crer deux attributs, lun pour labscisse,
lautre pour lordonne du centrode. Les coordonnes sont alors exprimes dans le
plan de projection gographique utilis dans le cadre.
8.5.2. Orientation et pente
Le calcul dorientation peut tre appliqu des objets de type ligne (fig. 8.10).
Ce nest une valeur exacte que dans le cas de lignes reprsentes par un segment de
deux points. Sinon, lorientation correspond la moyenne de lorientation des
segments pondre par la longueur de chaque segment.

fig. 8.10 : dessin et histogramme de la rpartition de lorientation de failles gologiques,


calcule partir de la gomtrie des objets

Analyser 285
Le calcul de la pente utilise une relation de type mosaque, contenant un attribut
correspondant laltitude (souvent un modle numrique de terrain cr partir de
courbes de niveaux). Le systme cherche par go-jointure laltitude des deux
extrmits de chaque ligne pour calculer la pente de la ligne. Comme pour
lorientation, la valeur calcule ne reprsente la pente relle que dans le cas de
lignes reprsentes par un segment de deux points
8.5.3. Distance un point, une relation, un masque
Cette opration calcule la distance de chaque objet dune relation un point,
un masque, ou lobjet le plus proche dune autre relation localise. Par distance,
on entend la plus courte distance euclidienne de lobjet au point donn (choisi sur
lcran ou par ses coordonnes), au masque, ou lobjet le plus proche dans lautre
relation. On utilise pour calculer la distance dun point un arc la procdure que
nous avons prsente au chapitre 7.
8.5.4. Go-agrgations
Les go-agrgations permettent de mettre en uvre des oprations de transfert
dchelle. Elles correspondent une go-jointure entre deux relations suivie dune
opration dagrgation descriptive sur la cl gographique de la relation rceptrice.
Elles utilisent donc la localisation des objets pour les mettre en relation. On utilisera
la terminologie metteur et rcepteur pour diffrencier la relation qui met les objets
et la valeur dun de ses attributs, et la relation qui reoit le nouvel attribut cr par
agrgation. La relation rceptrice est donc celle qui gnralise le phnomne,
chaque objet de la relation rceptrice tant cens recevoir plusieurs objets de la
relation mettrice. On calcule la valeur du nouvel attribut de lobjet rcepteur
partir des valeurs de ces objets, par agrgation descriptive. Grce cette agrgation
descriptive, le rsultat dune go-agrgation conserve la localisation des objets
rcepteurs. Lopration dagrgation descriptive est classique : somme, moyenne,
cart-type, variance, minimum, maximum, dans le cas dun attribut numrique, et
frquence relative ou absolue dans le cas qualitatif.
8.5.4.1. La go-agrgation gomtrique par distance
Lopration de go-agrgation par distance cherche, pour tous les objets de la
relation rceptrice, quels sont les objets de la relation mettrice qui doivent lui tre
agrgs. Les relations mettrice et rceptrice doivent tre localises, mais peuvent
tre de nimporte quel type (zone, ligne, point, pixel). On peut galement utiliser
une distance autour des objets rcepteurs, pour ne pas limiter la jointure une
opration dinclusion des objets metteurs aux objets rcepteurs. Lopration reste
nanmoins ambigu dans certains cas.

286

Chapitre 8

(1) Lorsque la relation mettrice est de type point, il ny a pas dambigut : pour
chaque objet rcepteur, les objets metteurs joindre sont ceux dont la distance du
point lobjet rcepteur est infrieure la distance dagrgation. Lopration utilise
le calcul de la distance dun point un point (objet rcepteur de type point ou pixel),
un arc (objet rcepteur de type ligne), ou un ensemble darcs sil ny a pas
inclusion (objet rcepteur de type zone) (fig. 8.11).

fig. 8.11 : exemple de go-agrgation de points dans des zones : calcul de laltitude moyenne
par lot partir de points cots (moyenne, d < 100 m)

(2) Lorsque la relation mettrice est de type ligne, il peut y avoir ambigut :
pour chaque objet rcepteur, les objets metteurs joindre sont ceux dont la distance
de larc lobjet rcepteur est infrieure la distance dagrgation. Lopration
utilise le calcul de la distance dun arc un point (objet rcepteur de type point ou
pixel), un arc (objet rcepteur de type ligne), ou un ensemble darcs sil ny a pas
intersection (objet rcepteur de type zone). Le critre de jointure utilise donc dans
tous les cas la distance dun arc un objet, cest--dire la distance minimale de tous
les points de larc cet objet : il suffit quun point de larc soit proche de lobjet
rcepteur pour quil soit pris en compte dans lagrgation.
(3) Lorsque la relation mettrice est de type zone, il peut galement y avoir
ambigut : pour chaque objet rcepteur, les objets metteurs joindre sont ceux
dont la distance de la zone lobjet rcepteur est infrieure la distance
dagrgation. Cest le cas lorsque lobjet rcepteur est inclus ou intersecte la zone,

Analyser 287
ou que la distance entre lobjet rcepteur et les arcs formant le contour de la zone
mettrice est infrieure la distance dagrgation.
Dans tous les cas, si un objet metteur est proche de plusieurs objets rcepteurs,
il est mis en relation avec tous ces objets. Si lagrgation est une somme et porte sur
un attribut numrique reprsentant un effectif, agrger plusieurs fois lobjet metteur
dans des objets rcepteurs diffrents revient dupliquer la valeur. Pour viter cette
erreur, il est possible de choisir une option permettant de nagrger lobjet metteur
que dans lobjet rcepteur le plus proche (fig. 8.12).

fig. 8.12 : la page finale du dialogue de go-agrgation par distance

Lopration de go-agrgation par distance doit tre utilise avec prudence,


comme nous lavions dj signal au dbut de ce chapitre. Sa validit dpend de la
prcision smantique et graphique de chaque relation, et dpend du type des objets
et des ambiguts qui sont cres lorsque les dcoupages ne sont pas hirarchiques.

288

Chapitre 8

fig. 8.13 : exemple de go-agrgation de zone zone sans ambiguit : agrgation de la


population dlots aux quartiers (somme, d=0)

Elle ne doit tre employe en principe que pour rsoudre des oprations de
transfert dchelle, et donc lorsque la prcision de la relation mettrice et suprieure
la prcision de la relation rceptrice, ou lorsquil y a hirarchie gographique des
objets (fig. 8.13).
Notons enfin que lopration dagrgation par distance utilise la distance entre
objets metteurs et rcepteurs pour savoir sils doivent tre mis en relation, mais
nutilise pas cette distance dans le calcul dagrgation descriptive qui suit. Par
exemple, lopration de go-agrgation entre deux relations de type pixel
correspond en quelque sorte un r-chantillonage, dans lequel seules les options de
plus proche voisin ou de moyenne seraient disponibles. Lutilisation de la distance
dans le calcul est employe dans dautres oprations que nous verrons plus loin :
pour un vritable r-chantillonage entre relations de type pixel, ou pour la cration
de nouveaux objets par interpolation.
8.5.4.2. Go-agrgation par surface dun masque
Ce type dagrgation cherche rsoudre lambigut de la go-agrgation zonezone lorsquil ny pas hirarchie des dcoupages, et lorsque lon cherche rendre
compte de la distribution dun caractre (nominal) dans un autre dcoupage. Cest
bien souvent le cas lorsque les deux thmes ne sont pas lis mais dune prcision
quivalente. On a alors deux collections dobjets de type zone avec de multiples
intersections entre les objets des deux relations.

Analyser 289
Lopration permet de calculer pour chaque zone rceptrice le pourcentage de la
surface de la zone occupe par un masque. Si ce masque a t cr partir des
objets dune autre relation, aprs restriction sur un caractre nominal, le rsultat
correspond pour chaque zone rceptrice au pourcentage de la surface occupe par le
caractre (fig. 8.14).

fig. 8.14 : un masque (cultures et paturages) et le pourcentage de la surface dans un


dcoupage (cantons)

8.5.4.3. Go-agrgation par valeur pondre par la surface


Toujours dans le cas dune go-agrgation zone-zone lorsque les dcoupages ne
sont pas hirarchiques, mais lorsque lon veut rendre compte dun attribut
numrique de lun des dcoupages dans lautre, il peut tre intressant de pondrer
par la surface occupe par chaque valeur dans la zone rceptrice. On fait ainsi une
hypothse sur la rpartition linaire des valeurs en fonction de la surface occupe.
On nutilise pas de masque dans cette opration qui effectue directement le
calcul du nouvel attribut en faisant par zone la moyenne des valeurs pondre par la
surface occupe (fig. 8.15).

290

Chapitre 8

fig. 8.15 : calcul de la moyenne dun indice radiomtrique (TM, canal 1) dans des zones
prdfinies (quartiers) par go-agrgation pondre par la surface

8.5.5. Appartenance
Lappartenance est lopration inverse de lagrgation. Elle consiste aller
chercher dans une relation mettrice lobjet qui contient le centrode de lobjet
rcepteur. La valeur de lattribut mettre est alors affecte lobjet rcepteur. La
ralisation informatique dans SAVANE est soit vectorielle (test de linclusion ou de
la distance du centrode lobjet metteur en utilisant les arcs), soit matricielle (on
utilise alors la reprsentation matricielle de la localisation : lexcution est plus
rapide mais la prcision dpend de la taille du pixel de rasterisation et donc de la
taille de la fentre dtude).
Lopration utilise le centrode de lmetteur et peut donc tre ambigu, sauf sil
y a inclusion des objets rcepteurs dans les objets metteurs. Elle ne devrait tre
utilise que dans ce cas.
8.5.6. Goagrgation sur les pixels : le r-chantillonage
Lagencement des objets dune relation de type mosaque permet de dfinir un
certain nombre doprations propre ce type de relation. Par exemple, lopration
de goagrgation par distance peut tre affine en utilisant les mthodes de rchantillonage que nous avons vues au chapitre 6. La relation rceptrice est de type
zone ou mosaque, et la valeur dune zone est calcule partir des pixels metteurs
par voisinage plutt que par distance ou appartenance. On peut ainsi utiliser une
fonction bilinaire ou bicubique pour calculer la valeur dobjet rcepteur.

Analyser 291
8.5.7. Oprations sur les modles numriques : orientation, pente, coulements
Un modle numrique de terrain est un attribut dune relation de type mosaque
reprsentant une altitude. Cet attribut est souvent obtenu par interpolation, comme
nous le verrons dans le paragraphe suivant. De nombreuses oprations sont
spcifiques ce type driv du type mosaque : pente, orientation, coulements,
calculs hydrologiques, calculs de volume ou de visibilit. Nous sommes encore dans
le domaine de lanalyse spatiale, mais spcialise ici un domaine particulier. Nous
pouvons ici appliquer des mthodes correspondant au contenu smantique de
lattribut, alors que nous navions vu jusqu prsent que des oprations valables
quel que soit le contenu smantique de lattribut.
8.5.7.1. Pente et orientation
Pour chaque pixel, la pente ou lorientation est calcule sur les voisins : cest
langle form par le vecteur unitaire normal la surface et le plan z=0 (pente) ou
x=0 (orientation). En chaque point, on approche la surface en utilisant le plan de
rgression le plus proche des quatre voisins du point pi,j (pi-1,j-1,pi+1,j-1,pi+1,j-1,pi+1,j+1).
Lopration cre un nouvel attribut de type entier 16 bits : les pentes et orientation
sont conserves en minutes darc.
8.5.7.2. Dautres indices en gomorphologie et hydrologie
De nombreux indices peuvent ainsi tre calculs partir de lattribut altitude
pour crer de nouveaux attributs : convexit verticale, convexit horizontale,
convexit transversale, encaissement, modle de drainage, bassins-versants,
longueurs de drainage, surfaces draines, distances lexutoire, etc. Tous ces
nouveaux attributs temporaires peuvent bien sr tre utiliss dans la suite de la
requte (fig. 8.16).

292

Chapitre 8

fig. 8.16 : pente et orientation calcules partir dun modle numrique de terrain

8.6. La cration de relations temporaires


Jusqu prsent, nous avons vu des oprations dexploration ou de cration de
nouveaux attributs partir de relations existantes. Aucune de ces oprations ne
crent de nouveaux objets. Mais bien souvent, limplantation spatiale des objets
dune collection ne permet pas davancer dans lanalyse, et il faut modifier
limplantation spatiale en crant de nouveaux objets, soit de toute pice, soit partir
des objets dune collection existante. Nous allons voir dans ce paragraphe les
nombreuses oprations permettant la cration de nouvelles collections dobjets. Ces
oprations sinscrivent toujours dans le cadre de lanalyse spatiale, mais elles vont
plus loin que la simple rponse une question pose. Elles sont fondamentales pour

Analyser 293
assurer un usage efficace de lextension du modle relationnel, car elles permettent
de saffranchir de la barrire impose par le type de limplantation spatiale. En effet,
les oprations que nous avons vues plus haut sont dans de nombreux cas limites
un type de localisation. Le passage dun type un autre permet alors de les utiliser
et met laccent sur la difficult dutilisation dobjets dont la dfinition et la prcision
diffrent, au sein dune mme base de donnes.
Aprs avoir rappel le principe de cration de nouvelles relations temporaires
dans le schma de la base de donnes, nous avons organis ce paragraphe en
regroupant les oprations par le type dimplantation spatiale des objets crs.
8.6.1. Le principe de la cration de nouvelles relations
Lors dune requte, il est possible de crer de nouvelles collections dobjets. Ces
relations sont temporaires, le schma de la base de donnes est modifi
temporairement comme lors de la cration dattributs. Mais la cration dune
nouvelle relation localise implique la cration de toute la structure des fichiers
correspondants : fichier index, fichier descriptif, fichier graphique. La procdure
NouvelleRelation() de la classe CSchema encapsule les diffrentes oprations
ncessaires la modification du schma (A.2.1.2.).
Il existe plusieurs manires de crer une nouvelle collection dobjets :
- par duplication (valable quel que soit le type de la relation) ;
- par dfinition des objets (mailles) ou par digitalisation des objets sur cran
(valable pour les types zone, ligne, point) ;
- partir dune relation existante, par modification gomtrique des objets
(rosion, dilatation, ou par masque) ou par changement de type dimplantation
spatiale.
Nous allons voir rapidement les deux premires oprations, avant de consacrer
un paragraphe plus dtaill la cration de relation par modification des objets
dune relation existante.
8.6.2. La duplication
La duplication dune relation permet de recopier tous les objets dune relation
dans une nouvelle relation identique. Pour le type zone, les arcs ne sont pas
recopis : les deux relations partagent le fichier des arcs.
Cette opration permet de conserver une copie dune relation avant de la
modifier par restriction ou projection.

294

Chapitre 8

8.6.3. La dfinition directe sur cran ou par masque


La dfinition directe sur cran permet lutilisateur de crer une nouvelle
relation temporaire en numrisant directement les objets dans le cadre gographique.
La dfinition par masque cre une relation de type zone, possdant un seul objet
correspondant au masque utilis.
8.6.4. La cration de mailles
Bien souvent, on ne dispose pas dun dcoupage de lespace reprsentatif dune
chelle de description donne, ou suffisamment rgulier pour tre employ dans une
opration de changement dchelle et de go-agrgation. En effet, il ne faut pas que
le dcoupage utilis pour agrger soit corrl la rpartition spatiale des objets que
lon agrge. La solution la plus simple consiste donc crer de nouveaux objets
dont la gomtrie ne puisse pas a priori interfrer dans le processus dagrgation :
les mailles carres ou hexagonales sont les plus employes, car elles correspondent
une rpartition uniforme des objets dans lespace (fig. 8.17).

fig. 8.17 : Donnes ponctuelles, mailles, et go-agrgation dans les mailles

Si la forme des objets est prdfinie, on peut par contre choisir la taille des
mailles. La variation de la dimension de la maille na pas le mme effet selon que le
semis de point des objets agrger est plus concentr ou plus dispers. Dans le
premier cas, la diminution de la taille de la maille a tendance augmenter la

Analyser 295
dispersion relative et les disparits de densit entre les mailles. Dans le second cas,
les effets sont plus faibles. Le choix de la taille des mailles doit tenir compte du
nombre de points agrger et de la forme du semis de points. Souvent, la meilleure
taille est celle qui minimise la variance intra-maille et maximise la variance intermaille pour lattribut agrger.
La cration de maille correspond la cration de nouveaux objets : on cre ici
une nouvelle relation, temporaire, de type zone.
8.7. Les oprations de changement de type dobjet
Il est trs courant dutiliser les objets dune ou plusieurs relations existantes pour
crer de nouveaux objets. Bien souvent, cette cration dobjet saccompagne dun
changement de type dimplantation spatiale des objets des relations dorigine. De
nombreux algorithmes sont employs dans ces oprations : interpolation,
extrapolation, vectorisation, triangulation et tessellation, morphologie
mathmatique, etc. Nous allons dtailler ces diverses mthodes en les classant en
fonction du type de la nouvelle relation cre.
8.7.1. Vers le pixel : interpolation ou rasterisation
8.7.1.1. Mosaque et type Raster
Lobjectif est ici de crer une nouvelle relation dont les objets sont des pixels,
cest--dire des objets de gomtrie identique et de taille connue, comme nous
lavons dfini au chapitre 6. Il y a analogie avec la cration de mailles, mais ici le
nombre dobjets crs sera en gnral beaucoup plus grand et la valeur de lattribut
sera calcule directement lors de la cration des objets et non par go-agrgation
comme dans le cas des mailles. La relation cre est de type mosaque et non de type
zone : la gestion dun nombre de mailles dpassant le million nest pas trs efficace,
alors que la gestion dune relation de type mosaque est conue pour recevoir sans
problme plusieurs dizaines de millions de pixels.
Alors que les mailles sont construites pour recevoir des valeurs par goagrgation, la valeur des pixels est construite directement par interpolation en
utilisant la localisation du centrode des objets initiaux dans le calcul de
linterpolation : le changement dchelle sous-jacent sapparente donc plus une
opration dappartenance qu une opration dagrgation. La taille du pixel sera en
gnral infrieure ou gale la prcision des objets initiaux, alors que la taille des
mailles est le plus souvent choisie pour effectuer une gnralisation. La surface du
pixel nest jamais utilise dans le calcul dinterpolation.

296

Chapitre 8

La relation cre peut tre de type mosaque ou de type raster . Cette relation
particulire fixe la taille des pixels en fonction de la fentre dtude. Elle est gre
comme une relation de type mosaque, mais ne contient quune seule feuille, est
toujours temporaire, et nexiste qu un seul exemplaire dans la requte. Elle est
automatiquement dtruite lors dun changement de fentre dtude ou de projection
gographique.
8.7.1.2. Mthodes dinterpolation
La cration dune relation de type mosaque cre des pixels sur lensemble de la
surface de la fentre dtude ; on peut limiter cette cration au domaine reprsent
par un masque. La cration de la relation et des objets saccompagne de la cration
dun attribut pour tous les pixels : la valeur est obtenue partir des objets des
relations initiales choisies par lutilisateur, qui peuvent tre de type zone, ligne, ou
point. On utilise pour cela des mthodes dinterpolation qui prennent en compte la
position des objets initiaux par rapport au pixel. Les mthodes dinterpolation sont
trs nombreuses : leur choix dpend du contenu smantique de lattribut crer.
Par exemple, la cration dun modle numrique de terrain relve de cet type
dopration : on cherche crer des pixels avec un attribut altitude partir dobjets
initiaux qui peuvent tre des courbes de niveaux ou des points cots. Linterpolation
utilise doit correspondre ce type de problme : de nombreuses mthodes ont t
proposes et font lobjet dune abondante littrature. On peut citer notamment les
mthodes barycentrique, statistique, par triangulation, par fonction polynomiale,
spline, etc.

fig. 8.18 : le dialogue du choix de lopration dinterpolation

Analyser 297
Nous avons dvelopp dans SAVANE quelques mthodes dinterpolation : plus
proche voisin, barycentrique sur les voisins, barycentrique sur tous les points,
bilinaire dans triangulation, spline aprs barycentrique. Ces mthodes permettent
de rpondre la plupart des besoins dinterpolation (fig. 8.18).
8.7.1.2.1. La mthode barycentrique
La mthode dinterpolation barycentrique est la plus utilise en pratique. Elle
permet notamment dobtenir de trs bons rsultats pour la cration des modles
numriques de terrain lorsque les donnes initiales sont suffisamment denses. Nous
appellerons points de rfrence les points du plan qui servent de support au
modle et permettent linterpolation. Ils proviennent de la localisation des objets de
relations existantes dans la base de donnes. La mthode de calcul consiste en une
interpolation de type barycentrique sur les huit points de rfrence les plus proches
du point interpoler, rpartis dans les huit portions du plan. Limportance dun
point de rfrence est dautant plus grande dans le rsultat du calcul que sa distance
au point interpoler est faible (par rapport aux distances des autres points au point
interpoler). Cette mthode ne donne pas une surface diffrentiable, et nutilise pas
de modle local ou de modle de variance : elle ncessite donc une densit de points
de rfrence dautant plus grande que les variations de lattribut sont fortes. Cest en
fonction de cette variation que les points de rfrence doivent tre choisis si cela est
possible.
La mthode dinterpolation barycentrique est stable : elle ne modifie pas la
valeur des points de rfrence dans le rsultat de linterpolation. Cette proprit est
essentielle dans de nombreuses applications.

p2(v2)

p1(v1)

v(Pk) d(Pij,Pm)

p3(v3)

p8(v8)

v(Pij) =
p4(v4)

p7(v7)

p5(v5)
p6(v6)

k=1
8

m=1
m=k

m=1
k=1 m=k

d(Pij,Pm)

298

Chapitre 8

Aprs cration des pixels, le calcul de la valeur de lattribut par interpolation


seffectue en deux temps : dans un premier temps, on affecte chaque pixel la
moyenne des valeurs des points de rfrences dont la distance au pixel est infrieure
la taille du pixel. Ces pixels deviennent alors les points de rfrences utiliss pour
calculer la valeur des autres pixels (une option permet dviter de faire la moyenne
entre les points provenant de diffrentes relations). Dans un second temps, on
cherche pour chaque pixel les pixels les plus proches dans chacun des huit cadrans,
et on affecte au pixel la valeur interpole partir de ces pixels. Enfin, le rsultat
peut tre liss (par une fonction polynomiale de Bziers de degr 6) sur chaque ligne
et chaque colonne pour supprimer les erreurs ventuelles dans les points de
rfrence. La recherche des points valus voisins est ltape la plus longue de
lopration : elle peut tre trs longue si la densit de points de rfrence est trop
faible (fig. 8.19).
Lopration est effectue imagette par imagette. Le nombre dimagettes cres
dans la relation dpend de la taille de pixel choisie pour la nouvelle relation. La
matrice de pixel utilise pour conserver les points de rfrence doit tre plus grande
que limagette pour ne pas exclure arbitrairement les points extrieurs qui pourraient
participer au calcul de la valeur dun point de limagette, notamment pour les points
prs du bord, et assurer ainsi la continuit des valeurs dune imagette lautre.
La classe Cbabel encapsule lensemble des variables et des mthodes utilises
pour le calcul dinterpolation barycentrique (A.2.1.6.).

fig. 8.19 : rsultat de linterpolation barycentrique partir de courbes de niveau

Analyser 299
Les relations donnant les points de rfrence peuvent tre de type zone, ligne, ou
point. Dans la cas de zone, on utilise le centrode de la zone comme point de
rfrence. Dans le cas de ligne, on utilise lensemble de larc reprsentant la ligne,
ce qui donne de nombreux points de rfrence. La mthode Draw() de la classe
CArc calcule les points de rfrence partir des points de larc.
Loption deux passages propos pour le calcul barycentrique dinterpolation
permet de palier au problme pos par une mauvaise densit des points de rfrence
et dviter des temps de calcul trop longs. Le calcul seffectue alors en deux
passages : un premier passage permet de calculer par interpolation des points
suivant un pas donn (un pixel sur dix, par exemple). Ces points calculs sont
ensuite ajouts aux points de rfrence et utiliss dans le calcul gnral
dinterpolation. La recherche de voisins est alors limite au maximum au pas de la
premire interpolation.
8.7.1.2.2. Barycentre sur tous les points
Linterpolation barycentrique sur tous les objets sapparente un calcul de
potentiel ou dinfluence. La valeur calcule pour chaque pixel est la moyenne des
valeurs des points de rfrence pondres par la distance. La mthode ne doit tre
employe que lorsque le nombre de points de rfrence est faible (fig. 8.20). On
peut nanmoins limiter la calculer aux points dont la distance au point interpoler
est infrieure une valeur donne.

fig. 8.20 : exemple dinterpolation barycentrique sur tous les points de rfrence (classe par
quantiles)

300

Chapitre 8

8.7.1.2.3. Interpolation barycentrique sous contrainte


Le caractre interpoler est parfois directement li un autre caractre, connu
sur lensemble de lespace dtude. Par exemple, on ne peut interpoler la
temprature au sol sans tenir compte de laltitude. On a donc le choix dinterpoler
des valeurs normalises (par exemple des tempratures ramenes au niveau de la
mer), puis de calculer les variations dues la dpendance des variables (par
exemple, la dpendance linaire de la temprature en fonction de laltitude), ou de
calculer directement le nouvel attribut par une interpolation sous contrainte. Cette
option est disponible dans SAVANE pour les contraintes linaires.
8.7.1.3. Zone vers pixel : rasterisation
Les oprations que nous avons dcrites au paragraphe prcdent ne prennent en
compte que le centrode des zones dans le processus dinterpolation. Lopration de
rasterisation dune relation zonale permet daffecter des valeurs aux pixels de la
relation raster en fonction de leur appartenance aux zones. Elle correspond
lopration dinterpolation par plus proche voisin ou dappartenance dun pixel
une zone.
On peut ainsi crer des attributs dans la relation raster partir de nombreuses
relations diffrentes. Ces attributs peuvent ensuite tre combins, pixel par pixel, en
utilisant les oprations que nous avons vues au paragraphe 4 de ce chapitre. Comme
nous lavons dj soulign, la valeur du pixel provient dune opration
dappartenance et non dagrgation, comme dans le cas de mailles. Les deux
approches sont donc complmentaires.
La rasterisation dune relation zonale utilise lalgorithme de rasterisation que
nous avons dj vu plusieurs reprises.
8.7.2. Vers la zone : vectorisation ou tessellation
Nous avons dj vu la cration directe dune nouvelle relation de type zone, par
cration de mailles ou directement par digitalisation. Mais il est galement trs
intressant de crer des zones partir des objets dune autre relation. Les mthodes
de cration de zones dpendent du type des objets de la relation initiale :
- partir dune relation de type pixel, on utilisera un algorithme de vectorisation
et lablisation pour crer les arcs et les objets ;
- partir dune relation de type ligne, on utilisera un algorithme de construction
de zone pour crer des polygones partir dun ensemble darcs, si cela est possible ;
- partir dune relation de type point, on utilisera un algorithme de tessellation
pour diviser lespace en zones partir du semis de point ; cette mthode peut

Analyser 301
galement tre utilise pour tous les types dobjets vectoriels, partir du centrode
des objets ;
- partir dune relation de type zone, on peut rdfinir de nouvelles zones par
morphologie mathmatique (rosion ou dilatation) ou par regroupement.
Lalgorithme de vectorisation est le plus complexe. Il est utilis galement pour
calculer le contour des masques aprs des oprations sur leur reprsentation
matricielle.
8.7.2.1. Un algorithme de vectorisation
Lopration de vectorisation est linverse de la rasterisation : elle vise crer des
arcs partir dun ensemble de pixels, en faisant passer un arc entre les pixels qui
nont pas la mme valeur. Nous avons dvelopp un algorithme de vectorisation
dune image code dont nous allons rapidement dcrire le principe.
Lalgorithme de vectorisation que nous avons dvelopp cherche faire passer
les arcs entre les pixels, et non sur les pixels. On ne cherche donc pas le
cheminement dun pixel un autre, mais on cherche les configurations de valeurs
quatre pixels adjacents qui permettent le passage dun arc : un arc doit passer entre
deux pixels si leurs valeurs sont diffrentes. Dans une premire phase, lalgorithme
teste les configurations de quatre pixels adjacents pour dterminer si une ligne doit
passer entre ces pixels. Dans une seconde phase, les segments darcs ainsi
dtermins sont chans entre eux pour crer des arcs. Dans une troisime phase, les
objets sont crs en fonction des valeurs de limage initiale. La classe
CVectoriser encapsule lensemble des oprations de la vectorisation dune
image (A.2.2.3.).
Les configurations possibles de quatre pixels adjacents sont au nombre de 13.
Elles sont codes suivant le schma suivant, o deux pixels de mme valeur sont
reprsents par la mme couleur, et o le trait reprsente le trajet du segment darc
crer :

302

Chapitre 8

11

12

13

10

13

Limage initiale est donc remplace par limage des configurations


codes (procdure SegmentType() de Cvectoriser()).
La seconde phase de lalgorithme, la plus dlicate et la plus longue, vise
chaner lensemble de ces segments darcs pour constituer des arcs. Les arcs
conservent le code des pixels adjacents quils sparent. Le principe est assez
simple : partir du premier segment qui na pas encore t chan, on cherche le
segment qui peut le continuer, et ainsi de suite, dans un sens, puis dans lautre. Le
type du segment donne la direction dans laquelle il faut chercher le suivant. La
recherche doit sarrter lorsque lon tombe sur une configuration trois segments,
qui correspond un nud (type 5, 6, 8 , 10, 13). Des types temporaires doivent tre
crs pour grer les configurations plusieurs segments (5, 6, 7, 8, 9, 10, 13 ; par
exemple, le type 6 devient type 2 ou 3 aprs chanage dun premier segment, mais
sans oublier que la configuration correspond un nud). Les bords de limage sont
chans part.

Analyser 303

fig. 8.21 : vectorisation aprs classification dune mosaque (image TM)

Enfin, les arcs ainsi crs sont lisss pour liminer les points superflus (de
nombreux points crs sont aligns) (fig. 8.21).
Lalgorithme de vectorisation est employ pour crer une relation de type zone
partir dune relation de type mosaque. La vectorisation est effectue pour chaque
imagette et cre dans la relation vectorielle une feuille par imagette.
Les objets zone sont crs partir des codes rencontrs dans la mosaque initiale,
par imagette. Chaque zone reprsente en gnral un ensemble de polygones non
connexes, car il ny a pas lablisation de chaque polygone. La cration dune zone
saccompagne de la cration de son centrode.
La localisation dun centrode partir dun ensemble de polygones quelconques
nest pas triviale : il faut sassurer que le centrode se trouve bien dans le polygone
et est bien plac par rapport la forme du polygone. Plusieurs mthodes peuvent
tre employes, avec la mme ide : dterminer un point central, puis bouger ce
point sil ne se trouve pas dans la zone. Comme point central, on peut prendre le
centre du plus petit rectangle contenant les polygones, le centre de lun des
polygones, ou le centre du cercle inscrit lun des polygones. Le test de linclusion
du point dans les polygones peut tre effectu par lalgorithme YX que nous avons
dj vu au chapitre 7. Si le point est en dehors de la surface de la zone, il peut tre
dplac en X pour se situer au milieu du polygone qui le prcde ou qui le suit.
Lalgorithme de vectorisation est galement employ pour vectoriser les
masques, ou pour vectoriser des objets aprs des oprations effectues sur des
reprsentations matricielles.

304

Chapitre 8

8.7.2.2. Un algorithme de tessellation


On utilise pour la cration de zones partir de points un algorithme de
tessellation, cest--dire de partition de lespace en zones disjointes. Nous avons mis
en uvre dans SAVANE la tessellation de Vorono, duale de la triangulation de
Delaunay que nous avons dj vue au chapitre 6. La tessellation est calcule partir
de la triangulation : celle-ci donne la liste oriente des artes des triangles partant de
chaque point, il suffit donc de calculer les intersections deux deux de ces artes
pour dterminer les arcs. Il y a ici bijection entre les points initiaux et les zones
cres, et chaque zone conserve lidentifiant de lunique point initial quelle
contient. Les points servent galement de centrodes aux zones (fig. 8.22). Le bord
de la fentre gographique de travail est utilise pour fermer les zones extrieures.

fig. 8.22 : cration de zones partir de points : tessellation de Vorono

8.7.2.3. De la ligne la zone : crer la topologie


Il est possible de crer des zones partir de lignes destines former le contour
des zones. Celles-ci doivent alors former un graphe planaire ferm. Lopration
seffectue en deux temps :
- vrification de la planarit et de la fermeture du graphe ;
- cration des polygones.
Pour vrifier la planarit du graphe, on teste les arcs deux deux la recherche
dune intersection non situe sur une extrmit, aprs avoir limin les arcs ou
portions darc en double. On teste la fermeture en comptant le nombre dapparition

Analyser 305
de chaque nud dans lensemble des arcs. Chaque nud doit apparatre en nombre
pair. La cration des polygones utilise lalgorithme vu au chapitre 7 pour la
reconstitution de polygones partir darcs.
8.7.2.4. De la zone la zone : regrouper, roder, dilater
On peut galement crer une nouvelle relation zonale partir des zones dune
autre relation, par regroupement de zones ou par modification de la gomtrie des
zones initiales en utilisation des algorithmes de morphologie mathmatique (rosion,
dilatation).
Le regroupement de zones se fait sur un attribut nominal de la relation initiale.
Cet attribut devient une cl descriptive des objets de la relation rsultante. La
topologie doit donc tre modifie pour supprimer les arcs frontire de deux zones
initiales de mme valeur et recrer de nouvelles zones partir de ces arcs. On
prendra comme centrode des nouvelles zones le centrode de lune des zones
initiales de mme valeur.
Le dcoupage en feuille pose ici un problme difficile rsoudre, car deux zones
de feuilles diffrentes mais de mme valeur pour lattribut qualitatif choisi doivent
tre regroupes dans un mme objet de la nouvelle relation. Cette opration fait
donc perdre lindexation gomtrique, et la relation rsultante ne contient plus
quune seule feuille. Les arcs en double, prsents dans deux feuilles distinctes mais
sparant deux zones adjacentes de mme valeur descriptive doivent tre limins.
Lrosion et la dilatation sont des oprations dun autre type. Elles modifient les
contours des zones sans modifier les valeurs descriptives des objets. Le nombre
dobjets reste le mme (fig. 8.23).
Dans SAVANE, la ralisation de ces oprations utilise la reprsentation
matricielle des objets. Aprs rosion ou dilatation des objets dans limage, cette
image est vectorise pour crer les contours des nouvelles zones. Voici par exemple
la mthode de dilatation dune image matricielle. On cherche, pour chaque pixel
susceptible dtre rempli (les pixels qui ne correspondent aucune zone initiale) la
zone initiale la plus proche, en limitant la recherche la distance de dilatation. On
peut limiter la dilatation un masque. Pour amliorer les performances de
lalgorithme, on construit toujours un masque autour des objets dilater, avec la
distance de dilatation : seuls les pixels de ce masque sont susceptibles dtre
remplis. La procdure de dilatation est implmente dans la procdure globale
DilaterImage() dont le code est dcrit dans lannexe A.2.2.4. (pour roder, on
inverse le processus : les pixels susceptibles dtre remplis sont ceux qui
appartiennent une zone initiale, et on dilate lespace vide).

306

Chapitre 8

fig. 8.23 : deux dilatations partir des objets initiaux (5 m, 20 m). Lobjectif est ici de
diminuer ou de remplir lespace interstitiel en ville

On peut galement utiliser cet algorithme pour crer des zones partir de lignes
ou de points. Chaque objet donne le jour une zone de la nouvelle relation (fig.
8.24).

fig. 8.24 : cration de zones par dilatation partir de lignes ou de points

Analyser 307
8.7.3. Vers la ligne
On peut crer de nouveaux objets de type ligne partir de zones, par
squelettisation, ou partir de pixels, par vectorisation. On peut galement considrer
les frontires des zones comme des objets de type ligne, en affectant chaque
frontire une valeur dduite des valeurs des deux zones.
8.7.3.1. Squelettisation de zones
La squelettisation dune zone est lopration qui permet de rduire la surface de
la zone la ligne la plus reprsentative de la forme de cette surface. Le squelette
dune zone peut tre obtenu partir de son contour : le squelette est lensemble des
points de la zone qui ont au moins un point du contour la mme distance que le
point du contour le plus proche. Il peut galement tre obtenu partir dun attribut
qualitatif dune relation mosaque : on emploie alors des mthodes itratives de
morphologie mathmatique (rosions successives jusqu stabilit, par exemple).
8.7.3.2. Vectorisation et courbes disovaleurs
La vectorisation permet dobtenir des lignes partir dun attribut dune relation
de type zone ou mosaque, par suivi des diffrences de lattribut. Si lattribut est
numrique, il est automatiquement class en intervalles gaux : les objets
correspondent alors des courbes disovaleurs pour cet attribut. Lalgorithme de
vectorisation est toujours le mme, mais les objets crs ne sont plus considrs
comme des contours de zones mais comme des lignes. Si la relation initiale est de
type zone, on utilise limage raster de lattribut de la relation.
La cration de courbes disovaleurs partir dun attribut cr par interpolation
permet de tester lidempotence de la composition des deux oprations (fig. 8.25) :

308

Chapitre 8

fig. 8.25 : Courbes de niveau initiales, interpolation, puis cration de courbes de niveau par
vectorisation (en rouge, superposes aux courbes initiales en bleu)

8.7.4. Vers le point


Le type point est le plus simple de tous les types de relations localises. De plus,
les types zone et ligne conservent pour chaque objet un centrode qui permet de
considrer ces objets comme des points dans de nombreuses oprations de dessin ou
de go-agrgation. Il ny a donc pas lieu de crer une nouvelle relation de type point
lorsque lon souhaite utiliser des objets de type zone ou ligne dans ces oprations.
Nous avons dj vu comment trouver un centrode partir dune zone dfinie par
ses arcs frontires, ou partir de larc dune ligne, lors de la cration dobjets de ce
type.

Analyser 309
Par contre, il peut tre intressant de dfinir des objets de type point partir de la
localisation dobjets dune relation suivant la valeur de lun des attributs des objets,
de manire avoir une vision synthtique dun phnomne ou reprsenter un semis
de points par un seul point.
La gestion des rseaux impose souvent de diffrencier ligne et nud, et de traiter
les deux collections sparment, sans oublier nanmoins les relations topologiques
entre les deux entits.
8.7.4.1. Centre dun semis de points
Cette procdure de cration de relation ponctuelle permet de mettre en uvre les
oprations de reprsentation dun semis de points par un point remarquable,
oprations que nous avons voqu au dbut de ce chapitre. On peut ainsi crer un
point comme point mdian ou comme point moyen dun ensemble de points ou de
centrodes (fig. 8.26). On peut galement pondrer le calcul du point moyen par la
valeur dun attribut numrique.

fig. 8.26 : Cration de points centraux (en bleu) partir dun semis de points (provenant des
lots, en rouge) et de lappartenance au quartier (attribut cr par go-appartenance)

8.7.4.2. De la ligne aux points : lutilisation des nuds


La cration dune relation ponctuelle partir des extrmits de lignes permet de
sparer les nuds des arcs. Cette sparation est importante car, sil est possible de
grer un rseau avec une relation de type ligne, certaines proprits du rseau
doivent tre exprimes sur les nuds et non sur les arcs. Ces proprits seront donc

310

Chapitre 8

calcules partir de la localisation des nuds regroups dans une relation


ponctuelle. Par exemple, la cration dune relation ponctuelle partir des extrmits
des objets dune relation de type ligne saccompagne de la cration dun attribut
indiquant pour chaque nud le nombre doccurrence de lextrmit dans chaque
objet ligne de la relation initiale (fig. 8.27).

fig. 8.27 : occurrence des nuds dans un rseau de lignes de bus

8.8. Conclusion
Avec lanalyse spatiale, le SIG quitte le strict domaine du systme de gestion de
donnes et devient galement programme dapplication, puisque, comme nous
lavions vu au chapitre 5, les seules oprations de gestion relationnelle ne sauraient
permettre de rpondre aux problmes lis la schmatisation de lespace. Ds lors,
nous ne pouvons que dvelopper et prsenter ici quelques mthodes dapplication
des donnes localises, tant les champs dapplication sont vastes et varis. Lanalyse
spatiale sadresse plus particulirement aux gographes, mais la dmarche pourrait
tre la mme quelque soit le domaine dapplication envisag, comme lhydrologie,
la gologie, la gomorphologie, lurbanisme, la gestion du territoire, etc. Le SIG
senrichit non seulement de structures de donnes propres certaines applications, il
senrichit galement de mthodes spcifiques pour devenir un vritable systme
objet. Le dveloppement dun systme comme SAVANE peut donc se poursuivre
selon trois voies : limplmentation de nouvelles oprations danalyse ou de
simulation directement dans le module dexploitation, lappel de fonctions externes
partir dun schma de mthodes dveloppes par les concepteurs dobjets ou de

Analyser 311
collections dobjets et spcialises un domaine dapplication particulier (lappel de
fonction externe est gre directement en tant quopration lmentaire de la
requte), et le dveloppement dune librairie permettant aux dveloppeurs
dapplications dintgrer lensemble des mthodes de gestion de donnes dans le
programme dapplication.

312

Chapitre 8

Analyser 313

Bibliographie

[BEG 94] BEGUIN M., PUMAIN D., La reprsentation des donnes gographiques, 1994
Armand Colin, Cursus , Paris
[HAG 73] HAGGETT P., Lanalyse spatiale en gographie humaine, 1973, Armand Colin,
Paris
[LAU 93] LAURINI R., MILLERET-RAFFORT F., Les bases de donnes en gomatique, 1993,
Hermes, Paris
[MON 82] MONMONIER M., Computer-Assisted Cartography, Principles and Prospects, 1982,
Prentice-Hall
[ORO 93] OROURKE J., Computational Geometry in C, 1993, Cambridge University Press
[PAR 97] PARKER J.R., Algorithms for Image Processing and Computer Vision, 1997, Wiley
Computer Publishing
[PUM 97] PUMAIN D., SAINT-JULIEN T., Lanalyse spatiale, 1997, Armand Colin, Cursus ,
Paris
[RIM 90] RIMBERT S., Carto-graphies, 1990, Herms, Paris
[SAN 89] SANDERS L., Lanalyse des donnes applique la gographie, 1989, RECLUS,
Montpellier
[VOI 95] VOIRON C., Analyse spatiale et analyse dimages, 1995, RECLUS, Montpellier

Chapitre 9

Reprsenter

Ce dernier chapitre traite de la reprsentation des donnes gographiques dans le


systme SAVANE. Aprs la modlisation, la saisie, le traitement, lanalyse, cest la
dernire tape dun long processus et lun des objectifs du systme construire :
pour tre complet, un systme dinformation gographique doit intgrer des
fonctionnalits classiques ddition graphique ainsi que des capacits spcialises
dans la reprsentation cartographique, de manire prsenter les rsultats dune
requte. Cette dernire tape est fondamentale et passionnante, car la reprsentation
cartographique est le moyen privilgi pour prsenter des donnes ds lors quelles
sont localises, et cette reprsentation correspond de nouveau une schmatisation
des objets et des phnomnes contrairement aux bases de donnes classiques qui
prsentent les rsultats sous forme de listes ou de formulaires. Nous nallons ici que
rappeler brivement les principes de la cartographie ou de la smiologie graphique
pour dcrire plus en dtail le principe et limplmentation des procdures de
cartographie partir des donnes gres par le systme SAVANE.
9.1. Les principes de la reprsentation cartographique
La reprsentation graphique est la transcription laide de signes graphiques
dune information connue laide dun autre systme de signes. La reprsentation
graphique est une partie de la smiologie, science qui traite de tous les systmes de
signe [BER 67]. Le systme de signes qui nous intresse ici ne concerne que ce qui
est reprsentable sur un cran dordinateur ou sur une feuille plane de papier blanc,
par tous les moyens graphiques disponibles. On traitera un peu part lintervention
du mouvement et lanimation, car les lois graphiques du cinma sont trs diffrentes
des lois graphiques de la cartographie. On traitera galement part lintervention de

316

Chapitre 9

la troisime dimension et la reprsentation en perspective, car bien que J. Bertin ne


la prconise pas pour visualiser des donnes quantitatives, elle savre tre une aide
consquente linterprtation des photographies ariennes ou des images satellites.
9.1.1. Le langage cartographique
Le langage cartographique regroupe les moyens graphiques permettant
lutilisation de ces signes pour transmettre une information. Cest une forme
dexpression dont les signes graphiques lmentaires (le point, le trait, la tache)
seraient lalphabet, dont le vocabulaire est fait de variables visuelles et dont la
syntaxe est dfinie par les rgles de la perception visuelle. Les lments du dessin
constituent le signifiant, le contenu du message, dont le signifi, le contenu
informatif, rside dans la correspondance tablie entre les signes et linformation
transmettre. [BEG 94].
Ce langage doit satisfaire plusieurs objectifs : obir aux rgles gnrales de la
perception visuelle, tre universel, cest--dire comprhensible par tous ceux qui ont
les mmes rgles de perception visuelle, tre cohrent en vitant la redondance, la
surcharge ou lambigut. En combinant les diverses variables dont il dispose, le
langage cartographique offre une trs large gamme de possibilits pour reprsenter
un phnomne, mais le cartographe, dans son choix dune reprsentation, doit
sefforcer de garantir la clart et cohrence du message. De nombreuses rgles ont
t tablies en vue du respect de ces principes [BER 67].
Dans les limites que nous avons fixes plus haut, on considre que le systme
graphique dispose de sept variables :
- une variable dimplantation en deux dimensions : une tache visible peut
reprsenter un point, une ligne, ou une zone ;
- six variables de reprsentation : taille, valeur, grain (ou trame), couleur,
orientation, forme.
A partir dobjets gographiques, le cartographe ralise une carte en utilisant des
signes lmentaires quil distribue selon une certaine implantation graphique. Une
carte est constitu de figurs, ensemble de dessins visant reprsenter ou
schmatiser le phnomne cartographier. Le langage cartographique nutilise que
trois signes graphiques lmentaires pour dessiner un figur : un point, un trait, un
aplat de noir ou de couleur. Limplantation graphique est la manire de reprsenter
un figur partir de ces signes lmentaires. Par exemple, limplantation graphique
est ponctuelle lorsque le figur est un symbole. Il ny a pas forcment de
correspondance entre implantation gographique et implantation graphique : par
exemple, il est courant de reprsenter une zone par un symbole (implantation
ponctuelle), ou par un contour (implantation linaire). Ce passage correspond au

Reprsenter 317
pouvoir de modlisation et de schmatisation de la cartographie dont nous avons
dj parl au chapitre 3.
9.1.2. Les variables visuelles
Les variables visuelles de reprsentation (forme, taille, couleur, valeur, grain ou
trame, orientation) permettent de faire varier les signes graphiques en fonction des
valeurs des objets gographiques schmatiser. Elles sont utilises pour reprsenter
graphiquement, partir dobjets localiss, des informations qualitatives, des
variations quantitatives, des rpartitions ordonnes, permettant ainsi de schmatiser
le phnomne que lon cherche exprimer. Lutilisation dun ordinateur permet de
simplifier considrablement les oprations visant dessiner un figur correspondant
aux valeurs dun objet gographique. Cest lobjet de la cartographie automatique.
9.1.2.1. La forme
La forme dun lment graphique permet de transcrire une information
qualitative. Il existe une infinit de formes disponibles, allant des symboles les plus
simples carrs, cercles, etc. - aux pictogrammes symboliques vocateurs de tel ou
tel phnomne. Une carte, pour rester lisible, ne devra pas en contenir plus dune
dizaine. La forme est utilise dans tous les types dimplantation graphique : elle est
la base des figurs ponctuels, et sert galement diffrencier des lignes de natures
diffrentes (frontires, courbes topographiques, failles, etc.). La forme dun aplat est
en fait une texture obtenue partir de la rptition dune forme lmentaire. Quelle
que soit limplantation graphique, la forme ne doit jamais tre employe pour
reprsenter une variation quantitative.
9.1.2.2. La taille
La taille dun figur est dfinie par sa longueur, sa hauteur, sa surface ou son
volume. Contrairement la forme, la taille est utilise pour reprsenter des
variations quantitatives. De ce fait, elle permet non seulement de reprsenter des
quantits mais galement lordre des diffrents objets, car lil ordonne
naturellement, du plus petit au plus grand, une forme en fonction des diffrences de
longueur ou de surface, et dautant plus facilement que ltalement des tailles est
galement rparti entre la plus petite et la plus grande taille : on sefforcera donc
souvent de rendre la correspondance phnomne-taille proportionnelle, en agissant
sur la variable gographique reprsenter. La taille peut tre utilise pour les
implantations graphiques ponctuelles et linaires ; on peut faire varier lpaisseur
dun segment de droite en fonction dun attribut numrique ; on peut faire varier la
surface dun symbole proportionnellement une variable.

318

Chapitre 9

9.1.2.3. La couleur
Lil humain peroit facilement de nombreuses teintes, et la couleur est
abondamment utilise en cartographie. Une couleur peut sexprimer par la
proportion de chacune des couleurs primaires (cyan, magenta, jaune), ou, sur un
cran, par la proportion des couleurs fondamentales (rouge, vert, bleu). Lhomme
peroit plus facilement les diffrences de couleur grce aux variations de ton,
dintensit, et de saturation. La couleur permet de diffrencier aisment des
variations aussi bien quantitatives que qualitatives, mais cest la variable visuelle la
plus utilise pour reprsenter des diffrences qualitatives. On a dailleurs tabli dans
de nombreuses thmatiques des palettes de couleurs standards pour reprsenter des
modalits de la thmatique (et gologie, en pdologie notamment). Par contre, la
couleur seule ne suffit pas pour reprsenter un ordre, car il est impossible dagir sur
lune des composantes de la couleur sans altrer visuellement lordre les deux
autres. Dans un dgrad de couleur, lordre des couleurs ne correspond pas de faon
intuitive un ordre numrique. Nanmoins, on utilise parfois des dgrads de
couleurs pour reprsenter des variations numriques, et lon sefforce alors de
nutiliser que quelques tons diffrents.
Si la carte est destine limpression, il faut tre trs attentif aux couleurs
employes. Le rendu dune couleur est toujours diffrent sur un cran et en
impression. On choisira les couleurs en fonction de la technique employe pour
limpression, et le plus souvent partir dune charte imprime fournie par
limprimeur et donnant le rendu des couleurs en fonction de leurs niveaux dans les
trois couleurs primaires (benday).
9.1.2.4. La valeur
La valeur correspond au rapport entre les quantits de noir et de blanc perues
dans une surface donne. La variation de valeur est la progression continue que
lil peroit dans la suite des gris qui schelonnent du noir au blanc. La valeur
dune surface colore est dsigne par le gris qui sgalise en valeur avec cette
surface. Cette variable visuelle est toujours ordonne. Si lil peut distinguer un
grand nombre de niveaux de gris, en pratique il faut limiter le nombre de niveaux
6 ou 7. On utilise essentiellement cette variable pour reprsenter des valeurs
qualitatives ordonnes sur des implantations zonales, et la surface ne doit pas tre
trop petite pour que lil puisse apprcier le rapport entre le blanc et le noir.
9.1.2.5. Grain, trame, texture
Le grain est la quantit de taches sparables dans une surface donne. La tache
est un motif, gnralement simple : carr, disque, ligne. La variation de grain est la
sensation qui rsulte de la succession des rductions photographiques du semis de
taches. Les rductions augmentent le nombre de taches mais ne font pas varier la

Reprsenter 319
valeur de la surface. Toute valeur peut donner lieu une variation de grain, mais
cest dans les valeurs moyennes que les paliers de grain sont les plus sensibles.
Cest en implantation zonale que le grain est le plus utilis. Mais cette variable
visuelle est dun usage dlicat, car il est difficile den matriser la perception :
valeur gale une trame gros grain parait plus noire quune trame petit grain qui
sera perue comme plus couvrante et plus grise.
9.1.2.6. Orientation
Lorientation est dfinie par langle que fait un figur avec la verticale. Pour que
la variation devienne significative, il faut pouvoir dceler des catgories
dorientation, ce qui en limite considrablement le nombre disponible. En gnral,
on se limite quatre directions : verticale, horizontale, et deux obliques 45.
9.1.3. La reprsentation cartographique
A partir dobjets gographiques, le cartographe dispose dune grande libert
pour reprsenter ou schmatiser ces objets sur une carte en utilisant figurs et
variables visuelles. Il peut diffrencier implantation gographique et implantation
graphique ; il peut choisir des variables visuelles en fonction des implantations et de
la nature des informations reprsenter.
Lutilisation de la cartographie automatique supprime tout travail de dessin
manuel, mais augmente la libert de choix graphiques. Ainsi, lessor des SIG doit
saccompagner dun effort de formation la cartographique, puisque ces systmes
mettent disposition de lutilisateur la fois des outils de traitement et de
reprsentation de linformation gographique, avec de nombreuses possibilits de
schmatisation et de modlisation. Les SIG rapprochent gographie et cartographie,
comme nous lavons dj soulign au chapitre 3, mais ce rapprochement ne peut
tre fructueux qu la condition du respect mutuel des rgles imposes par les deux
disciplines.
Gnralement, le gographe-cartographe cherchera conserver pour la
reprsentation cartographique limplantation gographique des objets, et ce dautant
plus quil cherchera rendre compte directement de la modlisation initiale de la
ralit. Par contre, cette correspondance sera souvent modifie lorsque la carte rend
compte dun travail de synthse ou de modlisation. Par exemple, lchelle de la
carte est un lment important de cette schmatisation ; elle va de pair avec une
simplification de linformation et une modlisation qui induit souvent une
reprsentation des objets de type zone par des symboles ponctuels. Limplantation
gographique zonale est la plus difficile reprsenter telle quelle, sans en changer

320

Chapitre 9

limplantation ; on ne dispose pas pour limplantation graphique zonale de variables


visuelles permettant facilement de transcrire la valeur absolue ; les diffrences de
surface entre les objets induisent frquemment des erreurs dinterprtation de la
reprsentation. Elle sera donc souvent remplace par une implantation graphique
linaire ou ponctuelle. Le choix des variables visuelles est fonction du type
dimplantation et de la nature des variables reprsenter, suivant les principes
numrs au paragraphe prcdent. Pour rsumer :
- les attributs qualitatifs sont reprsents au moyen de variations de forme et de
couleur (implantation ponctuelle et linaire), de couleur et de texture (implantation
zonale) ;
- lordre dun attribut quantitatif est reprsent par une variation de valeur, un
dgrad de couleur, un variation de taille en implantation ponctuelle, une variation
de taille ou un dgrad de couleur en implantation linaire, une variation de valeur,
un dgrad de couleur, une variation de grain en implantation zonale ;
- la valeur absolue dun attribut quantitatif est reprsente par une variation de
taille en implantation ponctuelle ou linaire.
9.1.4. Lgendes et habillage
La transmission de linformation laide du langage cartographique
saccompagne galement de rgles de mise en forme, dune part pour reprsenter la
correspondance entre variables visuelles et information descriptive (la lgende),
dautre part pour dcrire la position spatiale de lespace reprsent (amorces
gographiques, rose des vents, indication de la projection, etc.). Enfin, il est courant
dajouter des lments graphiques pour faciliter la lecture de la carte ou de modifier
la position de signes pour rpondre des rgles gnrales de prsentation.
9.2. La cartographie avec SAVANE : carte et cadres
Lergonomie du module SAVANE du SIG est construite pour faciliter
lexpression graphique du rsultat dune requte. Le document de base du logiciel
est donc une carte, cest--dire une feuille de papier avec un cadre gorfrenc
destin contenir une reprsentation graphique dune requte sur des donnes
gographiques.
9.2.1. La carte
A lentre dans le module dexploitation de SAVANE apparat une feuille de
papier sur lcran, reprsentation graphique de lunique instance de la classe
CCarte. Cette feuille de papier est destine contenir la reprsentation graphique

Reprsenter 321
des diffrents cadres gographiques, instances de la classe CCadre, chaque cadre
correspondant une requte sur la base de donnes comme nous lavons vu depuis
le chapitre 5. Une carte doit contenir au minimum un cadre, et peut en contenir
jusqu dix. Elle est galement destine contenir les objets graphiques dessins par
lutilisateur (textes, logotypes, images, lgende, dessins, etc.) (fig. 9.1).

fig. 9.1 : une carte ralise avec SAVANE

Lobjet carte, instance de la classe CCarte, contient de nombreux paramtres


graphiques permettant de la dessiner sur lcran ou de limprimer : taille,
orientation, couleur du fond, paramtres de visualisation sur lcran (position et
agrandissement) (A.2.4.1). Elle contient galement un tableau donnant les pointeurs
des objets graphiques quelle contient (de types drivs du type CODD, A.2.4.2).
Lutilisateur agit directement sur ces paramtres grce lditeur graphique, conu
comme un logiciel de dessin graphique : la fentre principale du module SAVANE
correspond un diteur graphique traditionnel permettant de dessiner sur une feuille
de papier avec des outils de dessin.. Il a donc sa disposition des fonctions de

322

Chapitre 9

dessin tout fait classiques, qui lui permettent de se dplacer dans la page et dy
dessiner des figurs. Chaque objet de dessin correspond une classe particulire
drive de CODD, et contenant les paramtres et les mthodes permettant de le
dessiner ou de limprimer (A.2.4.2.). Les objets peuvent tre groups, et un groupe
peut tre slectionn par lutilisateur pour modifier les paramtres des objets
graphiques. Nous avons construit deux classes permettant de manipuler groupes et
slection sur cran (CGroupe, CSelection, A.2.4.3.). Les cadres sont des objets
graphiques plus complexes que nous allons dcrire dans la paragraphe suivant, mais
ils sont manipuls grce lditeur graphique comme les autres objets graphiques
(slection, dplacement, duplication, modification).

fig. 9.2 : la fentre principale de SAVANE est un diteur graphique

Les lgendes et les chelles graphiques proviennent des cadres dinterrogation.


Mais une fois poss dans la carte, ces lments sont des objets graphiques de type
CODD comme les autres, et peuvent tre manipuls grce lditeur graphique,
contrairement aux figurs qui proviennent des objets gographiques, comme nous
allons le dcrire dans le paragraphe suivant.
9.2.2. Les cadres
Un cadre peut tre vu comme une fentre sur la base de donnes contenant un
moment donn, un tat temporaire de la base correspondant une interrogation et
aux oprations effectues (calculs, cration de nouvelles variables, croisement et
jointure dobjets, etc.). Ltat temporaire de la base li au cadre est conserv avec la
carte qui contient le cadre, ainsi que la macro-commande correspondant toutes les

Reprsenter 323
oprations effectues dans ce cadre. En plus de la requte et de ltat temporaire de
la base, au cadre sont attachs des paramtres qui lui sont propres et qui permettent
de le dessiner dans la carte (espace gographique visualis, projection gographique,
chelle de trac, visualisation des amorces gographiques ou de projection, type de
dessin pour le bord, position dans la carte) (A.2.4.4.). Un dialogue permet de choisir
lensemble de ces paramtres (fig. 9.3). Lchelle de trac correspond la dfinition
exacte de lchelle en cartographie, savoir le facteur de rduction entre
coordonnes de projection et coordonnes de dessin. La taille du cadre dans la carte
est donc fonction de lespace gographique visualis et de lchelle. Lespace
gographique visualis peut tre diffrent de la fentre gographique de travail
correspondant la requte (de type CWind). Lutilisateur peut modifier directement
lespace gographique sur lcran en modifiant la position des bords du cadre.

fig. 9.3 : dialogue de proprits dun cadre gographique

Lchelle graphique dpend du cadre auquel elle est attache, puisquelle dpend
de lchelle de reprsentation du cadre. Le dialogue de cration dune chelle
graphique donne le choix de plusieurs types de dessin. Comme les signes
graphiques constituant une chelle graphique nont pas vocation tre modifis,
nous avons cr une classe CODD_ECHELLE drive de CODD pour reprsenter ce
type dobjet graphique (A.2.4.2.).
La reprsentation cartographique des objets des relations contenues dans un
cadre utilise les principes de la smiologie graphique que nous avons noncs au
dbut de ce chapitre. Pour chaque cadre, les paramtres permettant dassocier
implantation graphique et variables visuelles, partir des relations et des attributs

324

Chapitre 9

reprsenter, sont conservs dans un objet de type CCartExplorateur, que nous


appelons explorateur cartographique, et auquel nous consacrerons le paragraphe
9.3., aprs avoir indiqu comment est trait la couleur dans le systme SAVANE.
9.2.3. Couleurs et palettes
Une couleur peut tre dcrite grce aux proportions de couleurs fondamentales
quelle contient. En informatique, on utilise habituellement des niveaux de rouge,
vert, bleu, chaque niveau tant cod de 0 255 (de manire occuper un octet en
mmoire). On a ainsi la possibilit de coder environ 16 millions de couleurs, mme
si certaines couleurs peuvent difficilement tre code de cette manire (notamment
les teintes dor ou dargent, ou les couleurs fluorescentes). Dans le codage RVB, le
niveau de chaque couleur primaire correspond directement la quantit dlectrons
mise par le tube cathodique dans chacune des composantes de couleur. Pour du
papier, on rsonne linverse, puisque intervient une quantit dencre dans chacune
des composantes. On exprime alors une couleur par les proportions de cyan,
magenta, jaune quelle contient. Parfois, on spare galement le noir, de manire
sparer teinte et saturation, et amliorer limpression en quadrichromie (une couleur
sexprime alors en proportions de cyan, magenta, jaune, noir quelle contient).

fig. 9.4 : dialogues de dfinition dune couleur et de choix dans une palette

Dans le systme SAVANE, une couleur est dfinie par ses niveaux de rouge,
vert, bleu, ou ses proportions de cyan, magenta, jaune. La dfinition dune couleur
seffectue directement sur lcran grce un dialogue (fig. 9.4). Pour viter davoir
redfinir une couleur chaque fois que lon a besoin de dfinir la couleur dun
lment, le systme SAVANE utilise des palettes, cest--dire des ensembles de

Reprsenter 325
couleurs prdfinies et conserves par le systme (classe CPaletteSavane,
A.2.4.8.). Lutilisateur choisit donc une couleur dans une palette quil a constitu
auparavant ou que le systme lui propose (palettes prdfinies). On peut ainsi crer
une fois pour toute des ensembles de couleurs (des palettes) correspondant une
thmatique particulire (topographie, gologie, pdologie, etc.). Lutilisation dune
palette est dailleurs ncessaire dans les oprations de reprsentation par dgrad,
puisque cest le systme qui va automatiquement affecter la couleur du dgrad en
fonction de la valeur de la variable descriptive reprsenter. Il suffit alors de
modifier la palette de couleurs pour modifier la correspondance valeur numriquecouleur. Mme chose pour une image code : il serait trs fastidieux davoir
dfinir la couleur correspondant chaque valeur dune image (par exemple, une
image satellite code de 0 255). On utilise alors une palette et une fonction de
correspondance linaire entre code de limage et indice de la couleur dans la palette.
Le systme SAVANE utilise deux palettes distinctes pour dessiner des dgrads
dans une carte : une palette dite thmatique, et une palette dite imagerie. Les palettes
thmatiques contiennent 100 couleurs, les palettes imageries 128 couleurs. Il est
donc possible de dessiner simultanment deux dgrads. Par exemple, pour dessiner
une photographie arienne code sur 256 niveaux, on peut utiliser une palette de
gris et une fonction de correspondance entre chaque niveau de limage et la palette
imagerie (par dfaut, f(x)=x/2). Pour augmenter le contraste de limage, on peut soit
modifier la palette de gris (en restreignant la variation de gris), soit modifier la
fonction de correspondance (f(x)=(b-a)x/255 + a, pour une variation entre la couleur
dindice a et la couleur dindice b de la palette initiale). La carte conserve ses
palettes et les charge automatiquement lors de son ouverture.
Certains ordinateurs sont limits dans lutilisation de la couleur sur cran : il est
encore courant, dans certaines rsolutions dcran, de ne pouvoir afficher que 256
couleurs simultanment. Dans ce cas, SAVANE utilise les couleurs des deux
palettes de la carte, plus les couleurs rserves par le systme dexploitation (20
couleurs). Si la couleur dun lment graphique ne fait pas partie des couleurs des
palettes courantes ou des couleurs systme, llment est dessine sur lcran avec la
couleur la plus proche (on utilise pour cela une fonction de distance euclidienne sur
les couleurs en utilisant les trois composantes comme des coordonnes).
9.3. Lexplorateur cartographique
9.3.1. Principes de lexplorateur cartographique
Lexplorateur cartographique regroupe lensemble des informations permettant
de dessiner dans un cadre partir des objets gographiques des relations quil
contient. A chaque cadre est donc associ un explorateur cartographique. Il conserve

326

Chapitre 9

le choix des relations dessiner, leur ordre de dessin, et pour chaque relation
choisie, le choix de limplantation graphique, des attributs et des variables visuelles
associes. De nombreux choix sont possibles, et les combinaisons possibles sont
quasiment illimites. Une mme relation peut tre choisie plusieurs fois, et tre
dessine dans le cadre avec des paramtres diffrents. Elle peut galement ne pas
tre trace mais nanmoins conserver lensemble de ses paramtres de dessin. A
chaque implantation graphique correspond une classe regroupant les paramtres de
dessin propre cette implantation graphique (CDessinZone, CDessinLigne,
CDessinSymbole, CDessinPixel, A.4.2.6.). Le type de la relation dtermine les
choix possibles pour limplantation graphique. Ensuite, pour chaque type
dimplantation graphique choisi, lutilisateur indique lattribut reprsenter et la ou
les variables visuelles associes cet attribut. Nous allons dcrire les possibilits et
les paramtres correspondant chaque type dimplantation graphique. Pour chaque
relation choisie, lutilisateur accde aux paramtres de dessin grce un bouton
proprits du dialogue de lexplorateur (fig. 9.5).

fig. 9.5 : le dialogue principal de lexplorateur cartographique

Lexplorateur cartographique donne galement la possibilit de tracer des


masques, des fonds graphiques, ou des documents de saisie au format SAVEDIT.
Ces lments ne contiennent aucune information descriptive : les paramtres de
dessin choisis seront appliqus tous les lments (CDessinFond, A.4.2.6.).
Les figurs dessins partir des objets ne sont pas des objets de dessin au mme
titre que les objets dessins directement sur lcran grce lditeur graphique.
Lutilisateur ne peut les slectionner ou les modifier indpendamment les uns des
autres. Ils sont attachs au cadre et se dplacent automatiquement avec lui. Faire une
carte avec SAVANE utilise donc deux outils : dune part les cadres et leur

Reprsenter 327
explorateur cartographique, dautre part lditeur graphique qui est actif en
permanence dans la fentre principale du programme.
9.3.2. Limplantation graphique ponctuelle
Limplantation graphique ponctuelle peut tre utilise par tout type de relation,
sauf pour le type mosaque. En implantation ponctuelle, plusieurs types de figurs
peuvent tre dessins : un symbole, un diagramme sectoriel, un texte. Pour chaque
objet de la relation, llment dessin utilise la localisation du centrode de lobjet
(rappelons que pour une ligne, le centrode est situ automatiquement au milieu de
la ligne ; pour une zone, il est choisi lors de la saisie graphique ; pour un point, il
correspond la position de lobjet lui-mme).

fig. 9.6 : les trois possibilits de figurs en implantation ponctuelle : symboles, valeurs,
diagrammes sectoriels

La reprsentation par symbole permet dassocier un symbole chaque objet. La


forme du symbole peut tre la mme pour tous les objets, ou varier en fonction
dune variable qualitative. Lutilisateur dispose pour cela dune palette de formes de
symboles prdfinies. Lorsquil souhaite faire varier la forme en fonction dun
attribut nominal, il tablit une correspondance entre chaque valeur reprsenter et
une forme de symbole. La couleur de lintrieur du symbole peut galement varier
selon une variable qualitative. La taille du symbole peut tre la mme pour tous les
objets ou varier selon une variable numrique. La couleur et lpaisseur du trait
sont choisies par le cartographe et sont les mmes pour tous les objets de la relation.
La reprsentation par symbole permet donc dutiliser simultanment trois variables
visuelles : forme, taille, couleur, suivant au maximum deux variables descriptives

328

Chapitre 9

distinctes. Le centre du symbole est toujours situ sur le centrode de lobjet. La


surface totale des symboles reprsents ne doit pas dpasser 20 30 % de la surface
totale du cadre [BER 77].

fig. 9.7 : la reprsentation par symbole selon deux caractres

La reprsentation par diagramme permet dassocier un diagramme sectoriel


(camembert ou histogramme) chaque objet, en fonction des valeurs de plusieurs
attributs numriques. On peut ainsi reprsenter pour chaque objet les proportions
relatives de chacun des attributs numriques (fig. 9.8).
La reprsentation de texte permet de dessiner la valeur dun attribut pour chaque
objet. Lattribut peut tre numrique ou nominal. Il est possible de choisir la

Reprsenter 329
position de la chane de caractre par rapport au centrode, mais de faon identique
pour tous les objets. Comme nous lavons dj mentionn, les figurs dpendent de
lexplorateur cartographique et ne peuvent tre modifis la main directement
par lutilisateur. Mais il est courant davoir dplacer un texte lorsque le placement
automatique calcul par lexplorateur cartographique nest pas satisfaisant. Pour
cela, il est possible de dtacher les textes de lexplorateur et de les transformer
en lments de dessin de type CODD. Lutilisateur pourra alors slectionner un texte
pour le dplacer si ncessaire, mais ce texte ne sera plus automatiquement attach au
cadre.

fig. 9.8 : la reprsentation par diagramme sectoriel suivant trois attributs descriptifs

La classe CDessinSymbole permet de conserver lensemble des paramtres de


dessin en implantation ponctuelle (A.2.4.6). Elle contient notamment une procdure
de trac par type de reprsentation (TracerSymbole(), TracerDiagramme(),
TraceValeurs()).
9.3.3. Limplantation graphique zonale
Limplantation graphique zonale ne peut tre choisie que pour les relations de
type zone. Elle apparat dans le dialogue des proprits de trac dune relation de
type zone sous longlet Zone . Il est alors possible de choisir un attribut pour
tracer lintrieur des zones (fig. 9.9). Le trac des contours relve de limplantation
graphique linaire que nous verrons au paragraphe suivant.

330

Chapitre 9

Si lattribut choisi est nominal, il faut tablir la correspondance entre chaque


valeur reprsenter et la couleur, la valeur, le grain associ. On peut donc agir
simultanment sur ces trois variables visuelles, grce au dialogue de constitution de
ce que nous appelons une palette de valeur (association entre des valeurs nominales,
et des couleurs et des trames). Lutilisateur dispose pour cela de la palette de couleur
courante et dune palette de trames correspondant des variations de forme, de
valeur ou de grain dun aplat.

fig. 9.9 : les dialogues pour le trac en implantation zonale

Reprsenter 331
Si lattribut choisi est numrique, on peut faire varier la couleur ou la valeur en
fonction de lattribut. Pour faire varier la couleur, lutilisateur tablit une
correspondance entre les valeurs minimum et maximum reprsenter et deux
couleurs de la palette, ainsi quune fonction dtalement (linaire, logarithmique,
exponentielle). Le systme affecte alors chaque objet, en fonction de la valeur de
lattribut, la couleur de la palette correspondant au rang calcul en utilisant la
fonction dtalement. La valeur, correspondant la trame choisie, est alors la mme
pour tous les objets. Pour faire varier la valeur, il tablit une correspondance entre
les valeurs minimum et maximum reprsenter et deux valeurs de trames. Le
systme calcule de la mme manire pour chaque objet la trame correspondante.
Une option particulire permet destomper la couleur en fonction de la valeur
dune relation de type mosaque. On fait alors varier lintensit de la couleur (sans
changer le ton), en fonction de la valeur de chaque pixel de la mosaque. Ce type de
trac correspond en fait au trac dune mosaque, puisque lon trace finalement les
pixels et non les zones. La mosaque est le plus souvent un modle numrique de
terrain, et lestompage est calcul en fonction de la quantit de lumire rflchie par
chaque pixel, partir dune source lumineuse.
La classe CDessinZone permet de stocker lensemble des paramtres de dessin
en implantation zonale (A.2.4.6).
9.3.4. Limplantation graphique linaire
Limplantation graphique linaire ne peut tre choisie que pour les relations de
type zone ou ligne. Pour les zones, elle correspond au trac des contours des objets.
Pour les lignes, elle correspond au trac des objets eux-mmes.
Lorsque la relation est de type zone, on peut tracer tous les arcs avec les mmes
paramtres (couleur, paisseur, forme), ou diffrencier les paramtres en fonction de
lgalit dun attribut pour les deux zones adjacentes. Lattribut choisi peut tre
nominal ou numrique.
Lorsque la relation est de type ligne, on peut agir directement sur la couleur,
lpaisseur, et la forme de chaque arc. On peut donc faire varier simultanment trois
variables visuelles : couleur, valeur, forme. Le principe est le mme que pour le
trac de symboles : la couleur et la forme peuvent varier en fonction dun attribut
nominal (on tablit alors une palette de valeurs nominales), et lpaisseur du trait
peut varier en fonction dun attribut numrique. Lutilisateur dispose dune palette
de formes pour les types de ligne.

332

Chapitre 9

Lorsque la relation est de type ligne, une option supplmentaire permet de tracer
les lignes comme des courbes de niveaux, en diffrenciant les paramtres de trac
(couleur, paisseur) en fonction dun attribut numrique.

fig. 9.10 : proprits de dessin pour les relations de type ligne

La classe CDessinLigne permet de stocker lensemble des paramtres de


dessin en implantation linaire (A.2.4.6).
9.3.5. La reprsentation des images
La reprsentation des images correspond une implantation zonale, chaque pixel
pouvant tre considr comme une zone. Mais il est trs rare de vouloir tracer les
contours des pixels, ou de vouloir reprsenter chaque pixel dune mosaque par un
symbole. De plus, certaines mthodes de visualisation utilisent lagencement des
pixels, et sont donc propre au type mosaque. Enfin, seul le type mosaque utilise le
type dattribut RVB, qui conserve une couleur absolue pour chaque objet. Nous
avons donc spar les procdures de trac des relations de type mosaque des
procdures de trac des relations de type zone.
Le trac dune relation de type mosaque ne comporte donc que le choix de
limplantation zonale. Le dialogue ne comporte pas de page correspondant au trac
par symbole ou par contour.

Reprsenter 333
Le principe du trac dun attribut nominal est le mme que pour les zones : il
faut tablir une palette de valeurs donnant la correspondance entre les valeurs
nominales reprsenter et la couleur et la trame.
Si lattribut choisi est de type numrique, il peut tre reprsent par valeur,
comme pour les zones. On tablit alors une correspondance entre les valeurs
reprsenter et les couleurs dessiner, comme pour les zones.
Un attribut numrique peut galement tre reprsent par illumination : lindice
de la couleur dans la palette de couleur est alors calcul en fonction de la quantit de
lumire mise par le pixel. Cette quantit de lumire dpend de la position de la
source lumineuse et de la normale au pixel, calcule en fonction des pixels voisins
(sur une matrice 3x3). Cest ainsi que lon reprsente en gnral les modles
numriques de terrain, cest--dire lattribut altitude dune mosaque calcule
partir de courbes de niveaux.

334

Chapitre 9

fig. 9.11 : reprsentation dun mnt par valeur, par illumination, par estompage (combinaison
de valeur et illumination)

La classe CDessinPixel permet de stocker lensemble des paramtres de


dessin en implantation de type pixel (A.2.4.6).
9.3.6. Masques, fonds graphiques, documents digitaliss
Lexplorateur cartographique donne galement la possibilit de tracer dans un
cadre des masques, des fonds graphiques, ou des documents digitaliss.
Un masque nest reli aucun attribut : cest seulement la dfinition dun
domaine de lespace. Pour le reprsenter, on peut donc jouer sur le figur du
contour, de lintrieur ou de lextrieur. On peut donc choisir la couleur, la forme et
lpaisseur du contour ; la couleur et la trame de lintrieur ou de lextrieur.
Lexplorateur cartographique donne galement la possibilit de tracer un
document graphique go-rfrenc, au format DXF. Les paramtres graphiques ne
peuvent tre modifis dans SAVANE : le document est trac tel quil a t constitu
lextrieur du systme. Il sadapte la projection gographique du cadre sil
contient un fichier dcrivant sa propre projection gographique.
9.3.7. Les procdures de trac
Les procdures de trac des lments vectoriels (points, lignes, contours)
utilisent tous les paramtres de position du cadre pour dessiner les figurs. Toutes
les coordonnes vectorielles des objets et des arcs sont conserves en coordonnes
gographiques dans SAVANE. Le dessin dun point dans la carte ncessite
plusieurs changements de coordonnes :
- une transformation correspondant la projection gographique associe au
cadre gographique ;
- une transformation correspondant lespace gographique dlimit par le cadre
et lchelle cartographique du cadre (translation-homothtie) ;
- une transformation correspondant la position du cadre dans la carte
(translation).
Lorsque le trac correspond lcran, il faut ajouter une transformation
correspondant la position de la carte dans lcran et au facteur dagrandissement
(translation-homothtie).

Reprsenter 335
Les procdures de trac dune mosaques sont diffrentes : le dessin est effectu
en traant les lignes des imagettes de la mosaque, par balayage. Chaque imagette
est gorfrence en coordonnes de projection, et la taille du pixel permet de
connatre lemplacement exact de la ligne dans le cadre, et donc dans la carte.
Limpression sur papier utilise quant elle des procdures de dessin de bitmap,
contenue dans la MFC (Microsoft Fundation Class).
Le dessin daplat pour les zones rend ncessaire la constitution du contour de
chaque zone, si lon veut utiliser une procdure vectorielle de remplissage. Le
systme SAVANE, comme nous lavons vu, ne conserve pas cette structure pour
chaque zone. Reconstituer les contours par chanage des arcs chaque
rafrachissement du trac sur cran serait trop long : les aplats sont tracs sur lcran
partir de limage raster associe chaque relation de type zone. Cette image raster
est donc calcule lors du premier trac, si elle nexiste pas encore. Par contre,
limpression daplat utilise une procdure vectorielle, avec reconstitution des
contours, en utilisant la classe CZone (A.2.2.6.).
9.3.8. Les lgendes
La lgende correspond lexplication de la correspondance entre valeurs des
objets et implantation graphique et variables visuelles utilises pour la
reprsentation cartographique. Lexplorateur cartographique dun cadre contient
lensemble des paramtres de cette correspondance, et il est donc galement utilis
pour tablir une lgende.

336

Chapitre 9

fig. 9.12 : diffrents types de lgendes gnrs partir de lexplorateur cartographique et des
dialogues de proprits de lgende

Une lgende dpend bien sr du type dimplantation graphique choisi pour


reprsenter les objets. Par exemple, pour une implantation zonale et un attribut
nominal, la lgende sera constitue de caissons donnant la correspondance entre
valeur de lattribut et couleur et forme utilise. Pour une implantation ponctuelle et
un attribut numrique, la lgende indique la variation de taille du symbole utilis.
Pour constituer une lgende, on choisit donc une entre dans lexplorateur
cartographique : le dialogue de constitution de la lgende dpend ensuite du type
dimplantation graphique, du type de lattribut reprsent, et de la variable visuelle
utilise. Une fois la lgende pose dans la carte, elle est considre comme du dessin
graphique, et peut tre modifie grce lditeur graphique. Par contre, le lien entre
la lgende et lexplorateur cartographique est perdu : la lgende nest pas mise
jour automatiquement en cas de modification des paramtres de reprsentation
cartographique.
Comme une lgende est un ensemble de figurs qui dpendent de nombreux
paramtres (par exemple, taille des caissons, largeur de linterligne, couleur et
paisseur du bord des caissons, etc.), nous avons dvelopp des classes propres
chaque type de lgende (CLegendeCaisson, CLegendeSymboleParTaille,
CLegendeSymboleParValeur,
CLegendeDegrade,
CLegendeDiagrammeCaisson,
CLegendeDiagrammeParTaille,
ClegendeLigneParTaille, CLegendeLigneParValeur).

La lgende ne replace pas la notice de la carte, explication et analyse du


phnomne reprsent.
9.4. La reprsentation en perspective
La smiologie graphique se limite la reprsentation sur une feuille plane
dobjets en utilisant des implantations graphiques limites deux dimensions. La

Reprsenter 337
reprsentation en perspective ou lanimation sortent de ces limites. La cartographie
classique nutilise donc pas, ou trs peu, la reprsentation en perspective (nomme
2.5D) ou en volume.
Dans un SIG, la localisation de lensemble des objets gographiques nest que
trs rarement dcrite en trois dimensions (longitude, latitude, altitude). Mais il est
assez courant de disposer dune relation dcrivant laltitude dans la zone tudie,
avec une certaine prcision : soit on dispose dun modle numrique, soit de courbes
de niveaux permettant de le calculer. Par jointure entre le modle numrique de
terrain et les autres collections dobjets localiss, le SIG permet donc davoir une
ide de laltitude de lensemble des objets gographiques de la zone tudie. Il est
donc dommage de ne pas utiliser cette altitude pour la reprsentation des objets et de
toujours se limiter une reprsentation projete dans les deux dimensions du plan
de projection gographique.
La reprsentation en perspective est la solution la plus lgante pour rendre
compte du relief sur une feuille de papier plane. Elle est facile mettre en uvre
avec un ordinateur (classe CPerspective, A.2.4.9.). Elle consiste reprsenter le
modle numrique de terrain illumin en projetant chaque pixel du modle sur un
plan, selon une perspective centrale ou cavalire, en liminant les parties caches.
Une carte est reprsente en perspective en superposant les figurs aux pixels du
modle numrique.
Reprsenter des figurs en perspective nest techniquement pas difficile si lon
peut connatre laltitude des points qui en dfinissent le trac. Par contre,
linterprtation de la carte peut alors tre plus complexe, car la perspective change
limpression visuelle de nombreux signes graphiques et altre la signification ou la
lisibilit de la carte. Ainsi, la surface dun symbole projet en perspective peut
varier considrablement en fonction de la pente ou de lorientation du terrain ; une
partie de texte peut tre cach par une montagne ; les trames sont sujettes aux effets
de moirs. Dune manire gnrale, les variables visuelles taille et
valeur sont difficiles reprsenter, quelle que soit limplantation graphique des
figurs, et lon doit viter de les utiliser dans une reprsentation en perspective. Par
contre couleur et forme sont les variables visuelles qui sont le moins altres
par la reprsentation en perspective.
Le systme SAVANE permet la reprsentation en perspective partir dun
modle numrique de terrain. Le systme cre une image (de type bitmap),
indpendante de la carte, mais que lutilisateur peut ajouter la feuille de papier
reprsentant la carte sur lcran. Lutilisateur choisit les paramtres de la perspective
(cavalire ou centrale ; point de vue ; position de la source lumineuse), puis, parmi
les entres de lexplorateur cartographique, celles quil souhaite superposer au

338

Chapitre 9

modle numrique de terrain. Les paramtres cartographiques sont inchangs : seule


la reprsentation graphique est modifie par la perspective.

fig. 9.13 : dialogues pour crer une vue en perspective

fig. 9.14 : reprsentation en perspective cavalire des valeurs daltitude dun mnt

9.5. Louverture ou la sauvegarde dune carte dans SAVANE


La carte, document de base dans le module dinterrogation SAVANE, regroupe
lensemble des paramtres dinterrogation et de reprsentation cartographique dune
requte. Tous les fichiers correspondant une carte sont conservs dans un
rpertoire qui se trouve dans le rpertoire d_carte de lutilisateur. Sauver une carte
permet de conserver lensemble des paramtres ainsi que ltat de la base de
donnes correspondant chaque cadre de la carte. La procdure dune carte
comprend plusieurs phases :

Reprsenter 339
- sauvegarde des objets graphiques dessins par lutilisateur (conservs dans un
fichier dextension .obj) ;
- sauvegarde des paramtres de la carte et des cadres (conserv dans un fichier
dextension .sav).
La sauvegarde dun cadre comprend la sauvegarde des paramtres graphiques du
cadre, des palettes de couleurs, la sauvegarde de ltat de la base de donnes
correspondant au cadre conserve dans un objet de la classe CSchema.
La sauvegarde dun schma comprend la sauvegarde du schma temporaire de la
base de donnes. Les fichiers temporaires des relations modifies sont crs dans le
rpertoire du cadre, qui lui-mme se trouve dans le rpertoire de la carte.
Louverture dune carte relit lensemble de ces paramtres. Lutilisateur retrouve
donc ltat complet de la carte, la fois pour le dessin et pour les requtes lies la
base de donnes. Mais la base de donnes a pu subir des modifications de schma
ou de valeurs dobjets entre la sauvegarde de la carte et son ouverture. De mme, la
vue externe peut avoir t modifie. La procdure de lecture teste ces diffrences de
manire mettre jour le schma des cadres. Par contre, si la valeur de certains
objets a t modifie, les relations temporaires ne sont pas mises jour
automatiquement, puisquelles conservent les anciennes valeurs des objets. Pour
actualiser la carte, il faut excuter de nouveau lensemble des oprations effectues
dans chaque cadre. Pour cela, il suffit de dclencher la macro-commande associe
chaque cadre : cette macro-commande conserve automatiquement lensemble des
oprations qui ont t effectues dans le cadre.
Tous les objets intervenant dans une carte (cadres, objets graphiques, schma)
possdent des mthodes permettant de sauver ou de lire ces objets partir des deux
fichiers de sauvegarde.

340

Chapitre 9

Reprsenter 341

Bibliographie

[BEG 94] BEGUIN M., PUMAIN D., La reprsentation des donnes gographiques, 2000,
CURSUS, Armand Colin
[BER 67] BERTIN J., Smiologie graphique, 1967, Gauthiers-Villars, Paris
[BER 77] BERTIN J., Le graphique et le traitement graphique de linformation, 1977,
Flammarion, Paris

Conclusion

Tout au long de cet ouvrage, nous avons dcrit la construction dun systme
dinformation visant rpondre aux impratifs que nous lui avions fixs au dpart.
Nous avons abord au cours de cette construction de nombreux domaines et
appliqu de nombreuses mthodes pour aboutir la description de ce systme
complet. Dans cette conclusion, nous souhaitons la fois revenir sur les points forts
de cette construction et dcrire les enseignements de son utilisation dans un cadre
oprationnel, par rapport aux objectifs fixs, et prsenter en quoi ce systme pourrait
tre amlior pour mieux rpondre aux difficults rencontres lors de son utilisation.
Ces difficults se situent essentiellement dans le domaine de lintelligibilit des
donnes, de la documentation des bases de donnes et de lexplication des
traitements effectus dans une carte.
1.1. La construction dun SIG : synthse
Tout dabord, il faut souligner que le systme que nous avons construit cherche
privilgier la rigueur et la logique sur la facilit dutilisation. Il nesquive donc pas
la complexit lorsque celle-ci est ncessaire pour maintenir la cohrence et la
rigueur des principes thoriques, principes que nous avons largement dtaills pour
cela tout au long de cet ouvrage. Dautre part, il faut galement prciser que ce
systme a vocation tre utilis aussi bien dans un cadre industriel que dans un
cadre scientifique. Il sagit donc de manipuler des donnes trs diverses, aussi bien
du point de vue smantique que du point de vue qualitatif, dans leur gense comme
dans leur prcision. Cette remarque qui peut paratre anodine recouvre en fait une
ralit complexe, comme nous avons essay de le dvelopper au chapitre 3. Enfin, si

344

Conclusion

la prsentation de ce systme met en avant la


logique a t longue construire : lordre des
lordre de sa gense ; larchitecture et les choix
logique mais ils ont donn lieu une rflexion
mme permis de construire cette logique globale.

logique de sa construction, cette


chapitres ne reflte pas toujours
techniques sinscrivent dans cette
approfondie, rflexion qui a elle-

Nous avions fix plusieurs objectifs dans notre introduction : le premier tait la
gestion centralise et la prennisation de linformation avec des objectifs de partage
et defficacit. Pour assurer lintgrit des donnes, le modle relationnel simpose,
condition de ltendre aux donnes localises. Pour une gestion efficace, il est
ncessaire dutiliser une indexation primaire sur la localisation, puisque la
localisation est un premier critre de slection pour la plupart des requtes dans un
SIG. Enfin, la gestion multi-utilisateur et le partage des bases de donnes imposent
la sparation entre administration et exploitation avec gestion des tats temporaires.
Toutes ces conditions imposent la construction dun moteur de gestion de donnes
propritaire au systme. Ce moteur, comme nous lavons dcrit, est bas sur le
principe de la modlisation et de la gestion relationnelle avec des fonctionnalits
orient-objet sur lesquelles nous reviendrons. La gestion relationnelle est tendue
aux attributs reprsentant une localisation bi- ou tridimensionnelle dans un espace
euclidien. Lindexation primaire est base sur cet attribut lorsquil est prsent. La
gestion multi-utilisateur est dlicate : elle impose de sparer ladministration de
lexploitation et interdit un utilisateur de modifier une base de donnes si cela peut
entraner un disfonctionnement de lutilisation par dautres. Le systme que nous
avons construit est ainsi diffrent des systmes commerciaux les plus rpandus : il
ne se base pas sur un SGBD relationnel commercial classique et conserve le rsultat
des requtes non pas dans la base initiale mais dans des tats temporaires, propre
chaque utilisateur. Cette gestion rend la conception du systme plus complexe, mais
elle permet le partage des bases de donnes sans provoquer dinterfrence entre
utilisateurs. Elle peut paratre trop complexe un utilisateur isol qui serait le seul
utilisateur de sa base de donnes, car elle lui impose des contraintes dont il ne voit
pas forcment lutilit. Par contre, elle sera perue comme transparente et naturelle
dans un environnement o les donnes doivent tre prennises et gres pour tre
partages. Elle permet la sparation claire du serveur de base de donnes et du
client, tout en autorisant une approche exploratoire lors de linterrogation des
donnes qui nous parat essentielle en analyse spatiale - et la gestion dtats
temporaires de la base de donnes lors dune requte. Linterrogation via Internet se
base sur ce mme principe, sans avoir changer la structure du systme : le client
est simplement hors du rseau local. Seules les techniques daccs aux fichiers de la
base de donnes et la gestion des reprises sur erreurs diffrent. Par contre, les temps
de transfert de linformation entre le client et le serveur sont encore un frein
important ce dveloppement, que nous navons pas souhait aborder dans cadre de
cet ouvrage.

Conclusion 345
La gestion intgre de la localisation impose de pouvoir manipuler lensemble
des types dobjets gographiques disponibles ; elle impose galement la matrise de
la mesure et de la prcision de la localisation. Nous sommes donc revenu en dtail
sur la modlisation du monde rel et sur la schmatisation de la ralit en objets
gographiques. La gestion interne de lattribut de localisation dpend du type des
objets. Mais le systme se charge de cette gestion : lutilisateur nintervient jamais
ce niveau. Cest le moteur interne qui se charge de lensemble des oprations de
gestion de cet attribut qui est toujours vu comme formel par lutilisateur. Par
exemple, il na jamais intervenir sur le codage interne de la localisation, quil peut
dailleurs ignorer. Ainsi, il manipule des pixels dimages de la mme manire que
des lignes dun rseau ou que des zones dune couverture vgtale. Cette gestion
intgre nest possible qu condition que la localisation soit exprime dans un
rfrentiel unique. Nous sommes revenu longuement sur ce sujet important au
chapitre 4.
La saisie de la localisation est fondamentalement diffrente de la saisie
dattributs classiques, nominaux ou numriques. Elle est directement lie au type
des objets localiss et doit prendre en compte lensemble des contraintes dintgrit
lies ces types. Elle doit sappuyer sur la modlisation de la ralit et grer la
prcision lie au modle. Les mthodes de saisie emploient diverses techniques, du
redressement dimage la saisie de contours de zones. Nous lui avons consacr
deux chapitres de cet ouvrage. Lopration de saisie est une opration indpendante
de la gestion de base de donnes. Pour faciliter lutilisation du systme, ces
fonctions donnent donc lieu des modules distincts, indpendants du module
dadministration ou dexploitation des bases de donnes. Ils assurent lintgrit de
lattribut de localisation. Ces modules nont pas t conus comme des diteurs
graphiques sur lesquels nous aurions ajouts des fonctions des contrles : la
vrification des contraintes dintgrit en est le noyau, et ils ont t techniquement
construits autour de ces fonctionnalits.
Enfin, le systme doit aller au-del de simples fonctionnalits de gestion et doit
intgrer des fonctionnalits trs diverses qui en font autant un programme
dapplication quun systme de gestion de base de donnes. La premire de ces
fonctionnalits, cest de permettre la reprsentation cartographique des donnes. Le
module dexploitation permet donc ldition graphique et la reprsentation
cartographique partir des objets de la base de donnes utilise. Cette fonctionnalit
incontournable dtermine largement lergonomie de ce module. La plupart des
autres fonctionnalits sont lies lexploration statistique ou aux types gnriques
des objets localiss (zone, ligne, point, pixel). Elles sont intgrs dans le module
dexploitation et sont indpendantes du contenu smantique des relations de la base.
Des fonctionnalits plus spcialises peuvent tre intgres au module
dexploitation. Cest la cas par exemple de lexploitation des modles numriques

346

Conclusion

de terrain pour lhydrologie. Mais la dmarche habituelle sera plutt celle du


couplage avec des programmes dapplication, le systme se chargeant alors de
linterface entre les deux systmes. Lautre approche consiste intgrer dans un
programme dapplication spcialis des ordres daccs aux objets gographiques
dune base de donnes, partir dun langage de programmation et dune
bibliothque de primitives (nous avons pour cela construit une librairie de primitives
SAVANE en C++). Mais on perd alors les capacits dexploration, danalyse
spatiale ou ddition cartographique du SIG, en se limitant la gestion des objets.
Lambivalence entre gestion dune base de donnes et programme dapplication est
en fait au cur des difficults dutilisation dun SIG, qui on demanderait
volontiers de rpondre lensemble des besoins.
Plus gnralement, de nombreux objets gographiques ont des caractristiques
dutilisation propres leur dfinition smantique, au-del des types dobjets
gographiques qui proviennent de la modlisation cartographique de la ralit. En
gnral, ces caractristiques ne sont pas intgres dans la base de donnes, qui se
limite aux attributs et nintgrent pas les mthodes dutilisation de ces attributs. On
perd ainsi une grande partie de linformation, celle qui serait peut-tre la plus utile
dans le cadre de lexploitation de la base de donnes. Lutilisation dun SIG est en
effet trs diffrente dune base de donnes classique : la requte fait souvent appel
une dmarche exploratoire ; lexploration des donnes influence largement
lutilisateur dans les traitements quil envisage dappliquer aux donnes. De plus, il
ny a pas capitalisation du savoir acquis par lexploitation de la base de donnes, le
SIG tant exploit peu prs comme pourrait ltre une base de donnes classique.
Cette dficience est majeure, car dans un SIG, les requtes sont souvent difficiles
exprimer, beaucoup plus en tout cas que dans le cadre des base de donnes
relationnelles classiques o la seule vrai difficult, pour rpondre une question, est
celle de lutilisation dun formalisme dpendant de la mthode de gestion.
1.2. Vers plus dintelligibilit pour les bases de donnes gographiques
En rsum, le principal enseignement de lutilisation dun systme comme celui
que nous avons construit, cest dune part sa difficult dutilisation face un corpus
de donnes habituellement htrogne et dautre part la faible capitalisation de la
connaissance induite par son utilisation. La difficult dutilisation ne vient pas de
lergonomie ou de la structuration et de la gestion de linformation, car nous lavons
justement construit avec lobjectif de librer lutilisateur de toute tche de gestion de
donnes. Le systme remplit avec satisfaction ces tches et assure avec succs la
prennit des bases de donnes.
La difficult dutilisation vient essentiellement de la diversit des domaines que
nous avons abord : la connaissance de ces domaines est ncessaire une bonne

Conclusion 347
utilisation dun SIG quel quil soit. En particulier, le systme doit remplir, au del
des fonctions de gestion, des fonctions danalyse et de modlisation pour aboutir
des rsultats synthtiques. La difficult est inhrente laspect programme
dapplication, car le systme ne propose pas assez de mthodes sur linformation
quil gre. Or, les utilisateurs attendent plus quune simple aide ou quune liste
doprations susceptibles dtre effectues sur un jeu de donnes. Ils souhaiteraient
souvent que le SIG se charge tout seul de lanalyse ou leur indique quel chemin
suivre parmi les nombreuses possibilits qui leur sont offertes. Paradoxalement, la
multiplication des possibilits fonctionnelles nuit lutilisation et la simplicit
recherche par la plupart des utilisateurs. Enfin, la difficult dutilisation provient
galement de la structure mme de linformation gographique : elle induit une
dpendance fonctionnelle entre localisation et description, et elle rsulte le plus
souvent dune modlisation initiale qui nest pas toujours connue ou bien
documente.
La question qui pourrait nous tre pos est donc maintenant : comment
construire un logiciel SIG dont lutilisation ne ncessite pas lensemble de cette
connaissance gographique ? . Cette question na srement pas de rponse globale.
Il est peu probable que lon pourra arriver concevoir un systme qui conserverait
la rigueur scientifique ncessaire la gestion et au traitement de linformation
gographique mais qui nexigerait de lutilisateur quune faible connaissance des
contraintes lies cette rigueur. On peut malgr tout essayer damliorer le systme
pour aller dans ce sens. Ces amliorations concernent lintelligibilit des bases de
donnes, et vont dans trois directions :
- amliorer la connaissance de linformation par lintgration systmatique de
mta-donnes pour renseigner sur la gense des donnes et le rapport entre
localisation et description (la prcision gographique) ;
- amliorer la connaissance en intgrant dans la base de donnes des mthodes
dutilisation ;
- permettre la capitalisation de la connaissance en permettant la documentation
ou lintgration de mthodes dutilisation des donnes, autant au niveau de la base
de donnes elle-mme que sur les rsultats cartographiques des requtes. Une carte
devrait en toute logique comporter toujours une notice permettant de comprendre
quelle a t la dmarche qui a abouti son laboration.
Larchitecture du systme SAVANE permet davancer dans ces trois directions.
Les mta-donnes peuvent tre gres avec un systme de gestion classique partir
du dictionnaire de la base de donnes gre par SAVANE. Elles doivent comporter
des champs fixes (dfinis pour lensemble des relations), des champs dpendant du
type gomtrique de relation, et des champs variables laisss au choix de

348

Conclusion

ladministrateur ou du fournisseur de linformation. Il est trs difficile dtablir de


faon rigide la structure des champs fixes de cette base de donnes, car lon arrive
rapidement concevoir un schma qui ne sera en fait pas respect en pratique : il est
courant davoir moins de 20 % de rponses sur un schma de mta-donnes Il
semble donc plus efficace davoir une approche plus souple, cest--dire de limiter
les variables requises et de mettre laccent sur la gestion de donnes htroclites,
non structures en attributs, dcrivant linformation de chaque relation.
La vision du schma peut galement tre amliorer en introduisant un
regroupement thmatique de relations ou dattributs au niveau des vues externes.
Une vue externe est alors une hirarchie de thmes dont seules les feuilles
correspondent des relations ou des attributs rels de la base de donnes.
Le second point est sans doute le plus riche pour lutilisateur : il consiste
introduire dans la base de donnes des mthodes dutilisation construites partir des
oprations relationnelles ou danalyse disponible dans le module de base, ou partir
de modules dapplications externes appels par le systme. Ces mthodes sont
conservs techniquement sous la forme de macro-commandes ; lutilisateur accde
au schma des mthodes comme il accde au schma des donnes. La base de
donnes passe donc du schma relationnel au schma objet, tout en conservant la
gestion interne relationnelle qui lui permet dassurer la cohrence de linformation.
Cette approche permet dintroduire de la connaissance dans des bases de donnes
souvent difficiles exploiter ; elle permet de proposer lutilisateur des mthodes
qui peuvent aller du simple calcul dune densit ou dun indice de vgtation une
application complte. Une base de donnes contenant des mthodes devient en soi
un objet de connaissance, et disposer ce cette connaissance change lapproche dans
llaboration mme dune base de donnes : dans de nombreux cas, le schma de la
base de donnes sera dtermin par les mthodes que lon souhaite pouvoir utiliser
par la suite. On peut ainsi proposer des schmas de base de donnes gographiques
permettant de rpondre un certain nombre de questions, grce des mthodes
fournies avec le schma. Lapproche classique dans llaboration est donc inverse :
les mthodes dapplication ne sont plus dtermines par la structure de
linformation, cest la structure de la base qui est dtermine par les mthodes que
lon souhaite pouvoir utiliser. Cette approche est bien sr fortement contextuelle :
elle doit dboucher sur la dfinition dobjets gographiques, valables dans un
contexte donn, et contenant mthodes et donnes permettant de les utiliser dans ce
contexte.
Cette approche permet de capitaliser de la connaissance au niveau de la base de
donnes, mais elle nest pas suffisante pour conserver lensemble de la connaissance
labore dans lutilisation du SIG. En effet, elle conserve des mthodes dutilisation
sous forme de macro-commandes, mais ne renseigne pas sur le cheminement
gnral dune application ou sur llaboration cartographique du rsultat. Il est

Conclusion 349
galement ncessaire de conserver cette information. Dans SAVANE, nous
dveloppons donc galement des mthodes de documentation au niveau dun cadre,
dans une carte, comme au niveau de la carte elle-mme. Cette documentation est
difficile structurer par un schma analytique : nous avons choisi de la conserver
sous forme de texte, limage dune notice ; le texte est labor par lauteur de la
carte. A chaque cadre dans une carte et chaque carte est donc attach un document
de type texte qui est la disposition de lutilisateur et auteur de la carte,
contrairement aux mthodes qui sont gres au niveau de ladministrateur de la base
de donnes.
Ces trois approches sont en cours de dveloppement au sein du systme
SAVANE. Elles sappuient sur la gestion relationnelle tendue aux donnes
localises : les mta-donnes partir du dictionnaire de la base, les mthodes
partir doprations de gestion ou dapplications externes, les notices partir du
rsultat dune requte. Elles permettent dtendre la gestion relationnelle en
intgrant une approche orient objet et hypermdia, tout en conservant la rigueur de
ce modle de gestion pour les donnes localises.

Bibliographie gnrale

[ABE 84] ABEL D.J., A B+-Tree Structure for Quadtrees, Computer Vision, Graphics, and
Image Processing, 1984, vol. 27, n 1, p. 19-31
[ABI 95] ABITEBOUL S., HULL R., VIANU V., Foundations of Databases, 1995, AddisonWesley
[AOK 79] AOKI M., Rectangular region coding for image data compression, Pattern
Recognition, 1979, vol. 11, p. 297-312
[AMI 71] AMIDON E.L. AND ATKIN G.S., Algorithmic selection of the best method for
compressing map data string : Communications, ACM, 1971, vol. 14, n 12, p. 769-774
[BAL 98] BALMINO G., Champ de pesanteur terrestre et gode. Principes, progrs et
connaissance actuelle, 1998, Bureau Gravimtrique International, Toulouse, France
[BAR 88] BARUCH O., Line Thinning by Line Following, Pattern Recognition Letters, 1988,
Vol. 8, p. 271-276
[BEG 94] BEGUIN M., PUMAIN D., La reprsentation des donnes gographiques, 2000,
CURSUS-Armand Colin, Paris
[BEK 92] BEKKER J.H., Semantic Data Modeling, Prentice-Hall, 1992, New-York
[BEN 93] BENKAZEN V., DOUCET A., Bases de donnes orientes objet, 1993, Armand Colin
[BER 67] BERTIN J., Smiologie graphique, 1967, Gauthiers-Villars, Paris
[BER 77] BERTIN J., Le graphique et le traitement graphique de linformation, 1977,
Flammarion, Paris
[BER 93] BERTINO E., MARTINO L., Object-Oriented Database Systems, 1993, AddisonWesley
[BOT 98] BOTTON S ., DUQUENNE F., EGELS Y., EVEN M., WILLIS P., GPS, localisation et
navigation, 1998, Herms, Paris
[BOU 81], BOURSIER P., Reprsentation compacte des cartes dans les systmes dinformation
gographique, Thse de 3-ime cycle, Universit Paris VI, 1981,
[BOU 82] BOURSIER P. ET SCHOLL M., Performance Analysis of compaction techniques for
map representation in geographic data cases, Computer and Graphics, 1982, vol. 6, p. 73-81

352

Bibliographie

[BOU 94] BOURSIER P., TAO-YUAN J., A model for Handling topological relationships in a
2D environment, Proceedings of the 6th International Symposium on Spatial Data Handling,
1994, Vol 1, pp 73-88, Endinburgh
[BRE 65] BRESENHAM J.E., Algorithm for computer control of a digital plotter, IBM System
Journal, 1965, vol. 14, n 1, p.44-50
[CAP 84] CAPSON D.W., An improved algorithm for the sequential extraction of boundaries
from a raster scan, Computer Vision, Graphics, and Image Processing, 1984, vol. 28, n1, p.
109-125
[CAZ 94] CAZENAVE A., FEIGL K., Formes et mouvements de la Terre, 1994, Ed.Belin-CNRS
[COO 67] COOK B.G., A Computer Representation of plane Region Boundaries, Autralian
Computer Journal, 1967, vol. 1, n1, p.44-50
[CLE 93] CLEMENTINI E., DI FELICE P., VAN OOSTREROM P., A Small Set of Formal
Topological Relationships Suitable for End-User Interaction, Proceedings of the 3th
Symposium on Large Spatial Databases, 1993, Lecture Notes in Computer Sciences 692, pp
277-295, Singapore
[CLE 95] CLEMENTINI E. DI FELICE, CALIFANO G., Composite Regions iin Topological
Queries, Information Systems, 1995, Vol. 20, n7, pp 579-594
[COH 93] COHN A.G., RANDELL D.A., CUI Z., BENNETT B., Qualitaiv Spatial Reasoning and
Representation, Preceedings of QUARDET 93, PP 513-522, Barcelona, Spain, 1993
[CUI 93] CUI Z., COHN A.G., RANDELL D.A. , Qualitativ and Topological Relationships in
Spatial Databases, Proceedings of the 3th Symposium on Large Spatial Databases, 1993,
Lecture Notes in Computer Science 692, pp 296-315, Singapore
[DAN 81] DANGERMOND J., Some trends in the evolution of GIS technology, Marble Ed.,
1981, Kensington Workshop, p. 25-57
[DAN 83] DANGERMOND J., Classification des lments logiciels utiliss habituellement dans
les systme dinformation gographique, fascicule n 96 du comit franais de cartographie,
1983, p. 7-20
[DAT 90] DATE C., A Contribution to the study of database integrity, in Relational Database
Writing, 1990, Addison-Wesley
[DAT 95] DATE C.J., Introduction to Database Systems, 1995, Addison-Wesley
[DAV 91] DAVID B., Modlisation, reprsentation et gestion dinformation gographique, un
approche en relationnel tendu. Thse de doctorat, Universit Paris VI, 1991
[DAV 94] DAVID B., FASQUEL P., Qualit dune base de donnes gographique : concepts et
terminologie, Bulletin dinformation de lIGN, 1994, n 67, Paris
[DEL 91] DELOBEL C., LECLUSE C., RICHARD P., Bases de donnes : des systmes relationnels
aux systmes objets. 1991, InterEditions, Paris
[DIM 70] DIME, Technical description of the DIME System, U.S. Bureau of Census : Census
and study, the DIME Geocoding System, Report n 4, Washington D.C., 1970, p. 25-30

Bibliographie 353
[DUF 98] DUFOUR J.P., Cours dintroduction la godsie, Ecole nationale des sciences
gographiques,1998, IGN-ENSG
[EGE 89] EGENHOFER M.J., A formal definition of binary topological relationships,
Proceedings of the third International Conference FODO, Paris, Lecture Notes in Computer
Science 367, 1989, Sprinter Verlag, Berlin, p.457-472
[EGE 90] EGENHOFER M.J. AND HERRING J.R., A mathematical framework for the definition of
topological relationships, Proceedings of the 4th International symposium on Spatial Data
Handling, 1990, Zurich p. 803-813
[EGE 91A] ENGENHOFER M., Spatial Query langages. Thse de doctorat, 1991, University of
Maine, USA
[EGE 91B] EGENHOFER M.J., FRANZOZA R.D., Point-Set Topological Relations, International
Journal of Geographic Information Systems, 1991, 5-2, pp 161-174
[EGE 94] EGENHOFER M.J., CLEMENTINI E., SHARMA J., Modelling topological spatial
relations : strategies for query processing, Computer and graphics, 1994, vol. 18, n6, pp
515-522
[EST 92] ESTES J., Remote sensing and GIS integration : research needs, status and trends.
ITC Journal, 1992, n 1, p. 2-9
[FAI 96] FAIZ S.O., Modlisation, exploitation et visualisation de l'information qualit dans
les bases de donnes gographiques, Thse de Doctorat, 1996, Univ. Paris XI Orsay
[FLO 85] DE FLORIANI L., FALCIDIENO B., PIENOVI C., Delaunay-based Representation of
Surfaces Defined over Arbitrary Shaped Domains, Computer Vision, Graphics, and Image
Processing, 1985, n 32, p. 127-140
[FLO 93] DE FLORIANI L., MARZANO P., PUPPO E., Spatial Queries and Data models, in Frank
A. and Campari I.U., Spatial Information Theory, Lecture Notes in Computer Sciences 716,
1993, Springer-Verlag, p. 113-138
[FRA 81] FRANCK A., Application of DBMS to Land information systems, CH 1701-2, IEEE
81, 1981, p. 448-453
[FRA 92] FRANK A.U., Qualitative Spatial Reasoning about Distances and Directions in
space, Journal of Visual Langages and Computing, 1992, vol. 3, n 4, pp 343-371
[FRA 96] FRANK A.U, Qualitative spatial reasoning : cardinal directions as an example.
International Journal of Geographical Information Systems, 1996, Vol. 10, n3, pp 269-290
[FRE 61] FREEMAN H., On the Encoding of arbitrary geometric Configuration, Inst. Radio
Engineers Trans. Elec. Computers, 1961, vol. EG 10, p. 260-268
[FRE 75] FREEMAN J., The modelling of spatial relations, Computer Graphics and Image
Processing, 1975, vol. 4, p. 156-171
[GAR 83] GARDARIN G., Bases de donnes : les systmes et leurs langages, 1983, Eyrolles,
paris
[GDT 93] GDTA, Les Spatiocartes, Cahiers Pdagogiques du GDTA, 1993
[GEO ] Gophysique, Encyclopdie de la Pliade, Gallimard, Paris

354

Bibliographie

[GOO 89] GOODCHILD M., GOPAL S., Accurancy of Spatial Databases, 1989, Taylor &
Francis
[GRE 89] GREENE D., Implementation and Performance Analysis of Spatial Data Access
Methods, IEEE, Intl. Conference on Data Engineering, 1989, p.606-615
[GUN 89] GNTHER O., Efficient Computation of Spatial Joins. IEEE, Intl. Conference on
Data Engineering, 1989, p.50-59
[GUP 95] GUPTILL S.C., MORRISON J.L.,
Pergamon/Elsevier Science, 1995

Elements

of

Spatial

Data

Quality,

[GUT 88] GTING R.H., Geo-Relational Algebra : A Model and Query Language for
Geometric Database System, Proccedings of Intl. Conference on Extending Database
Technology, 1988, p. 506-527
[HAA 96] HAADZILACOS T., TRYFONA N., A model for expressing topological integrity
constraints in geographical databases, in Proceedings : Theories and Models of SpacioTemporal Reasoning in Geographic Space, 1996, International Conference GIS, Pisa, Italy.
A. Frank, I. Campari, U. Fomentini (Ed.), pp 252-268
[HAG 73] HAGGETT P., Lanalyse spatiale en gographie humaine, 1973, Armand Colin,
Paris
[HAS 82] HASKIN R.L. AND LORIE R.A., On extending the functions of a relational database
system. Association for Computing Machinery, Proccedings of SIGMOD, NY : ACM Press,
1982, p. 207-212
[HOT 99] HOTTIER, Photogrammtrie analytique, Cours ENSG, 1999
[LAR 93] LARUE T., PASTRE D., VIMONT Y., Strong Integration of Spatial Domains and
Operators in a Relational Database System, Intl. Symposium on Large Spatial Databases,
LNCS n 692, 1993, p. 53-72, Springer-Verlag
[LAU 91] LAURINI R., MILLERET-RAFFORT F., Cohrence dans les bases de donnes
spatiales, VIIe journes Bases de donnes Avances, INRIA, 1991, pp 471-488, Lyon
[LAU 93] LAURINI R., MILLERET-RAFFORT F., Les bases de donnes en gomatique, Paris,
Ed. Herms, 1993
[LAU 94] LAURINI R., Dtection et corrections d'erreurs topologiques dans les bases de
donnes gographiques, Actes des premires journes de la recherche CASSINI, 1994, Lyon,
France, pp 105-114
[LEV 88] LEVALLOIS J.J., BOUCHER C., BOURGOIN J., COMOLET-TIRMAN A., ROBERTOU A.,
Mesurer la Terre : 300 ans de godsie franaise, De la toise du Chtelet au satellite, 1988,
Association franaise de topographie, Presse de lEcole Nationale des Ponts et Chausses,
AFT, Paris
[LOR 84] LORIE R.A., MEIER A., Using a Relational DBMS for Geographic Databases.
GeoProcessing, 1984, p.243-257
[MAG 97] MAGELLAN SYSTEMS CORPORATION, User guide for the Magellan GPS ProMARK
X-CM, 1997

Bibliographie 355
[MAT 84] MATSUYAMA T., LE VIET H., NAGAO M., A File Organisation for Geographic
Information System based on Spatial Proximity, Computer Vision, Graphics, and Image
Processing, 1984, vol. 26, n3, p.303-318
[MER 73] MERRILL R.D., Representation of contours and region for efficient computer
search, Communication ACM, 1973, vol. 16, n2, p. 69-82
[MOL 94] MOLENAAR O, KUFONIYI O., BOULOCOS T., Modelling topological relationships in
vector maps, Proceedings of the 6th International Symposium on Spatial Data Handing, 1994,
pp 112-126, Endinburgh
[MON 82] MONMONIER M., Computer-Assisted Cartography, Principles and Prospects, 1982,
Prentice-Hall
[ML 95] MLLER J.C., LAGRANGE J.P., WEIBEL R., (ed.), GIS and Generalization, GIS
DATA I, 1995, Taylor & Francis
[NEW 79] W. M. NEWMAN, R.F. SPROULL, Principles of Interactive Computer Graphics,
1979, Mc Graw Hill
[NOV 92] NOVAK K., Rectification of digital Imagery. Photogrammetry Eng. And Remote
Sensing, 1992, vol. 58, p.339-344
[OOI 89] OOI B.C., SACK-DAVIS R., MC DONELL K.J., 1989, Extending a DBMS for
Geographic Applications, Intl. Conference on Data Engineering, p. 590-597
[ORO 93] OROURKE J., Computational Geometry in C, 1993, Cambridge University Press
[PAL 75] PALMER J.A.S., Computer Science aspects of the mapping problem, from Davis and
Mc Cullagh, Display and analysis of spatial Data, New York, John Wiley and Sons, 1975
[PAR 97] PARKER J.R., Algorithms for Image Processing and Computer Vision, 1997, Wiley
Computer Publishing
[PAV 82] PAVLIDIS T., Algorithms for Graphics and Image Processing, Computer Science
Press, 1982
[PL 97] PLMER, GRGER, Archiving Integrity in Geographic Information Systems Maps
and Nested Maps, Geoinformatica, 1997, vol.1, n 4, pp 345-367, Kluwer Academic, Boston
[PUL 88] PULLAR D.V., EGENHOFFER M.J., Toward formal definitions of topological relations
among spatial objects, Procedings of the third International Symposium on Spatial Data
Handling, 1988, Sydney, Australia, pp 225-241
[PUM 97] PUMAIN D., SAINT-JULIEN T., Lanalyse spatiale, 1997, Armand Colin, Cursus ,
Paris
[REN 91] RENOUARD L., Restitution automatique du relief partir de couples
stroscopiques dimages du satellite SPOT, 1991, Thse de Doctorat prsente lEcole
Polytechnique
[RIM 90] RIMBERT S., Carto-graphies, 1990, Herms, Paris
[ROS 80] ROSENFELD A. AND SAMET H., Tree structure for region representation,
Aangeenburg, Autocarto 4, 1980, vol. 1, p. 108-118

356

Bibliographie

[ROU 91] ROUET P., Les donnes dans les systmes dinformation Gographique. Trait des
nouvelles technologies, srie Gomatique, 1991, Herms, Paris
[SAM 80A] SAMET H., Region Representation : quadtrees from boundaries codes,
Communication ACM, 1980, vol. 23, n3,p. 163-170
[SAM 80B] SAMET H., Tree Structure for region representation, Aangeenbgug, Autocarto 4,
vol. 1, 1980, pp 108-118
[SAM 90] SAMET H., Applications of Spatial Data Structures, Addison-Wesley, 1990
[SAN 89] SANDERS L., Lanalyse des donnes applique la gographie, 1989, RECLUS,
Montpellier
[SCH 89] SCHOLL M. ET VOISARD A., Thematic map Modeling, Int. Symposium on Large
Spatial Databases, 1989, LNCS n409, p. 167-192
[SCH 96] SCHOLL M., VOISARD A., PELOUX J.P., RAYNAL L., RIGAUX P., SGBD
Gographiques, Spcificits, Thomson Publishing, 1996, Paris
[SHA 78] SHAMOS M. I., Computational Geometry, PHD, 1978, Yale University
[SHL 88] SHLAER S, MELLOR S-J., Objet Oriented System Analysis : Modelling the World in
Data, Englewood Cliffs, 1988, Prentice-Hall
[SOU 86] SOURIS M., Systmes dinformation gographique et bases de donnes, Colloques
et Sminaires sur le Traitement des donnes localises, Paris, Editions de lORSTOM, 1986,
p. 29-87
[SOU 87] SOURIS M., A Geographic Information System with relational architecture :
principles and example of use, in Primera conferencia sobre informatica y geografia, 1987,
San Jose, Costa Rica, pp 703-728
[SOU 90] SOURIS M., Le systme SAVANE, Manuels de rfrence, 1990-2002, IRD
[TAN 95] TANZI T., UBEDA T., Contrle topologique de la cohrence dans les bases de
donnes gographiques : application aux rseaux , Revue Internationale de Gomatique,
1995, Vol. 5, n2, pp 133-155
[TOM 76] TOMLINSON, CALKINS AND MARBLE, Essential part of a geographic information
system, Computer Handling of geographic Data, UNESCO Press, Paris, 1976
[UBE 96] UBEDA T., SERVIGNE S., Geometric and Topological Consistency of Spatial Data,
1996, in Proceedings: First International Conference on Geocomputation, Leeds, UK
[UBE 97] UBEDA T., Contrle de la qualit spatiale dans les bases de donnes gographiques
: Cohrence topologique et corrections d'erreurs, Thse soutenue l'INSA de Lyon, 1997
[ULL 88] ULMANN J.D., Principles of Database and Knowledge-Base Systems, 1988,
Computer Science Press
[VOI 92] VOISARD A., Bases de donnes gographiques : du modle de donnes linterface
utilisateur. Thse de doctorat, Universit dOrsay, 1992
[VOI 95] VOIRON C., Analyse spatiale et analyse dimages, 1995, RECLUS, Montpellier

Bibliographie 357
[WOR 90] WORBOYS M.F., HEARNSHAW H.M., MAGUIRE D.J., Object-Oriented data
Modelling for Spatial Databases, International Journal of Geographic Information Systems,
1990, vol. 4, p. 369-383
[WOR 95] WORBOYS M. F., GIS, a Computer Perspective, Taylor and Francis, 1995

Annexes

360

Annexe

Structures et mthodes : implmentation 361

Annexe A

Structures et mthodes : implmentation

Cette annexe prsente le code C++ de classes correspondant limplmentation


des structures, des mthodes, et des algorithmes dcrits dans les chapitres qui
prcdent. Nous ne prsentons ici quune partie des classes du systme, en excluant
en particulier toutes les classes concernant linterface utilisateur, propre au systme
de dveloppement utilis (Visual C++ de Microsoft).
Chaque module fera lobjet dune section distincte. Lordre de prsentation des
classes suivra en gnral leur apparition dans le texte principal de ce mmoire, car il
est difficile dtablir une hirarchie selon leur importance dans la construction du
systme. Certaines classes sont utilises dans lensemble des modules : elles ne
seront bien sr prsentes quune seule fois.
A.1. SAVATECA
A.1.1. Les classes CAttribut et CRelation
Ces classes reprsentent les objets fondamentaux que sont les relations et les
attributs :
class CAttribut
{
public :
CAttribut();
int m_iType;
int m_iPtr;
int m_iNbcar;
int m_iNbvalb;
int m_iPtrval;
int m_iNumero;
char m_chNom[20];
int m_iRangDansLaVue;
};

362

Annexe

La variable iType donne le type de lattribut (1 ou 5 : nominal; 2 : ordinal; 3 :


entier;4 : rel; 6 : pixel entier 8 bit; 7 : pixel entier 16 bitsclass ; 8 : pixel RVB ; 9 :
pixel 32 rel bits). La variable m_iNbcar indique le nombre de caractres utilis
pour les modalits dans le cas dun attribut nominal. La variable m_iNbvalb
indique le nombre de modalits intgres dans la base de donnes. La variable
m_iPtrval donne ladresse de la premire modalit dans le fichier fpvaleurs. Ces
trois variables permettent de retrouver dans le fichier fpvaleurs une modalit partir
de son codage interne iValeur :
iPtr=(m_iPtrval+iValeur-2)*m_iNbcarAttr;
fseek(FileValeurs,iPtr,SEEK_SET);
fread(chNomValeur,m_iNbcarAttr,1,FileValeurs);

La classe CRelation est galement utilise dans tous les modules du systme :
CRelation
{
public :
int m_iPtr;
int m_iNrec;
int m_iType;
int m_iNba;
int m_iPtrLibreArc;
int m_iPtrLibreTuple;
char m_chNomFichF[16];
char m_chNomFichZ[16];
char m_chNomFichA[16];
char m_chNom[100];
char m_chFichierFeuille[_MAX_PATH];
char m_chFichierZone[_MAX_PATH];
char m_chFichierArc[_MAX_PATH];
CAttribut* m_pAttributs[NB_MAX_ATTRIBUTS];
int m_iRangDansLaVue;
public:
CRelation();
~CRelation();
};

Le tableau CAttribut* m_pAttributs[NB_MAX_ATTRIBUTS] conserve la


liste des pointeurs vers les objets de type CAttribut de la relation. La variable
m_iType indique le type de la relation (1 : non localise ; 2 : ligne ; 3 : point ; 4 :
zone ; 5 : pixel).
A.1.2. La classe CBase
La classe CBase dcrit dans SAVATECA la structure dune base de donnes :
class CBase
{
private:
public:
char
char
char
char
char
char
char
char
char

m_chNomBase[100];
m_chDirAdmin[_MAX_PATH];
m_chDirBase[_MAX_PATH];
m_chDirDigit[_MAX_PATH];
m_chDirDoc[_MAX_PATH];
m_chNomFichierAcces[_MAX_PATH];
m_chNomFichierBase[_MAX_PATH];
m_chNomFichierValeurs[_MAX_PATH];
m_chNomFtmp[_MAX_PATH];

Structures et mthodes : implmentation 363

double m_dMaxx;
double m_dMaxy;
double m_dMinx;
double m_dMiny;
int m_iOuvert;
int m_iNbrel;
CRelation* m_pRelations[NB_MAX_RELATIONS];
public:
CBase();
~CBase();
int IsOuverte() {return m_iOuvert;};
void Ouverte() {m_iOuvert=1;};
void Fermer();
BOOL Init(char* chNomBase,char* chDirBase,char* chDirDoc);
void InitRang();
BOOL Alloc();
void Desalloc();
BOOL Realloc();
int RelRecherche(const char *nom);
int RelDupRecherche(int iNoth, int* itabNoth);
int AttDupRecherche(int iNoth, int iNoatt, int* itabNothAtt);
int FiczRecherche(char *nom);
int FicfRecherche(char *nom);
int FicaRecherche(char *nom);
int AttrRecherche(int iNoth,char *nom);
BOOL NouveauFichier(int iType,char *chNom);
BOOL InsertionNewValeurs(char *ctabNewValeurs,int iNbNewValeurs,int iNoth,int iNoatt);
int NbObjets(int iNoth);
int NbValeurs(int iNoth,int iNoatt);
};

void GeoToSav(double dLongitude,double dColatitude,float& fXSav,float& fYSav);

On remarquera en particulier la variable membre m_iNbrel, qui donne le


nombre de relations de la base, lorsque celle-ci est ouverte, et CRelation*
m_pRelations[NB_MAX_RELATIONS] qui donne les adresses des objets de type
CRelation de la base. Les mthodes RelRecherche() et AttrRecherche()
renvoie le numro interne dune la relation ou dun attribut partir de son nom. Les
mthodes Alloc() ou ReAlloc() permettent de charger la structure de la base
partir du dictionnaire, conserv dans le fichier base. Le fichier base est maintenu par
la classe CDico.
BOOL CBase::Alloc()
{
//--- initialisation des accs aux donnes suivant le dictionnaire de la base ouverte
int iPtr,j,k;
int iNbRelations;
int iTypeRelation,iNbAttributs,iNrec,plibz,pliba;
int iTypeAttribut,iNbvalb,iPtrval,iNbcar;
long adr;
char chNomRelation[64];
char chNomAttribut[64];
char chDescription[128];
char chNom2[_MAX_PATH],chNom3[100],chNom4[100];
CDico dico;
if(dico.Ouvrir(m_chNomFichierBase,MODE_READ) == FALSE)return FALSE;
if(dico.LireNbRelations(iNbRelations) == FALSE)return FALSE;
m_iNbrel=iNbRelations;
iPtr=3;
j=1;
while(j <= m_iNbrel)
{
adr=(iPtr-1)*dico.GetTailleRecord();

364

Annexe

if(dico.LireRelation(adr,chNomRelation,iTypeRelation,iNbAttributs,iNrec,chNom2,chNom3,chNom4
,plibz,pliba) == FALSE)return FALSE;
m_pRelations[j]= new CRelation;
m_pRelations[j]->m_iPtr=adr;
strcpy(m_pRelations[j]->m_chNom,chNomRelation);
m_pRelations[j]->m_iType=iTypeRelation;
m_pRelations[j]->m_iNba=iNbAttributs;
m_pRelations[j]->m_iNrec=iNrec;
m_pRelations[j]->m_iRangDansLaVue=0;
if(iTypeRelation == 5)
{
strcpy(m_pRelations[j]->m_chFichierZone,chNom2);
strcpy(m_pRelations[j]->m_chFichierFeuille,"");
strcpy(m_pRelations[j]->m_chFichierArc,"");
strcpy(m_pRelations[j]->m_chNomFichF,"");
strcpy(m_pRelations[j]->m_chNomFichZ,"");
strcpy(m_pRelations[j]->m_chNomFichA,"");
m_pRelations[j]->m_iPtrLibreArc=0;
m_pRelations[j]->m_iPtrLibreTuple=0;
}
else
{
strcpy(m_pRelations[j]->m_chNomFichF,chNom2);
strcpy(m_pRelations[j]->m_chNomFichZ,chNom3);
strcpy(m_pRelations[j]->m_chNomFichA,chNom4);
m_pRelations[j]->m_iPtrLibreArc=pliba;
m_pRelations[j]->m_iPtrLibreTuple=plibz;
strcpy(m_pRelations[j]->m_chFichierFeuille,m_chDirBase);
strcat(m_pRelations[j]->m_chFichierFeuille,"\\");
strcat(m_pRelations[j]->m_chFichierFeuille,chNom2);
strcpy(m_pRelations[j]->m_chFichierZone,m_chDirBase);
strcat(m_pRelations[j]->m_chFichierZone,"\\");
strcat(m_pRelations[j]->m_chFichierZone,chNom3);
strcpy(m_pRelations[j]->m_chFichierArc,m_chDirBase);
strcat(m_pRelations[j]->m_chFichierArc,"\\");
strcat(m_pRelations[j]->m_chFichierArc,chNom4);
}
iPtr++;
k=1;
while(k <= iNbAttributs)
{
adr=(iPtr-1)*dico.GetTailleRecord();
if(dico.LireAttribut(adr,chNomAttribut,iTypeAttribut,iNbvalb,iPtrval,iNbcar,chDescription)
== FALSE)return FALSE;
m_pRelations[j]->m_pAttributs[k]= new CAttribut;
m_pRelations[j]->m_pAttributs[k]->m_iNumero=k;
m_pRelations[j]->m_pAttributs[k]->m_iPtr=adr;
strcpy(m_pRelations[j]->m_pAttributs[k]->m_chNom,chNomAttribut);
m_pRelations[j]->m_pAttributs[k]->m_iType=iTypeAttribut;
if(iTypeAttribut == 1)m_pRelations[j]->m_pAttributs[k]->m_iNbcar=iNbcar;
else m_pRelations[j]->m_pAttributs[k]->m_iNbcar=0;
m_pRelations[j]->m_pAttributs[k]->m_iNbvalb=iNbvalb;
m_pRelations[j]->m_pAttributs[k]->m_iPtrval=iPtrval;
m_pRelations[j]->m_pAttributs[k]->m_iRangDansLaVue=0;
iPtr++;
k++;
}
j++;
}
dico.Fermer();
return TRUE;
}

Structures et mthodes : implmentation 365


A.1.3. La classe CDico
La classe CDico encapsule lensemble des variables et des fonctions ncessaires
la lecture et lcriture du dictionnaire dune base de donnes SAVANE. Le
dictionnaire est conserv dans le fichier base qui doit toujours se trouver dans le
rpertoire de stockage de la base de donnes. Cette classe est utilise dans tous les
modules du systme, pour charger en mmoire la structure dune base de donnes
lors de son ouverture dans lun des modules. Les fonctions dcriture ne sont
utilises que dans le module SAVATECA, lors de la cration ou de la modification
dune base de donnes. Cette classe permet galement de grer lvolution de la
structure du fichier base, en y ajoutant des mthodes de mise jour lorsque cela est
ncessaire.
class CDico
{
private:
FILE* m_FileBase;
char m_chBuffer[256];
char m_chLecture[256];
int m_iTailleRecord;
public:
CDico();
~CDico();
int GetTailleRecord() {return m_iTailleRecord;};
BOOL Ouvrir(const char* chNomFichierBase,int iMode);
void Fermer();
BOOL LireEntete1(int& iDefecr,int& iPbl,int& iVersion,char* chUtilisateur);
BOOL LireEntete2(char* chNomBase,int& iNbRelations,int& iXb,int& iYb,int& iXh,int&
iYh,int& iPvl);
BOOL LireNumero(int& iNumero);
BOOL LirePbl(int& iPbl);
BOOL LirePvl(int& iPvl);
BOOL LireNbRelations(int& iNbRelations);
BOOL LireRelation(long adr,char* chNomRelation,int& iType,int& iNbAttributs,int&
iNrec,char* chNom2,char* chNom3,char* chNom4,int& plibz,int& pliba);
BOOL LireRelationNom(long adr,char* chNomRelation);
BOOL LireRelationTypeNbAttributs(long adr,int& iType,int& iNbAttributs);
BOOL LireAttribut(long adr,char* chNomAttribut,int& iTypeAttribut,int& iNbvalb,int&
iPtrval,int& iNbcar,char* chDescription);
BOOL LireAttributNbvalbPtrval(long adr,int& iNbvalb,int& iPtrval);
BOOL EcrireEntete1(int iDefecr,int iPbl,int iVersion,const char* chUtilisateur);
BOOL EcrireEntete2(const char* chNomBase,int iNbRelations,int iXb,int iYb,int iXh,int
iYh,int iPvl);
BOOL EcrireUtilisateurAdmi();
BOOL EcrireUtilisateurNone();
BOOL EcrireNumero();
BOOL EcrirePbl(int iPbl);
BOOL EcrirePvl(int iPvl);
BOOL EcrireNbRelations(int iNbRelations);
BOOL EcrireRelation(long adr,const char* chNomRelation,int iTypeRelation,int
iNbAttributs,int iNrec,const char* chNom2,const char* chNom3,const char* chNom4,int plibz,int
pliba);
BOOL EcrireRelationNom(long adr,const char* chNomRelation);
BOOL EcrireRelationDirMosaic(long adr,const char* chDirMosaic);
BOOL EcrireRelationNbAttributsNrec(long adr,int iNbAttributs,int iNrec);
BOOL EcrireRelationPlibz(long adr,int iPtrLibre);
BOOL EcrireRelationPliba(long adr,int iPtrLibre);
BOOL EcrireAttribut(long adr,const char* chNomAttribut,int iTypeAttribut,int iNbvalb,int
iPtrval,int iNbcar,const char* chDescription);
BOOL EcrireAttributNom(long adr,const char* chNomAttribut);
BOOL EcrireAttributType(long adr,int iTypeAttribut);
BOOL EcrireAttributNbvalPtrval(long adr,int iNbvalb,int iPtrval);
BOOL EcrireAttributDescription(long adr,const char* chDescription);
BOOL EcrireLigneBlanche(long adr);
BOOL DecaleMoins(long adrDebut,long adrFin,int iDecalage);
BOOL DecalePlus(long adrDebut,long adrFin,int iDecalage);
};

366

Annexe

Nous avons dj vu dans le paragraphe prcdent (classe CBase) comment cette


classe est utilise dans SAVATECA pour charger la structure dune base de
donnes.
Pour donner un exemple de la faon dont est maintenu le dictionnaire, voici le
code de la mthode EcrireRelation() qui crit dans le fichier la description
dune relation :
BOOL CDico::EcrireRelation(long adr,const char* chNomRelation,int iTypeRelation,int
iNbAttributs,int iNrec,const char* chNom2,const char* chNom3,const char* chNom4,int plibz,int
pliba)
{
if(m_FileBase == NULL)return FALSE;
memset(m_chBuffer,' ',256);
char chNomRelationLocal[20];
char chNom2Local[_MAX_PATH];
char chNom3Local[_MAX_PATH];
char chNom4Local[_MAX_PATH];
strcpy(chNomRelationLocal,chNomRelation);
strcpy(chNom2Local,chNom2);
strcpy(chNom3Local,chNom3);
strcpy(chNom4Local,chNom4);
if(strlen(chNom2Local) == 0)strcpy(chNom2Local,"aucun");
if(strlen(chNom3Local) == 0)strcpy(chNom3Local,"aucun");
if(strlen(chNom4Local) == 0)strcpy(chNom4Local,"aucun");
int iTaille=strlen(chNomRelationLocal);
for(int i=iTaille;i < 16;i++)chNomRelationLocal[i]=' ';
chNomRelationLocal[16]=0;
iTaille=strlen(chNom2Local);
for(i=iTaille;i < 55;i++)chNom2Local[i]=' ';
chNom2Local[55]=0;
iTaille=strlen(chNom3Local);
for(i=iTaille;i < 8;i++)chNom3Local[i]=' ';
chNom3Local[8]=0;
iTaille=strlen(chNom4Local);
for(i=iTaille;i < 8;i++)chNom4Local[i]=' ';
chNom4Local[8]=0;
if(fseek(m_FileBase,adr,SEEK_SET) != 0)return FALSE;
if(iTypeRelation == 5)
{
int i=sprintf(m_chBuffer,"%-16.16s%1d%4d%4d%55.55s",chNomRelationLocal,iTypeRelation,iNbAttributs,iNrec,chNom2Local);
m_chBuffer[80]=' ';
if(i != 80)
{
Fermer();
return FALSE;
}
}
else
{
chNom2Local[8]=0;
int i=sprintf(m_chBuffer,"%-16.16s%1d%4d%4d%-8.8s%-8.8s%8.8s%8d%8d",chNomRelationLocal,iTypeRelation,iNbAttributs,iNrec,chNom2Local,chNom3Local,chNom4
Local,plibz,pliba);
m_chBuffer[65]=' ';
if(i != 65)
{
Fermer();
return FALSE;
}
}
if(fwrite(m_chBuffer,m_iTailleRecord,1,m_FileBase) != 1)
{
Fermer();
return FALSE;
}

Structures et mthodes : implmentation 367

return TRUE;
}

De mme, la mthode EcrireAttribut() crit dans le fichier la description


dun attribut dune relation :
BOOL CDico::EcrireAttribut(long adr,const char* chNomAttribut,int iTypeAttribut,int
iNbvalb,int iPtrval,int iNbcar,const char* chDescription)
{
if(m_FileBase == NULL)return FALSE;
memset(m_chBuffer,' ',256);
//--- iNbcar non utilis pour le moment
//--- mise en bonne forme des chaines de caracteres
char chNomAttributLocal[20];
char chDescriptionLocal[100];
strcpy(chNomAttributLocal,chNomAttribut);
strcpy(chDescriptionLocal,chDescription);
int iTaille=strlen(chNomAttributLocal);
for(int i=iTaille;i < 16;i++)chNomAttributLocal[i]=' ';
chNomAttributLocal[16]=0;
iTaille=strlen(chDescriptionLocal);
for(i=iTaille;i < 40;i++)chDescriptionLocal[i]=' ';
chDescriptionLocal[40]=0;
i=sprintf(m_chBuffer,"%-16.16s%1d%8d%8d",chNomAttributLocal,iTypeAttribut,iNbvalb,iPtrval);
m_chBuffer[33]=' ';
if(i != 33)
{
Fermer();
return FALSE;
}
memcpy(&m_chBuffer[40],chDescriptionLocal,40);
if(fseek(m_FileBase,adr,SEEK_SET) != 0)return FALSE;
if(fwrite(m_chBuffer,m_iTailleRecord,1,m_FileBase) != 1)
{
Fermer();
return FALSE;
}
return TRUE;
}

Voici le code utilis dans SAVATECA pour crire dans le dictionnaire des
donnes la description dune nouvelle relation. Le type de la relation correspond au
type dimplantation spatiale (zone, ligne, point, pixel, non localis) :
CDico dico;
if(dico.Ouvrir(base.m_chNomFichierBase,MODE_READWRITE) == FALSE)return FALSE;
dico.LirePbl(iPbl);
dico.LireNbRelations(iNbRelations);
adr=dico.GetTailleRecord()*(iPbl-1);
adrRelation=adr;
strcpy(m_chNomFichierData,"aucun
");
strcpy(m_chNomFichierFeuille,"aucun
");
strcpy(m_chNomFichierArc,"aucun
");
switch(iTypeRelation)
{
case 1:
if(base.NouveauFichier(1,m_chNomFichierData) == FALSE)return FALSE;
dico.EcrireRelation(adrRelation,chNomRelation,iTypeRelation,m_iNbatt,iNrec,m_chNomFichierFeu
ille,m_chNomFichierData,m_chNomFichierArc,1,1);
iPbl++;
iNbRelations++;
break;
case 3:

368

Annexe
if(base.NouveauFichier(1,m_chNomFichierData) == FALSE)return FALSE;
if(base.NouveauFichier(2,m_chNomFichierFeuille) == FALSE)return FALSE;

dico.EcrireRelation(adrRelation,chNomRelation,iTypeRelation,m_iNbatt,iNrec,m_chNomFichierFeu
ille,m_chNomFichierData,m_chNomFichierArc,1,1);
iPbl++;
iNbRelations++;
break;
case 2:
case 4:
if(base.NouveauFichier(1,m_chNomFichierData) == FALSE)return FALSE;
if(base.NouveauFichier(2,m_chNomFichierFeuille) == FALSE)return FALSE;
if(base.NouveauFichier(3,m_chNomFichierArc) == FALSE)return FALSE;
dico.EcrireRelation(adrRelation,chNomRelation,iTypeRelation,m_iNbatt,iNrec,m_chNomFichierFeu
ille,m_chNomFichierData,m_chNomFichierArc,1,1);
iPbl++;
iNbRelations++;
break;
case 5:
//--- type mosaique
{
char chDirMosaic[_MAX_PATH];
strcpy(chDirMosaic,(LPCTSTR) m_strDirMosaic);
if(CreerMosaique(chNomRelation,chDirMosaic) == FALSE)
{
switch(config.m_iLangage)
{
case FRANCAIS:
default:
AfxMessageBox("Mosaque : cration impossible !",MB_OK|MB_ICONEXCLAMATION);
break;
case ESPAGNOL:
AfxMessageBox("Mosaico : creacin imposible !",MB_OK|MB_ICONEXCLAMATION);
break;
case ANGLAIS:
AfxMessageBox("Mosaque : creation aborted !",MB_OK|MB_ICONEXCLAMATION);
break;
}
return FALSE;
}
dico.EcrireRelation(adrRelation,chNomRelation,iTypeRelation,m_iNbatt,iNrec,chDirMosaic,m_chN
omFichierData,m_chNomFichierArc,1,1);
iPbl++;
iNbRelations++;
}
break;
default:
break;
}
dico.EcrirePbl(iPbl);
dico.EcrireNbRelations(iNbRelations);
dico.EcrireNumero();
dico.Fermer();

La mthode EcrireNumero() permet dactualiser une variable indiquant la


version du dictionnaire, aprs une modification du schma par ladministrateur.
Tous les programmes client (comme SAVANE, SAVAMER, SAVEDIT) lisent ce
numro dans le fichier base chaque utilisation de la base de donnes : si elle a t
modifie depuis le dernier accs, le schma est mis jour en lisant de nouveau le
dictionnaire. Cette procdure est essentielle lorsquune mme base est utilise en
rseau et est modifie par ladministrateur pendant sa consultation par des
utilisateurs.

Structures et mthodes : implmentation 369


A.1.4. La classe CFpacc9
La classe CFpacc9 permet de manipuler les vues externes. Elles est identique
dans lensemble des modules du systme. Les procdures de lecture sont utilises
par tous les modules qui utilisent les vues externes (SAVANE, SAVAMER,
SAVEDIT). La classe permet de grer des groupes de relations ou dattributs au
niveau des vues externes, de manire prsenter la vue externe avec des niveaux
hirarchiques structurs.
class CFpaccV9
{
public:
void EcrireUneVue(FILE* FileAcces,const char* chCode);
void EcrireEnteteAcces(FILE* FileAcces,const char* chNomBase,int iNbVues);
void EcrireEnteteVue(FILE* FileAcces,const char* chCode,int
iNbRelations,CGroupesDeRelationsDansVue* pGroupes);
void EcrireEnteteRelation(FILE* FileAcces,int iNoRelation,int
iNbAttributs,CGroupesDeAttributsDansVue* pGroupes);
public:
BOOL Upgrade();
void LireEnteteAcces(FILE* FileAcces,int& iNbVues);
void LireEnteteVue(FILE* FileAcces,char* chCode,int&
iNbRelations,CGroupesDeRelationsDansVue* pGroupes);
void LireEnteteRelation(FILE* FileAcces,int& iNoRelation,int&
iNbAttributs,CGroupesDeAttributsDansVue* pGroupes);

};

BOOL
BOOL
BOOL
BOOL

LireUneVue(int iNumero,char* chCode,int& iNbRelations);


ModifierUneVue(int iNumero);
AjouterUneVue(char* chCode);
SupprimerUneVue(int iNumero);

class CGroupesDeRelationsDansVue
{
private:
public:
int m_iNbGroupes;
char m_ctabArbre[NB_MAX_RELATIONS + 2*NB_MAX_GROUPES_DE_RELATIONS];
char m_chtabNomGroupe[NB_MAX_GROUPES_DE_RELATIONS][33];

};

void Init();
void SupprimerUneRelation(int iNoRelation);

class CGroupesDeAttributsDansVue
{
private:
public:
int m_iNbGroupes;
char m_ctabArbre[NB_MAX_ATTRIBUTS + 2*NB_MAX_GROUPES_DE_ATTRIBUTS];
char m_chtabNomGroupe[NB_MAX_GROUPES_DE_ATTRIBUTS][33];

};

void Init();
void Copier(CGroupesDeAttributsDansVue* pGroupeInitial);
void SupprimerUnAttribut(int iNoAttribut);

Par exemple, la mthode LireEnteteVue() lit dans le fichier fpacc le nombre


de relations de la vue, le nombre et la description des groupes de relation. Ces deux
derniers paramtres sont conservs dans un objet de la classe
CGroupesDeRelationsDansVue. La description des groupes de relation
comprend une liste donnant la place de chaque groupe et de chaque relation dans la
vue (m_ctabArbre), ainsi que le nom des groupes (m_chtabNomGroupe). La liste
a la forme suivante : bbbbgbbgbbbbfbbfbbb (b reprsente une relation, g le

370

Annexe

dbut dun groupe, f la fin du groupe). La description des groupes dattribut pour
chaque relation est bas sur le mme principe.
void CFpaccV9::LireEnteteVue(FILE* FileAcces,char* chCode,int&
iNbRelations,CGroupesDeRelationsDansVue* pGroupes)
{
char chBuffer[33];
memset(chBuffer,' ',32);
strcpy(chCode,"");
iNbRelations=0;
pGroupes->Init();
if(fread(chBuffer,28,1,FileAcces) == 1)
{
chBuffer[28]=0;
sscanf(chBuffer,"%4s%4d%4d",chCode,&iNbRelations,&pGroupes->m_iNbGroupes);
chCode[4]=0;

//--- groupes de relations


for(int i=0;i < pGroupes->m_iNbGroupes;i++)
{
fread(&pGroupes->m_chtabNomGroupe[i],32,1,FileAcces);
pGroupes->m_chtabNomGroupe[i][32]=0;
}
i=iNbRelations + 2*pGroupes->m_iNbGroupes;
if(i > 0)fread(pGroupes->m_ctabArbre,i,1,FileAcces);
}

A.1.5. La classe CIndexAttribut


La classe CIndexAttribut permet dindexer temporairement les modalits
dun attribut nominal, de manire retrouver rapidement le code dune modalit si
elle existe dans la base. Lindexation utilise une table dentre sur trois caractres
laquelle correspond la fonction de hachage Paquet(). Elle est utilise dans
SAVATECA lors de lintgration descriptive, et dans SAVANE pour trouver le
code interne dune modalit.
class CIndexAttribut
{
private:
CBase* m_pBase;
int m_itabIndex[15626];
int m_itabNombre[15626];
unsigned char *m_ctabCle;
int
int
int
int

m_iTypeAttr;
m_iNbcarAttr;
m_iNbvalb;
m_iPtrval;

public:
CIndexAttribut(CBase* pBase,int iNoth,int iNoatt);
~CIndexAttribut();

};

BOOL Init();
int Recherche(char *chNomValeur);
void Fermer();

Limplmentation des mthodes Init() et Recherche() permet de montrer la


structure de codage des valeurs nominales dans une base SAVANE :
BOOL CIndexAttribut::Init()
{
//--- allocation mmoire

Structures et mthodes : implmentation 371


m_ctabCle=(unsigned char *) malloc(m_iNbvalb*(m_iNbcarAttr + sizeof(int))*sizeof(unsigned
char));
if(m_ctabCle == NULL)
{
::ErreurDeMemoire();
return FALSE;
}
//--- initialisation de m_ctabCle
memset(m_ctabCle,' ',m_iNbvalb*(m_iNbcarAttr + sizeof(int)));
//--- initialisation de la table d'index
int i;
for(i=0;i < 15626;i++)
{
m_itabIndex[i]=0;
m_itabNombre[i]=0;
}
if(m_iNbvalb > 0)
{
char chNomValeur[NB_MAX_CHARACTER];
int iVal=0;
int iNbRec=m_iNbcarAttr+sizeof(int);
//--- lecture des valeurs
FILE* FileValeurs;
FileValeurs=fopen(m_pBase->m_chNomFichierValeurs,"rb");
chNomValeur[m_iNbcarAttr]='\0';
int iPtrval=(m_iPtrval-1)*m_iNbcarAttr;
fseek(FileValeurs,iPtrval,SEEK_SET);
for(i=0;i < m_iNbvalb;i++)
{
iVal=i+1;
fread(&chNomValeur[0],m_iNbcarAttr,1,FileValeurs);
memcpy(&m_ctabCle[iNbRec*i],chNomValeur,m_iNbcarAttr);
memcpy(&m_ctabCle[iNbRec*i+m_iNbcarAttr],&iVal,sizeof(int));
}
fclose(FileValeurs);
//--- tri des valeurs, ordre donn par paquet
qsort(m_ctabCle,m_iNbvalb,iNbRec,ComparClePaquet);
//--- creation de la table d'index
int irep1,irep1bis;
int iPtr=0;
int iNbIndex=0;
memcpy(chNomValeur,&m_ctabCle[iPtr],m_iNbcarAttr);
chNomValeur[m_iNbcarAttr]=0;
irep1=Paquet(chNomValeur);
m_itabIndex[irep1]=iPtr;
iPtr+=iNbRec;
iNbIndex++;
for(i=1;i < m_iNbvalb;i++)
{
memcpy(chNomValeur,&m_ctabCle[iPtr],m_iNbcarAttr);
chNomValeur[m_iNbcarAttr]=0;
irep1bis=Paquet(chNomValeur);
if(irep1bis != irep1)
{
m_itabNombre[irep1]=iNbIndex;
iNbIndex=0;
irep1=irep1bis;
m_itabIndex[irep1]=iPtr;
}
iNbIndex++;
iPtr+=iNbRec;
}
m_itabNombre[irep1]=iNbIndex;
}
return TRUE;
}
int CIndexAttribut::Recherche(char* chNom)
{
int i,j,irep1,iPtr,iNb,iVal;
char chNomValeur[NB_MAX_CHARACTER];

372

Annexe

char chNomTableau[NB_MAX_CHARACTER];
int iNbRec=m_iNbcarAttr+sizeof(int);
i=0;
while(i < m_iNbcarAttr)
{
if(chNom[i] == 0)break;
chNomValeur[i]=chNom[i];
i++;
}
while(i < m_iNbcarAttr)
{
chNomValeur[i]=' ';
i++;
}
chNomValeur[m_iNbcarAttr]=0;
irep1=Paquet(chNomValeur);
iPtr=m_itabIndex[irep1];
iNb=m_itabNombre[irep1];
iVal=0;
for(i=0;i < iNb;i++)
{
memcpy(chNomTableau,&m_ctabCle[iPtr],m_iNbcarAttr);
for(j=0;j < m_iNbcarAttr;j++)
{
if(chNomTableau[j] != chNomValeur[j])break;
}
if(j == m_iNbcarAttr)
{
memcpy(&iVal,&m_ctabCle[iPtr+m_iNbcarAttr],sizeof(int));
return iVal;
}
iPtr+=iNbRec;
}
return iVal;
}
static int __cdecl ComparClePaquet(const void *arg1,const void *arg2)
{
g_i1=Paquet((char *)arg1);
g_i2=Paquet((char *)arg2);
if(g_i1 < g_i2)return -1;
if(g_i1 == g_i2)return 0;
if(g_i1 > g_i2)return 1;
return 0;
}
static int Paquet(char* chNom)
{
if(chNom[0] <= 47)g_irep1=0;
else if(chNom[0] <= 57)g_irep1=int(chNom[0])-47;
else if(chNom[0] <= 65)g_irep1=11;
else if(chNom[0] <= 70)g_irep1=12;
else if(chNom[0] <= 75)g_irep1=13;
else if(chNom[0] <= 80)g_irep1=14;
else if(chNom[0] <= 85)g_irep1=15;
else if(chNom[0] <= 90)g_irep1=16;
else if(chNom[0] <= 95)g_irep1=17;
else if(chNom[0] <= 100)g_irep1=18;
else if(chNom[0] <= 105)g_irep1=19;
else if(chNom[0] <= 110)g_irep1=20;
else if(chNom[0] <= 115)g_irep1=21;
else if(chNom[0] <= 120)g_irep1=22;
else if(chNom[0] <= 135)g_irep1=23;
else g_irep1=24;
if(chNom[1] <= 47)g_irep2=0;
else if(chNom[1] <= 57)g_irep2=int(chNom[1])-47;
else if(chNom[1] <= 65)g_irep2=11;
else if(chNom[1] <= 70)g_irep2=12;
else if(chNom[1] <= 75)g_irep2=13;
else if(chNom[1] <= 80)g_irep2=14;
else if(chNom[1] <= 85)g_irep2=15;
else if(chNom[1] <= 90)g_irep2=16;
else if(chNom[1] <= 95)g_irep2=17;
else if(chNom[1] <= 100)g_irep2=18;
else if(chNom[1] <= 105)g_irep2=19;
else if(chNom[1] <= 110)g_irep2=20;

Structures et mthodes : implmentation 373


else
else
else
else

if(chNom[1] <= 115)g_irep2=21;


if(chNom[1] <= 120)g_irep2=22;
if(chNom[1] <= 135)g_irep2=23;
g_irep2=24;

if(chNom[2] <= 47)g_irep3=0;


else if(chNom[2] <= 57)g_irep3=int(chNom[2])-47;
else if(chNom[2] <= 65)g_irep3=11;
else if(chNom[2] <= 70)g_irep3=12;
else if(chNom[2] <= 75)g_irep3=13;
else if(chNom[2] <= 80)g_irep3=14;
else if(chNom[2] <= 85)g_irep3=15;
else if(chNom[2] <= 90)g_irep3=16;
else if(chNom[2] <= 95)g_irep3=17;
else if(chNom[2] <= 100)g_irep3=18;
else if(chNom[2] <= 105)g_irep3=19;
else if(chNom[2] <= 110)g_irep3=20;
else if(chNom[2] <= 115)g_irep3=21;
else if(chNom[2] <= 120)g_irep3=22;
else if(chNom[2] <= 135)g_irep3=23;
else g_irep3=24;
//--- codage en base 25
return (g_irep1*625 + g_irep2*25 + g_irep3);
}

A.1.6. La classe CIntegrationObjetsLocalises


La classe CintegrationObjetLocaliss regroupe les oprations permettant
deffectuer lintgration de nouveaux objets dans une relation. Elle est utilise dans
toutes les oprations dintgration dobjets localiss, partir des documents de
saisie graphique :
class CIntegrationObjetsLocalises
{
public:
CIntegrationObjetsLocalises(int iNoth,int iNoatt);
~CIntegrationObjetsLocalises();
int Init(char *chNomDocumentMygale,const char *chRepertoire);
void MessageErreur(int iNumero);
BOOL Integrer();
private:
int m_iNoth;
int m_iNoatt;
int m_iVersionMygale;
int m_iTypeDocument;
int m_iTypeSaisie;
int m_iNbcharCle;
char m_chRepertoire[_MAX_PATH];
char m_chNomDocument[_MAX_PATH];
double m_dXCalageProjection[2];
double m_dYCalageProjection[2];
int m_iXCalageTable[2];
int m_iYCalageTable[2];
double m_dA,m_dB;
BOOL
BOOL
BOOL
BOOL
BOOL
BOOL
};

IntegrerObjetsZoneVersion1();
IntegrerObjetsZoneVersion7();
IntegrerObjetsLigneVersion1();
IntegrerObjetsLigneVersion7();
IntegrerObjetsPointVersion1();
IntegrerObjetsPointVersion7();

void CentreLigne(double* dtabX,double *dtabY,int iNbpt,double &dXSav, double &dYsav);

Par exemple, la mthode IntegrerObjetsPointVersion7() permet de crer une


nouvelle feuille dans une relation de type point, partir dun document de type

374

Annexe

point provenant de SAVEDIT. Le processus cre les objets, cre la feuille dans le
fichier dindexation, puis intgre la cl descriptive pour chaque objet.
BOOL CIntegrationObjetsLocalises::IntegrerObjetsPointVersion7()
{
int iStep,iCompteur;
int i;
long adr;
float fXSav,fYSav;
float fXminFeuille,fYminFeuille,fXmaxFeuille,fYmaxFeuille;
double dLong,dColat;
double dXSav,dYSav;
double dVal;
double dXminFeuille,dYminFeuille,dXmaxFeuille,dYmaxFeuille;
char chTitreProgress[100];
char chNomFichier[_MAX_PATH];
char buffer[1000];
long fXSavUnix,fYSavUnix;
memset(buffer,0,1000);
int iSizeIdentifiantTuple=2*SIZECOOR;
//--- vrification de l'criture dans le fichier base
CDico dico;
if(dico.Ouvrir(base.m_chNomFichierBase,MODE_READWRITE) == FALSE) return FALSE;
dico.Fermer();
//--- ouverture des fichiers savedit
strcpy(chNomFichier,m_chRepertoire);
strcat(chNomFichier,"\\");
strcat(chNomFichier,m_chNomDocument);
strcat(chNomFichier,".pt");
FILE* FileMygalePoint=fopen(chNomFichier,"rb");
if(FileMygalePoint == NULL)
{
strcpy(chNomFichier,m_chRepertoire);
strcat(chNomFichier,"\\");
strcat(chNomFichier,m_chNomDocument);
strcat(chNomFichier,".PT");
FileMygalePoint=fopen(chNomFichier,"rb");
if(FileMygalePoint == NULL)
{
::ErreurDeFichier(chNomFichier);
return FALSE;
}
}
//--- init fentre de feuille
dXminFeuille=21600.;
dYminFeuille=10800.;
dXmaxFeuille=-21600.;
dYmaxFeuille=-10800.;
//--- ouverture du fichier savane des tuples
FILE* FileSavanePoint=fopen(base.m_pRelations[m_iNoth]->m_chFichierZone,"rb+");
if(FileSavanePoint == NULL)FileSavanePoint=fopen(base.m_pRelations[m_iNoth]>m_chFichierZone,"wb");
if(FileSavanePoint == NULL)
{
::ErreurDeFichierEnEcriture(base.m_pRelations[m_iNoth]->m_chFichierZone);
fclose(FileMygalePoint);
return FALSE;
}
//--- init des valeurs d'attributs
long vUnix[NB_MAX_ATTRIBUTS];
for(i=0;i < NB_MAX_ATTRIBUTS;i++)vUnix[i]=DosFloatToUnix(FINCONNU);
for(i=1;i <= base.m_pRelations[m_iNoth]->m_iNba;i++)
{
if(base.m_pRelations[m_iNoth]->m_pAttributs[i]->m_iType == 1)vUnix[i1]=DosFloatToUnix(0.F);
}
//--- intgration graphique et descriptive
//--- init des pointeurs
int iSavanePtrTupleFeuille=base.m_pRelations[m_iNoth]->m_iPtrLibreTuple;
int iNba=base.m_pRelations[m_iNoth]->m_iNba;

Structures et mthodes : implmentation 375


int iNbTupleFeuille=0;
int iSavanePtrTuple=iSavanePtrTupleFeuille;
int iTailleRecord=16; //--- pour dX et dY
if(m_iTypeSaisie == SAISIE_VALEUR || m_iTypeSaisie == SAISIE_CLEVALEUR)iTailleRecord+=8;
if(m_iTypeSaisie == SAISIE_CLE || m_iTypeSaisie ==
SAISIE_CLEVALEUR)iTailleRecord+=m_iNbcharCle;
adr=(long) ((iSavanePtrTuple-1)*(iSizeIdentifiantTuple + (iNba*SIZEVAL)));
fseek(FileSavanePoint,adr,SEEK_SET);
while(fread(buffer,iTailleRecord,1,FileMygalePoint) == 1)
{
memcpy(&dLong,&buffer[0],sizeof(double));
memcpy(&dColat,&buffer[8],sizeof(double));
wind.GeoToSav(dLong,dColat,fXSav,fYSav);
if(m_iNoatt > 0 && (m_iTypeSaisie == SAISIE_VALEUR || m_iTypeSaisie == SAISIE_CLEVALEUR))
{
//--- lecture et intgration d'une valeur numrique
memcpy(&dVal,&buffer[16],sizeof(double));
vUnix[m_iNoatt-1]=DosFloatToUnix((float) dVal);
}
fXSavUnix=DosFloatToUnix(fXSav);
fYSavUnix=DosFloatToUnix(fYSav);
//--- fenetre de la feuille
dXSav=(double) fXSav;
dYSav=(double) fYSav;
if(dXSav < dXminFeuille)dXminFeuille=dXSav;
if(dYSav < dYminFeuille)dYminFeuille=dYSav;
if(dXSav > dXmaxFeuille)dXmaxFeuille=dXSav;
if(dYSav > dYmaxFeuille)dYmaxFeuille=dYSav;
//--- criture dans le fichier
fwrite(&fXSavUnix,SIZECOOR,1,FileSavanePoint);
fwrite(&fYSavUnix,SIZECOOR,1,FileSavanePoint);
for(i=0;i < iNba;i++)fwrite(&vUnix[i],SIZEVAL,1,FileSavanePoint);
iNbTupleFeuille++;
iSavanePtrTuple++;
}
if(iNbTupleFeuille == 0)
{
fclose(FileMygalePoint);
fclose(FileSavanePoint);
return TRUE;
}
//--- mise jour du fichier feuille
FILE* FileSavaneFeuille=fopen(base.m_pRelations[m_iNoth]->m_chFichierFeuille,"rb+");
if(FileSavaneFeuille == NULL)FileSavaneFeuille=fopen(base.m_pRelations[m_iNoth]>m_chFichierFeuille,"wb");
if(FileSavaneFeuille == NULL)
{
::ErreurDeFichierEnEcriture(base.m_pRelations[m_iNoth]->m_chFichierFeuille);
fclose(FileMygalePoint);
fclose(FileSavanePoint);
return FALSE;
}
fXminFeuille=(float)
fYminFeuille=(float)
fXmaxFeuille=(float)
fYmaxFeuille=(float)

dXminFeuille;
dYminFeuille;
dXmaxFeuille;
dYmaxFeuille;

int iNumeroFeuille=0;
int iNbArcFeuille=0;
int iSavanePtrArcFeuille=0;
while(fgets(buffer,90,FileSavaneFeuille) != 0)iNumeroFeuille++;
iNumeroFeuille++;
fprintf(FileSavaneFeuille,"%5d%-12.12s%8.2f%8.2f%8.2f%8.2f%8d%8d%8d%8d\n",
iNumeroFeuille,m_chNomDocument,
fXminFeuille,fYminFeuille,fXmaxFeuille,fYmaxFeuille,
iNbTupleFeuille,iSavanePtrTupleFeuille,
iNbArcFeuille,iSavanePtrArcFeuille);
fclose(FileSavaneFeuille);
//--- mise jour des pointeurs libres dans le fichier base pour la relation

376

Annexe

if(dico.Ouvrir(base.m_chNomFichierBase,MODE_READWRITE))
{
adr=base.m_pRelations[m_iNoth]->m_iPtr;
dico.EcrireRelationPlibz(adr,iSavanePtrTuple);
dico.Fermer();
base.m_pRelations[m_iNoth]->m_iPtrLibreTuple=iSavanePtrTuple;
base.m_pRelations[m_iNoth]->m_iPtrLibreArc=0;
}
//--- intgration de l'attribut cl
if(m_iNoatt > 0 && (m_iTypeSaisie == SAISIE_CLE || m_iTypeSaisie == SAISIE_CLEVALEUR))
{
char chCle[33],chClebis[33];
int iTypeAttribut=base.m_pRelations[m_iNoth]->m_pAttributs[m_iNoatt]->m_iType;
int iNbvalb=base.m_pRelations[m_iNoth]->m_pAttributs[m_iNoatt]->m_iNbvalb;
int iPtrval=base.m_pRelations[m_iNoth]->m_pAttributs[m_iNoatt]->m_iPtrval;
int iNbcarSavane=base.m_pRelations[m_iNoth]->m_pAttributs[m_iNoatt]->m_iNbcar;
int iNbcarMygale=m_iNbcharCle;
if(iNbcarMygale > iNbcarSavane)iNbcarMygale=iNbcarSavane;
//--- allocations mmoire pour les tableaux de code par objet
float *ftabCode=(float *) malloc((iNbTupleFeuille + 1)*sizeof(float));
char *ctabNewCle=(char *) malloc((iNbTupleFeuille + 1)*iNbcarSavane + 1);
if(ftabCode == NULL || ctabNewCle == NULL)
{
::ErreurDeMemoire();
if(ftabCode != NULL)free(ftabCode);
if(ctabNewCle != NULL)free(ctabNewCle);
fclose(FileMygalePoint);
fclose(FileSavanePoint);
return FALSE;
}
for(i=0;i <= iNbTupleFeuille;i++)ftabCode[i]=0.F;
memset(ctabNewCle,' ',(iNbTupleFeuille+1)*iNbcarSavane);
//--- emplacement de la cl dans le document mygale
int iDebutDansBuffer=16;
if(m_iTypeSaisie == SAISIE_CLE || m_iTypeSaisie == SAISIE_VALEUR)iDebutDansBuffer=16;
else if(m_iTypeSaisie == SAISIE_CLEVALEUR)iDebutDansBuffer=24;
pMainFrame->StepProgress();
int iNbNewValeurs=0;
int iCode;
int iNoTuple=0;
if(iNbvalb > 0)
{
//--- indexation des valeurs existentes
CIndexAttribut index(&base,m_iNoth,m_iNoatt);
if(index.Init())
{
//--- codification des cls
iNoTuple=0;
fseek(FileMygalePoint,0L,SEEK_SET);
while(fread(buffer,iTailleRecord,1,FileMygalePoint) == 1)
{
pMainFrame->StepProgress();
memset(chCle,' ',iNbcarMygale);
memcpy(chCle,&buffer[iDebutDansBuffer],iNbcarMygale);
chCle[iNbcarMygale]='\0';
strstripall(chCle);
if(strlen(chCle) == 0)strcpy(chCle,"Valeur inconnue");
iCode=index.Recherche(chCle);
if(iCode == 0)
{
//--- nouvelle valeur
i=0;
while(i < iNbNewValeurs && iCode == 0)
{
memcpy(chClebis,&ctabNewCle[i*iNbcarSavane],iNbcarSavane);
chClebis[iNbcarSavane]='\0';
strstrip(chClebis);
if(strcmp(chCle,chClebis) == 0)iCode=iNbvalb+i+1;
i++;
}
if(iCode == 0)

Structures et mthodes : implmentation 377


{
i=strlen(chCle);
memcpy(&ctabNewCle[iNbNewValeurs*iNbcarSavane],chCle,i);
iNbNewValeurs++;
iCode=iNbvalb + iNbNewValeurs;
}

}
ftabCode[iNoTuple]=(float) iCode;
iNoTuple++;
}

}
}
else
{
//--- pas de valeurs dj introduites, codification directe des cls
iNoTuple=0;
fseek(FileMygalePoint,0L,SEEK_SET);
while(fread(buffer,iTailleRecord,1,FileMygalePoint) == 1)
{
memset(chCle,' ',iNbcarMygale);
memcpy(chCle,&buffer[iDebutDansBuffer],iNbcarMygale);
chCle[iNbcarMygale]='\0';
strstripall(chCle);
if(strlen(chCle) == 0)strcpy(chCle,"Valeur inconnue");
iCode=0;
i=0;
while(i < iNbNewValeurs && iCode == 0)
{
memcpy(chClebis,&ctabNewCle[i*iNbcarSavane],iNbcarSavane);
chClebis[iNbcarSavane]='\0';
strstrip(chClebis);
if(strcmp(chCle,chClebis) == 0)iCode=iNbvalb+i+1;
i++;
}

if(iCode == 0)
{
i=strlen(chCle);
memcpy(&ctabNewCle[iNbNewValeurs*iNbcarSavane],chCle,i);
iNbNewValeurs++;
iCode=iNbvalb + iNbNewValeurs;
}
ftabCode[iNoTuple]=(float) iCode;
iNoTuple++;
}

//--- criture dans les tuples des relations


long fValUnix;
int iPtr=iSavanePtrTupleFeuille;
iNoTuple=0;
while(iNoTuple < iNbTupleFeuille)
{
pMainFrame->StepProgress();
fValUnix=DosFloatToUnix(ftabCode[iNoTuple]);
adr=(long) ((iNba*SIZEVAL + iSizeIdentifiantTuple)*(iPtr - 1) + iSizeIdentifiantTuple +
(m_iNoatt-1)*SIZEVAL);
fseek(FileSavanePoint,adr,SEEK_SET);
fwrite(&fValUnix,SIZEVAL,1,FileSavanePoint);
iPtr++;
iNoTuple++;
}
free(ftabCode);
//--- insertion des nouvelles valeurs
base.InsertionNewValeurs(ctabNewCle,iNbNewValeurs,m_iNoth,m_iNoatt);
free(ctabNewCle);
}
fclose(FileMygalePoint);
fclose(FileSavanePoint);
return TRUE;
}

378

Annexe

A.2. SAVANE
Le module SAVANE contient de nombreuses classes, nous ne prsentons ici que
les plus importantes pour la comprhension de la structure du programme. Nous
avons regroup les classes en plusieurs sections : gestion de la base de donnes dans
une requte, algorithmique graphique, gestion des changements de systme de
coordonnes et de projection, et gestion dun document (cartographie, dition).
Enfin, un dernier paragraphe donne des exemples de ralisation doprations
relationnelles.
A.2.1. La manipulation de la base de donnes dans un cadre
A.2.1.1. Les classes CRelation et CAttribut
Les classes utilises dans SAVANE diffrent lgrement de celles utilises dans
SAVATECA. Elles comportent en particulier chacune une mthode permettant de
sauvegarder lensemble de leurs paramtres dans le fichier de la carte auquel
appartient le cadre.
class CAttribut
{
public :
int m_iType;
int m_iNbvalb;
int m_iPtrval;
int m_iNumero;
int m_iTemporaire;
int m_iNbcar;
char m_chNom[20];
public:
CAttribut();
CAttribut(FILE* Fichier);
void Ecrire(FILE* Fichier);
};
class CRelation
{
private:
CSchema* m_pSchema;
public :
long m_lAdresse;
int m_iNb0;
int m_iType;
int m_iNba;
int m_iNbObjets;
char m_chNom[100];
char m_chFichFeuille[_MAX_PATH];
char m_chFichZone[_MAX_PATH];
char m_chFichArc[_MAX_PATH];
int m_iNoFichDescriptif;
int m_iNoFichArc;
int m_iNoFichFeuille;
int m_iNoFichImage;
BOOL m_bARasteriser;
CAttribut* m_pAttributs[NB_MAX_ATTRIBUTS];
public:
CRelation(CSchema* pSchema);
CRelation(CSchema* pSchema,BOOL bMemeBase,FILE* Fichier);
~CRelation();
void Ecrire(FILE* Fichier);
int NbMaxObjetsParFeuille();
int NbMaxArcsParFeuille();
void MiseAJour(int iNoFichier);

Structures et mthodes : implmentation 379


void CalculDesCentroides();
unsigned char* ImageRaster(int iNoatt);
void ExporterUneFeuille(const char* chNomFeuille,const char* chNomAttribut,const char*
chNomFichier);
};

Les mthodes NbMaxObjetsParFeuille() et NbMaxArcsParFeuille()


permettent de connatre de nombre maximum dobjets ou darcs dans une feuille.
Ces fonctions sont utilises pour dimensionner lallocation dynamique de mmoire
dans certaines oprations sur la base de donnes qui utilisent lindexation
gographique.
int CRelation::NbMaxObjetsParFeuille()
{
int iNbMaxObjetsParFeuille=0;
FILE* FileFeuille;
CWind* pWind=m_pSchema->GetCadre()->GetWind();
//--- traitement
switch(m_iType)
{
case 5:
case 15:
case 25:
case 1:
case 11:
default:
iNbMaxObjetsParFeuille=0;
break;

5)

case 4:
case 3:
case 2:
FileFeuille=fopen(m_chFichFeuille,"rb");
if(FileFeuille != NULL)
{
float fXb,fYb,fXh,fYh;
int iNbObj;
while(fscanf(FileFeuille,"%*17c%8f%8f%8f%8f%8i%*25c",&fXb,&fYb,&fXh,&fYh,&iNbObj) ==
{
if(iNbMaxObjetsParFeuille < iNbObj)iNbMaxObjetsParFeuille=iNbObj;
}
fclose(FileFeuille);
}
break;
case 14:
case 13:
case 12:
case 24:
if(m_iNoFichFeuille == -1)FileFeuille=fopen(m_chFichFeuille,"rb");
else FileFeuille=fopen(m_pSchema->m_chFprovFeuille[m_iNoFichFeuille],"rb");

5)

if(FileFeuille != NULL)
{
float fXb,fYb,fXh,fYh;
int iNbObj;
while(fscanf(FileFeuille,"%*17c%8f%8f%8f%8f%8i%*25c",&fXb,&fYb,&fXh,&fYh,&iNbObj) ==
{
if(iNbMaxObjetsParFeuille < iNbObj)iNbMaxObjetsParFeuille=iNbObj;
}
fclose(FileFeuille);
}
break;

}
return iNbMaxObjetsParFeuille;
}

380

Annexe

A.2.1.2. La classe CSchema


La classe CSchema de SAVANE permet dencapsuler variables et mthodes
concernant la gestion du schma de la base correspond une requte dans un cadre.
Ce schma volue au fur et mesure de la requte : un objet de cette classe permet
de maintenir ltat du schma de la base au cours de la requte.
class CSchema
{
private:
CCadre* m_pCadre;
int m_iNumero;
public :
int m_iNbacc;
CRelation* m_pRelations[NB_MAX_RELATIONS];
char
char
char
char
int
int
int
int

m_chFprovDescriptif[NB_MAX_FICHIERS_TEMP][_MAX_PATH];
m_chFprovArc[NB_MAX_FICHIERS_TEMP][_MAX_PATH];
m_chFprovFeuille[NB_MAX_FICHIERS_TEMP][_MAX_PATH];
m_chFprovImage[NB_MAX_FICHIERS_TEMP][_MAX_PATH];

m_iFdisDescriptif[NB_MAX_FICHIERS_TEMP];
m_iFdisArc[NB_MAX_FICHIERS_TEMP];
m_iFdisFeuille[NB_MAX_FICHIERS_TEMP];
m_iFdisImage[NB_MAX_FICHIERS_TEMP];

char m_chNomFtval[_MAX_PATH];
int m_iPvl;
public:
CSchema(CCadre* pCadre);
CSchema(CCadre* pCadre,BOOL bMemeBase,FILE* Fichier);
~CSchema();
void Ecrire(FILE* Fichier);
void InitNomFichiers();
void Alloc();
void Actualiser();
void Desalloc();
int FchoixDescriptif();
int FchoixImage();
int FchoixFeuille();
int FchoixArc();
int RelRecherche(const char *nom);
int AttrRecherche(int iNoth,const char *nom);
CCadre* GetCadre() {return m_pCadre;};
int NzMax(int iNoth);
int NombreObjets(int iNoth);
int NouvelleRelation(int iType,char *chNomRelation,int iNoFichierFeuille,int
iNoFichierDescriptif,int iNoFichierArc);
int NouvelleRelationMosaique(char *chNomRelation,double dResolution,int
iTailleImagette,const char *chDirMosaique);
int NouvelAttribut(int iNoth,int iType,int iNbcar,int iNbValb,int iPtrval,char
*chNomAttribut,char *chDescription);
BOOL ExporterShapeFile(int iNoth,int iNbAttributs,int iTypeExport,int
iTypeCoordonnees,int* itabNoatt,CString strNomFichier);
BOOL ExporterMosaique(int iNoth,int iNoatt,CString strNomFichier);
BOOL ExporterDatabase(int iNoth,int iNbAttributs,int iTypeDatabase,int* itabNoatt,CString
strNomFichier);
};

Chaque schma correspond un cadre gographique (m_pCadre). La mthode


Alloc() permet de charger le schma dans un objet de type CSchema, partir du
dictionnaire et de la vue externe utilise. Elle utilise les classes CDico et CFpacc9 :
void CSchema::Alloc()
{
//--- initialisation des accs aux donnes suivant la vue externe
int i,j,iNbrel,iNorel,iNoth,iNbatt,iNovar,iNoatt,iType,iNb0,iNrec,plibz,pliba;
int iTypeRel[NB_MAX_RELATIONS],iNbattAbs[NB_MAX_RELATIONS];
long adr;

Structures et mthodes : implmentation 381


long iPtrRel[NB_MAX_RELATIONS];
//--- lecture des relations et attributs
CDico dico;
if(dico.Ouvrir(base.m_chNomFtbase,MODE_READ) == FALSE)return;
dico.LireNumero(m_iNumero);
dico.LireNbRelations(iNbrel);
i=2;
j=1;
while(j <= iNbrel)
{
adr=i*dico.GetTailleRecord();
dico.LireRelationTypeNbAttributs(adr,iType,iNbatt);
iTypeRel[j]=iType;
iPtrRel[j]=adr;
iNbattAbs[j]=iNbatt;
i+=(iNbatt+1);
j++;
}
dico.Fermer();
//--- lecture du fichier des accs et allocation
FILE *FileAcces;
char chBuffer[100];
i=_chdir(base.m_chDirBase);
FileAcces=fopen("fpacc","rb");
CfpaccV9 fpacc;
m_iNbacc=fpacc.RechercheEnteteVue(FileAcces,base.m_chNomVue);
iNoth=1;
while(iNoth <= m_iNbacc)
{
fpacc.LireEnteteRelation(FileAcces,iNorel,iNbatt);
m_pRelations[iNoth]= new CRelation(this);
m_pRelations[iNoth]->m_lAdresse=iPtrRel[iNorel];
m_pRelations[iNoth]->m_iNba=iNbatt;
//--- initialisation des numros de fichiers temporaires pour les relations
m_pRelations[iNoth]->m_iNoFichDescriptif=-1;
m_pRelations[iNoth]->m_iNoFichImage=-1;
m_pRelations[iNoth]->m_iNoFichFeuille=-1;
m_pRelations[iNoth]->m_iNoFichArc=-1;
for(iNoatt=1;iNoatt <= iNbatt;iNoatt++)
{
fread(chBuffer,4,1,FileAcces);
chBuffer[4]=0;
sscanf(chBuffer,"%4d",&iNovar);
m_pRelations[iNoth]->m_pAttributs[iNoatt]= new CAttribut();
m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iNumero=iNovar;
}
iNoth++;
}
fclose(FileAcces);
i=_chdir(base.m_chDirSav);
//--- initialisation de la disponibilit des fichiers provisoires
for(i=0;i < NB_MAX_FICHIERS_TEMP;i++)
{
m_iFdisDescriptif[i]=0;
m_iFdisImage[i]=0;
m_iFdisArc[i]=0;
m_iFdisFeuille[i]=0;
}
//--- initialisations des noms de relations et de leurs noms de fichiers permanents
char chNomRelation[100],chNom2[_MAX_PATH],chNom3[100],chNom4[100];
dico.Ouvrir(base.m_chNomFtbase,MODE_READ);
iNoth=1;
while(iNoth <= m_iNbacc)
{
adr=m_pRelations[iNoth]->m_lAdresse;
dico.LireRelation(adr,chNomRelation,iType,iNb0,iNrec,chNom2,chNom3,chNom4,plibz,pliba);

382

Annexe
strcpy(m_pRelations[iNoth]->m_chNom,chNomRelation);
m_pRelations[iNoth]->m_iType=iType;
m_pRelations[iNoth]->m_iNb0=iNb0;
if(iType == 5)
{
strcpy(m_pRelations[iNoth]->m_chFichFeuille,"aucun");
strcpy(m_pRelations[iNoth]->m_chFichZone,chNom2);
strcat(m_pRelations[iNoth]->m_chFichZone,"\\");
strcat(m_pRelations[iNoth]->m_chFichZone,m_pRelations[iNoth]->m_chNom);
strcpy(m_pRelations[iNoth]->m_chFichArc,"aucun");
}
else
{
strcpy(m_pRelations[iNoth]->m_chFichFeuille,base.m_chDirBase);
strcpy(m_pRelations[iNoth]->m_chFichZone,base.m_chDirBase);
strcpy(m_pRelations[iNoth]->m_chFichArc,base.m_chDirBase);
strcat(m_pRelations[iNoth]->m_chFichFeuille,"\\");
strcat(m_pRelations[iNoth]->m_chFichZone,"\\");
strcat(m_pRelations[iNoth]->m_chFichArc,"\\");
strcat(m_pRelations[iNoth]->m_chFichFeuille,chNom2);
strcat(m_pRelations[iNoth]->m_chFichZone,chNom3);
strcat(m_pRelations[iNoth]->m_chFichArc,chNom4);
}
iNoth++;
}

//--- initialisations des noms d'attribut


int iTypeAttr,iNbvalb,iPtrval,iNbcar;
char chNomAttribut[100],chDescription[128];
iNoth=1;
while(iNoth <= m_iNbacc)
{
iNoatt=1;
while(iNoatt <= m_pRelations[iNoth]->m_iNba)
{
strcpy(chNomAttribut,"");
iNovar=m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iNumero;
adr=m_pRelations[iNoth]->m_lAdresse + (iNovar*dico.GetTailleRecord());
dico.LireAttribut(adr,chNomAttribut,iTypeAttr,iNbvalb,iPtrval,iNbcar,chDescription);
strcpy(m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_chNom,chNomAttribut);
m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iType=iTypeAttr;
m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iNbvalb=iNbvalb;
m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iPtrval=iPtrval;
iNoatt++;
}
iNoth++;
}
dico.Fermer();
m_iPvl=1;
}

La mthode Actualiser() permet de recharger le schma aprs une


modification externe du schma de la base (avec SAVATECA), tout en conservant
ltat des relations temporaires (modifies par la requte en cours). La variable
m_iNumero de la classe permet de connatre ltat du schma et de le comparer avec
ltat actuel du dictionnaire.
void CSchema::Actualiser()
{
//--- vrifier les diffrences de schma
int iNumero;
CDico dico;
if(dico.Ouvrir(base.m_chNomFtbase,MODE_READ) == FALSE)return;
dico.LireNumero(iNumero);
if(iNumero == m_iNumero)
{
dico.Fermer();
return;

Structures et mthodes : implmentation 383


}
//--- vrifier que les relations appartiennent toujours la base, et mettre jour les
divers pointeurs
BOOL bModifie,bTrouve,bTrouveAttribut;
int i,j,k,iNbRelations,iNoth,iTypeRelation,iNbAttributs,iNrec,plibz,pliba;
int iNoatt,iTypeAttribut,iNbvalb,iPtrval,iNbcar,iTemporaire;
long lAdresse,lAdresseAttribut;
char chNomRelation[64],chNom2[_MAX_PATH],chNom3[100],chNom4[100],chNomFichier[_MAX_PATH];
char chNomAttribut[64],chDescription[128];
//--- actualisation
m_iNumero=iNumero;
bModifie=FALSE;
//--- mise jour des relations
dico.LireNbRelations(iNbRelations);
iNoth=1;
while(iNoth <= m_iNbacc)
{
if(m_pRelations[iNoth]->m_lAdresse > 0)
{
//--- relation non temporaire, recherche dans la base
bTrouve=FALSE;
i=2;
j=1;
while(j <= iNbRelations && bTrouve == FALSE)
{
lAdresse=i*dico.GetTailleRecord();
dico.LireRelation(lAdresse,chNomRelation,iTypeRelation,iNbAttributs,iNrec,chNom2
,chNom3,chNom4,plibz,pliba);
if(strcmp(chNomRelation,m_pRelations[iNoth]->m_chNom) == 0)
{
//--- on actualise les paramtres de la relation
bTrouve=TRUE;
if(m_pRelations[iNoth]->m_lAdresse != lAdresse)
{
m_pRelations[iNoth]->m_lAdresse=lAdresse;
bModifie=TRUE;
}
if(m_pRelations[iNoth]->m_iNb0 != iNbAttributs)
{
m_pRelations[iNoth]->m_iNb0=iNbAttributs;
bModifie=TRUE;
}
if(m_pRelations[iNoth]->m_iType == 5 || m_pRelations[iNoth]->m_iType == 15)
{
//--- cas mosaique
strcpy(chNomFichier,chNom2);
strcat(chNomFichier,"\\");
strcat(chNomFichier,m_pRelations[iNoth]->m_chNom);
if(strcmp(m_pRelations[iNoth]->m_chFichZone,chNomFichier) != 0)
{
strcpy(m_pRelations[iNoth]->m_chFichZone,chNomFichier);
bModifie=TRUE;
}
}
else
{
if(m_pRelations[iNoth]->m_iNoFichFeuille == -1)
{
//--- vrifier l'emplacement du fichier feuille d'origine
strcpy(chNomFichier,base.m_chDirBase);
strcat(chNomFichier,"\\");
strcat(chNomFichier,chNom2);
if(strcmp(m_pRelations[iNoth]->m_chFichFeuille,chNomFichier) != 0)
{
strcpy(m_pRelations[iNoth]->m_chFichFeuille,chNomFichier);
bModifie=TRUE;
}
}
if(m_pRelations[iNoth]->m_iNoFichDescriptif == -1)
{
//--- vrifier l'emplacement du fichier descriptif d'origine
strcpy(chNomFichier,base.m_chDirBase);
strcat(chNomFichier,"\\");
strcat(chNomFichier,chNom3);
if(strcmp(m_pRelations[iNoth]->m_chFichZone,chNomFichier) != 0)

384

Annexe
{
strcpy(m_pRelations[iNoth]->m_chFichZone,chNomFichier);
bModifie=TRUE;
}

}
if(m_pRelations[iNoth]->m_iNoFichArc == -1)
{
//--- vrifier l'emplacement du fichier arc d'origine
strcpy(chNomFichier,base.m_chDirBase);
strcat(chNomFichier,"\\");
strcat(chNomFichier,chNom4);
if(strcmp(m_pRelations[iNoth]->m_chFichArc,chNomFichier) != 0)
{
strcpy(m_pRelations[iNoth]->m_chFichArc,chNomFichier);
bModifie=TRUE;
}
}
}

== 0)

== 0)

//--- attributs
iNoatt=1;
while(iNoatt <= m_pRelations[iNoth]->m_iNba)
{
//--- recherche de l'attribut dans le dico
bTrouveAttribut=FALSE;
lAdresseAttribut=m_pRelations[iNoth]->m_lAdresse + dico.GetTailleRecord();
k=1;
while(k <= iNbAttributs && bTrouveAttribut == FALSE)
{
dico.LireAttribut(lAdresseAttribut,chNomAttribut,iTypeAttribut,iNb
valb,iPtrval,iNbcar,chDescription);
lAdresseAttribut+=dico.GetTailleRecord();
if(strcmp(chNomAttribut,m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_chNom)
{
//--- trouve
bTrouveAttribut=TRUE;
iTemporaire=m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iTemporaire;
if(m_pRelations[iNoth]->m_iType < 10 && iTemporaire == 0)
{
//--- relation de base non modifie,attribut non temporaire
if(m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iType != iTypeAttribut)
{
m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iType=iTypeAttribut;
bModifie=TRUE;
}
if(m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iNumero != k)
{
m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iNumero=k;
bModifie=TRUE;
}
}
//--- vrifier les pointeurs des attributs nominaux de base
if(m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iType == 1 && iTemporaire

}
k++;
}

{
if(m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iNbvalb != iNbvalb)
{
m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iNbvalb=iNbvalb;
bModifie=TRUE;
}
if(m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iPtrval != iPtrval)
{
m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iPtrval=iPtrval;
bModifie=TRUE;
}
}

if(m_pRelations[iNoth]->m_iType < 10 && bTrouveAttribut == FALSE)


{
//--- l'attribut iNoatt a t supprim de la base, le supprimer du schma
delete m_pRelations[iNoth]->m_pAttributs[iNoatt];
for(k=iNoatt;k < m_pRelations[iNoth]->m_iNba;k++)m_pRelations[iNoth]>m_pAttributs[k]=m_pRelations[iNoth]->m_pAttributs[k+1];
m_pRelations[iNoth]->m_pAttributs[m_pRelations[iNoth]->m_iNba]=NULL;
m_pRelations[iNoth]->m_iNba--;

Structures et mthodes : implmentation 385


bModifie=TRUE;
}
else iNoatt++;
}

}
i+=(iNbAttributs+1);
j++;
}

schma

if(bTrouve == FALSE)
{
//--- la relation a disparue depuis la dernire utilisation, il faut la supprimer du

CCadre* pCadre=GetCadre();
if(pCadre != NULL)XRelProj(pCadre,iNoth);
}
else iNoth++;
}
else iNoth++;
}

dico.Fermer();
if(bModifie)
{
carte.ASauver();
//--- mise jour des explorateurs
m_pCadre->MiseAJourExplorateurs();
}
i=0;
}

La mthode NouvelleRelation() permet de crer une nouvelle relation


temporaire dans le schma :
int CSchema::NouvelleRelation(int iType,char *chNomRelation,int iNoFichierFeuille,int
iNoFichierDescriptif,int iNoFichierArc)
{
//--- vrifier que la relation n'existe pas dj (normalement fait dans les dialogues)
int iNoth=RelRecherche(chNomRelation);
if(iNoth != 0)
{
switch(config.m_iLangage)
{
case FRANCAIS:
default:
AfxMessageBox("Cette relation existe dj !",MB_OK|MB_ICONEXCLAMATION);
break;
case ESPAGNOL:
AfxMessageBox("Este relacin ya existe !",MB_OK|MB_ICONEXCLAMATION);
break;
case ANGLAIS:
AfxMessageBox("This relation already exist !",MB_OK|MB_ICONEXCLAMATION);
break;
}
return 0;
}
m_iNbacc++;
iNoth=m_iNbacc;
m_pRelations[iNoth]= new CRelation(this);
strcpy(m_pRelations[iNoth]->m_chNom,chNomRelation);
m_pRelations[iNoth]->m_iNoFichFeuille=iNoFichierFeuille;
m_pRelations[iNoth]->m_iNoFichDescriptif=iNoFichierDescriptif;
m_pRelations[iNoth]->m_iNoFichArc=iNoFichierArc;
m_pRelations[iNoth]->m_iType=iType+10;
m_pRelations[iNoth]->m_lAdresse=0L;
//--- initialisation des numros de fichiers temporaires pour les relations
if(iNoFichierFeuille >= 0)m_iFdisFeuille[iNoFichierFeuille]=1;
if(iNoFichierDescriptif >= 0)m_iFdisDescriptif[iNoFichierDescriptif]=1;
if(iNoFichierArc >= 0)m_iFdisArc[iNoFichierArc]=1;
CCadre* pCadre=GetCadre();
pCadre->GetCarte()->SauverLesCadres();

386

Annexe

return iNoth;
}

De mme, la mthode NouvelAttribut() permet de crer un nouvel attribut


temporaire dans le schma :
int CSchema::NouvelAttribut(int iNoth,int iType,int iNbcar,int iNbvalb,int iPtrval,char
*chNomAttribut,char *chDescription)
{
//--- creation d'un nouvel attribut dans le schema
int iNoatt=m_pRelations[iNoth]->m_iNba+1;
//--- rechercher d'abord pour voir si le nom n'existe pas
int iTypeRelation=m_pRelations[iNoth]->m_iType;
if(iTypeRelation != 5 && iTypeRelation != 15 && iTypeRelation != 25)
{
char chAjout[5];
int i=2;
int iNoattIdem=AttrRecherche(iNoth,chNomAttribut);
while(iNoattIdem > 0 && i < 10)
{
//--- l'attribut existe, on modifie le nom
chNomAttribut[12]=0;
sprintf(chAjout," (%1d)",i);
chAjout[4]=0;
strcat(chNomAttribut,chAjout);
iNoattIdem=AttrRecherche(iNoth,chNomAttribut);
i++;
}
}
m_pRelations[iNoth]->m_iNba++;
m_pRelations[iNoth]->m_pAttributs[iNoatt]= new CAttribut();
m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iNumero=iNoatt;
strcpy(m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_chNom,chNomAttribut);
m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iType=iType;
m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iNbvalb=iNbvalb;
m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iPtrval=iPtrval;
m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iTemporaire=1;
if(iType == 1 || iType == 5)m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iNbcar=iNbcar;
else m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iNbcar=0;
if(strlen(chDescription) == 0)
{
switch(config.m_iLangage)
{
case FRANCAIS:
default:
strcpy(chDescription,"sans description");
break;
case ESPAGNOL:
strcpy(chDescription,"sin descripcin");
break;
case ANGLAIS:
strcpy(chDescription,"without description");
break;
}
}
CCadre* pCadre=GetCadre();
pCadre->GetCarte()->SauverLesCadres();
return iNoatt;
}

A.2.1.3. La classe CLecture


La classe CLecture regroupe les oprations de lecture des objets dune relation.
Elle est utilise dans toutes les oprations pour avoir accs aux donnes :
class CLecture
{
private:
CCadre* m_pCadre;

Structures et mthodes : implmentation 387


CWind* m_pWind;
int m_iNoth;
int m_tabp[NB_MAX_ATTRIBUTS];
int m_iNb0;
int m_iNba;
int m_iNbnew;
int m_iNbVariables;
int m_iEcrire;
int m_iType;
int m_iNb;
int m_iNbObj;
int m_iSizeIdentifiantTuple;
int nz;
int m_iArc;
long m_iPtrarc;
long m_iPtrTuple;
long m_iPtrarcFeuille;
long m_iNbarcFeuille;
float xc,yc,xb,yb,xh,yh;
float m_fWindXb;
float m_fWindYb;
float m_fWindXh;
float m_fWindYh;
FILE*
FILE*
FILE*
FILE*

m_FileFeuille;
m_FileDescriptif;
m_FileArc;
m_FileResultat;

public:
CLecture();
~CLecture();
BOOL Open(CCadre* pCadre,int iNoth);
BOOL Open(CCadre* pCadre,int iNoth,int iNoFichier,int iNbnew);
void Close();
BOOL Objet(float fXSav,float fYSav,float* v,FILE* FileResultat);
int Lire(float* v);
int LireSansTestFenetre(float* v);
int LireTuple(long ptrFile,float* v);
void SetFenetreLecture(float fXbSav,float fYbSav,float fXhSav,float fYhSav);
long GetPointeurTuple() {return m_iPtrTuple;};
void GetCentroide(float &fXc,float &fYc) {fXc=xc;fYc=yc;};
int GetPointeurArc() {return m_iPtrarc;};
int GetNbarcFeuille() {return m_iNbarcFeuille;};
int GetPointeurArcFeuille() {return m_iPtrarcFeuille;};
int GetNz() {return nz;};
FILE* GetFileArc() {return m_FileArc;};
void GetRectangle(float &fXb,float &fYb,float &fXh,float &fYh)
{fXb=xb;fYb=yb;fXh=xh;fYh=yh;};
void Ecrire(float* v);
};

Le tableau m_tabp contient lindirection entre les numros externes et internes


pour les attributs de la relation. Il est initialis, comme toutes les autres variables de
la relation, par la mthode Open(). Les variables m_fWind permettent de dfinir le
rectangle gographique de slection implicite.
Voici par exemple limplmentation de la mthode de lecture des objets. On
remarquera en particulier les diffrences de lecture entre les diffrents types, quils
soient de base (5,4,3,2,1) ou temporaires (15,25,14,24,13,12,11). Cette procdure
revoie 1 si la fin des objets a t atteinte, 0 si lobjet nest pas dans la fentre du
cadre, 1 si un objet a t lu, 2 si lon change de feuille. Le tableau v renvoie les
valeurs des attributs de lobjet lu :
int CLecture::Lire(float* v)
{
int i;
switch(m_iType)
{

388

Annexe
case 4:
if(m_iNb <= m_iNbObj)
{
//--- il reste des objets a lire dans la feuille courante
m_iPtrTuple=ftell(m_FileDescriptif);
fread(&nz,SIZEINT,1,m_FileDescriptif);
fread(&xc,SIZECOOR,1,m_FileDescriptif);
fread(&yc,SIZECOOR,1,m_FileDescriptif);
fread(&xb,SIZECOOR,1,m_FileDescriptif);
fread(&yb,SIZECOOR,1,m_FileDescriptif);
fread(&xh,SIZECOOR,1,m_FileDescriptif);
fread(&yh,SIZECOOR,1,m_FileDescriptif);
for(i=1;i <= m_iNb0;i++)fread(&v[i],SIZEVAL,1,m_FileDescriptif);
m_iNb++;
nz=UnixToDos(nz);
xc=UnixToDos(xc);
yc=UnixToDos(yc);
xb=UnixToDos(xb);
yb=UnixToDos(yb);
xh=UnixToDos(xh);
yh=UnixToDos(yh);
if(xh >= m_fWindXb && xb <= m_fWindXh && yh >= m_fWindYb && yb <= m_fWindYh)
{
for(i=1;i <= m_iNb0;i++)v[i]=UnixToDos(v[i]);
return 1;
}
return 0;
}
else
{
if(m_iEcrire && m_iNbObj > 0)
{
//--- fin de la feuille precedente
nz=0;
Ecrire(v);
}
//--- positionne sur le premier lment d'une nouvelle feuille
int iPtr,iPtrObj,iNbarc,iPtrarc;
float fXb,fYb,fXh,fYh;
while(fscanf(m_FileFeuille,"%*17c%8f%8f%8f%8f%8i%8i%8i%8i%*c",&fXb,&fYb,&fXh,&
fYh,&m_iNbObj,&iPtrObj,&iNbarc,&iPtrarc) == 8)
{
if(fXh >= m_fWindXb && fXb <= m_fWindXh && fYh >= m_fWindYb && fYb <= m_fWindYh)
{
//--- positionne sur le premier lment a lire, avec m_iNbObj objets a lire
iPtr=(iPtrObj-1)*(m_iSizeIdentifiantTuple + m_iNb0*SIZEVAL);
fseek(m_FileDescriptif,iPtr,SEEK_SET);
m_iNb=1;
if(m_iEcrire && m_iNbObj > 0)
{
fwrite(&iNbarc,SIZEINT,1,m_FileResultat);
fwrite(&iPtrarc,SIZEINT,1,m_FileResultat);
}
m_iNbarcFeuille=iNbarc;
m_iPtrarcFeuille=iPtrarc;
return 2;
}
}
//--- fin des feuilles
if(m_iEcrire)
{
iNbarc=0;
iPtrarc=0;
fwrite(&iNbarc,SIZEINT,1,m_FileResultat);
fwrite(&iPtrarc,SIZEINT,1,m_FileResultat);
m_iNbarcFeuille=0;
m_iPtrarcFeuille=0;
}
return -1;
}
break;
case 3:
if(m_iNb <= m_iNbObj)
{
//--- il reste des objets a lire dans la feuille courante
m_iPtrTuple=ftell(m_FileDescriptif);
fread(&xc,SIZECOOR,1,m_FileDescriptif);

Structures et mthodes : implmentation 389


fread(&yc,SIZECOOR,1,m_FileDescriptif);
for(i=1;i <= m_iNb0;i++)fread(&v[i],SIZEVAL,1,m_FileDescriptif);
m_iNb++;
xc=UnixToDos(xc);
yc=UnixToDos(yc);
if(xc >= m_fWindXb && xc <= m_fWindXh && yc >= m_fWindYb && yc <= m_fWindYh)
{
for(i=1;i <= m_iNb0;i++)v[i]=UnixToDos(v[i]);
return 1;
}
return 0;
}
else
{
//--- positionne sur le premier lment d'une feuille
int iPtr,iPtrObj;
float fXb,fYb,fXh,fYh;
while(fscanf(m_FileFeuille,"%*17c%8f%8f%8f%8f%8i%8i%*8i%*8i%*c",&fXb,&fYb,&fXh,&fYh,&m_iNbOb
j,&iPtrObj) == 6)
{
if(fXh >= m_fWindXb && fXb <= m_fWindXh && fYh >= m_fWindYb && fYb <= m_fWindYh)
{
//--- positionne sur le premier lment a lire, avec m_iNbObj objets a lire
iPtr=(iPtrObj-1)*(m_iSizeIdentifiantTuple + m_iNb0*SIZEVAL);
fseek(m_FileDescriptif,iPtr,SEEK_SET);
m_iNb=1;
return 2;
}
}
//--- fin des feuilles
return -1;
}
break;
case 2:
if(m_iNb <= m_iNbObj)
{
int iPtr;
//--- il reste des objets a lire dans la feuille courante
m_iPtrTuple=ftell(m_FileDescriptif);
fread(&m_iArc,SIZEINT,1,m_FileDescriptif);
fread(&m_iPtrarc,SIZEINT,1,m_FileDescriptif);
fread(&xc,SIZECOOR,1,m_FileDescriptif);
fread(&yc,SIZECOOR,1,m_FileDescriptif);
m_iArc=UnixToDos(m_iArc);
m_iPtrarc=UnixToDos(m_iPtrarc);
xc=UnixToDos(xc);
yc=UnixToDos(yc);
for(i=1;i <= m_iNb0;i++)fread(&v[i],SIZEVAL,1,m_FileDescriptif);
m_iNb++;
iPtr=(m_iPtrarc-1)*SIZEREC + 4*SIZECOOR;
fseek(m_FileArc,iPtr,SEEK_SET);
fread(&xb,SIZECOOR,1,m_FileArc);
fread(&yb,SIZECOOR,1,m_FileArc);
fread(&xh,SIZECOOR,1,m_FileArc);
fread(&yh,SIZECOOR,1,m_FileArc);
xb=UnixToDos(xb);
yb=UnixToDos(yb);
xh=UnixToDos(xh);
yh=UnixToDos(yh);
if(xh >= m_fWindXb && xb <= m_fWindXh && yh >= m_fWindYb && yb <= m_fWindYh)
{
for(i=1;i <= m_iNb0;i++)v[i]=UnixToDos(v[i]);
return 1;
}
return 0;
}
else
{
//--- positionne sur le premier lment d'une feuille
int iPtr,iPtrObj,iNbarc,iPtrarc;
float fXb,fYb,fXh,fYh;

390

Annexe

while(fscanf(m_FileFeuille,"%*17c%8f%8f%8f%8f%8i%8i%8i%8i%*c",&fXb,&fYb,&fXh,&fYh,&m_iNbObj,
&iPtrObj,&iNbarc,&iPtrarc) == 8)
{
if(fXh >= m_fWindXb && fXb <= m_fWindXh && fYh >= m_fWindYb && fYb <= m_fWindYh)
{
//--- positionne sur le premier lment a lire, avec m_iNbObj objets a lire
iPtr=(iPtrObj-1)*(m_iNb0*SIZEVAL + m_iSizeIdentifiantTuple);
fseek(m_FileDescriptif,iPtr,SEEK_SET);
m_iNb=1;
m_iNbarcFeuille=iNbarc;
m_iPtrarcFeuille=iPtrarc;
return 2;
}
}
//--- fin des feuilles
m_iNbarcFeuille=0;
m_iPtrarcFeuille=0;
return -1;
}
break;
case 1:
m_iPtrTuple=ftell(m_FileDescriptif);
for(i=1;i <= m_iNb0;i++)fread(&v[i],SIZEVAL,1,m_FileDescriptif);
if(!feof(m_FileDescriptif))
{
for(i=1;i <= m_iNb0;i++)v[i]=UnixToDos(v[i]);
return 1;
}
else return -1;
break;
case 14:
case 24:
if(m_iNbObj)
{
//--- il reste des objets a lire
m_iPtrTuple=ftell(m_FileDescriptif);
fread(&nz,SIZEINT,1,m_FileDescriptif);
fread(&xc,SIZECOOR,1,m_FileDescriptif);
fread(&yc,SIZECOOR,1,m_FileDescriptif);
fread(&xb,SIZECOOR,1,m_FileDescriptif);
fread(&yb,SIZECOOR,1,m_FileDescriptif);
fread(&xh,SIZECOOR,1,m_FileDescriptif);
fread(&yh,SIZECOOR,1,m_FileDescriptif);
for(i=1;i <= m_iNba;i++)fread(&v[i],SIZEVAL,1,m_FileDescriptif);
if(nz != 0)return 1;
else
{
if(m_iEcrire)Ecrire(v);
m_iNbObj=0;
return 3;
}
}
else
{
int iNbarc,iPtrarc;
fread(&iNbarc,SIZEINT,1,m_FileDescriptif);
fread(&iPtrarc,SIZEINT,1,m_FileDescriptif);
if(m_iEcrire)
{
fwrite(&iNbarc,SIZEINT,1,m_FileResultat);
fwrite(&iPtrarc,SIZEINT,1,m_FileResultat);
}
if(iNbarc == 0)return -1;
m_iNbObj=1;
m_iNbarcFeuille=iNbarc;
m_iPtrarcFeuille=iPtrarc;
return 2;
}
break;
case 13:
m_iPtrTuple=ftell(m_FileDescriptif);
fread(&xc,SIZECOOR,1,m_FileDescriptif);
fread(&yc,SIZECOOR,1,m_FileDescriptif);
for(i=1;i <= m_iNba;i++)fread(&v[i],SIZEVAL,1,m_FileDescriptif);

Structures et mthodes : implmentation 391


if(!feof(m_FileDescriptif))return 1;
else return -1;
break;
case 12:
m_iPtrTuple=ftell(m_FileDescriptif);
fread(&m_iArc,SIZEINT,1,m_FileDescriptif);
fread(&m_iPtrarc,SIZEINT,1,m_FileDescriptif);
fread(&xc,SIZECOOR,1,m_FileDescriptif);
fread(&yc,SIZECOOR,1,m_FileDescriptif);
for(i=1;i <= m_iNba;i++)fread(&v[i],SIZEVAL,1,m_FileDescriptif);
if(!feof(m_FileDescriptif))return 1;
else return -1;
break;
case 11:
m_iPtrTuple=ftell(m_FileDescriptif);
for(i=1;i <= m_iNba;i++)fread(&v[i],SIZEVAL,1,m_FileDescriptif);
if(!feof(m_FileDescriptif))return 1;
else return -1;
break;
default: break;
}
return -1;
}

Voici lutilisation typique de cette classe dans une procdure de lecture des
valeurs des objets dune relation :
CLecture lecture;
if(lecture.Open(pCadre,iNoth,iNoFichier,0))
{
//--- lecture des objets
float v[NB_MAX_ATTRIBUTS],fResultat;
i=lecture.Lire(v);
while(i != -1)
{
if(i == 1)
{
//--- traitement

}
i=lecture.Lire(v);
}
lecture.Close();

A.2.1.4. La classe CMacro


La classe CMacro encapsule les oprations de dfinition et dexcution de
macro-commandes et de mthodes :
class CMacro
{
private:
CCadre* m_pCadre;
int m_iExec;
char m_chNomFichierMacro[_MAX_PATH];
BOOL LireCommande(FILE* FileMacro,char* chCommande);
public:
CMacro(CCadre* pCadre);
~CMacro();
BOOL Nouveau(const char* chNomFichierMacro);
BOOL Ouvrir(const char* chNomFichierMacro);
BOOL EnregistrerCommande(char* chCommande);
BOOL Executer(const char* chNomMacro,const char* chNomFichierMacro,BOOL
bEnregistrerDansMacroCadre);
void Fermer();
BOOL New();
int GetMode() {return m_iExec;};
};

392

Annexe

La mthode EnregistrerCommande() permet denregistrer une opration dans


une macro-commande, en crivant les paramtres de lopration dans le fichier de la
macro-commande. Elle est utilise systmatiquement lors du dclenchement dune
commande dans SAVANE, pour inscrire cette commande dans la macro-commande
lie au cadre, et dans une macro-commande en cours de dfinition (si une telle
macro-commande a t cre auparavant avec la mthode Nouveau()). Par exemple,
voici le code de rponse au menu CRIS-Longueur :
void CMainFrame::OnCrisLongueur()
{
int iNoCadre;
if(carte.m_iNbCadres == 1)iNoCadre=0;
else iNoCadre=selection.m_iNoDuGroupe[0];
CCadre* pCadre=carte.m_pCadre[iNoCadre];
if(pCadre != NULL)pCadre->GetSchema()->Actualiser();
CDialogCrisLongueur dialogue(pCadre->GetSchema());
if(dialogue.DoModal() == IDOK)
{
FILE* FileMenu=fopen(base.m_chNomFtmp,"wb");
fprintf(FileMenu,"%d\n",dialogue.m_iNoth);
fprintf(FileMenu,"%d\n",dialogue.m_iUnite);
fclose(FileMenu);
//--- calcul du nouvel attribut
pCadre->GetMacro()->EnregistrerCommande("CRIS_LONGUEUR");
pCadre->GetMacroCadre()->EnregistrerCommande("CRIS_LONGUEUR");

XCrisLongueur(pCadre);
carte.SauverLesCadres();
pCadre->GetDlgStatExplorateur()->MiseAJour(dialogue.m_iNoth);
}

A.2.1.5. La classe CCalculateur


La classe CCalculateur encapsule toutes les variables et mthodes permettant
le calcul numrique partir dune expression numrique et de la valeur des attributs
dun objet dune relation :
class CCalculateur
{
private:
CSchema* m_pSchema;
int m_iNoth;
char* m_chExpressionChaine;
Symbole m_SymboleCourant;
double m_dValeurNombre;
char m_chNomIdentifiant[_MAX_PATH];
char m_NomNombre[_MAX_PATH];
float* m_pVariables;
int m_iNoErreur;
Symbole LireSymbole();
double ConditionExpression();
double ConditionTerme();
double Expression();
double Terme();
double Primaire();
double ErreurDeCalcul(char* Texte);
Symbole TestSymbole();
void TestConditionExpression();
void TestConditionTerme();
void TestExpression();
void TestTerme();
int TestPrimaire();
int ErreurDeSyntaxe(char* Texte);
public:

Structures et mthodes : implmentation 393


CCalculateur(CSchema* pSchema,int iNoth);
int Test(char* chFormule);
double Calcul(char* chFormule, float* dVariables);
int m_iNbErreurDeCalcul[20];
int m_iAttributs[NB_MAX_ATTRIBUTS];
};

Elle permet de tester les formules (Test()), et de calculer le rsultat


(Calcul()). Le calcul est bien sr rcursif :
double CCalculateur::Calcul(char* chFormule, float* pVariables)
{
m_pVariables=pVariables;
m_iNoErreur=0;
m_chExpressionChaine=chFormule;
m_SymboleCourant=DEBUT;
LireSymbole();
double d=ConditionExpression();
if(m_iNoErreur != 0)d=DINCONNU;
return d;
}
Symbole CCalculateur::LireSymbole() // lit un symbole pour le calcul
{
char caractere;
if(m_SymboleCourant == FIN) return m_SymboleCourant;
do
{
caractere=*m_chExpressionChaine;
if(caractere == '\0') return m_SymboleCourant=FIN;
m_chExpressionChaine++;
}
while (isspace(caractere));
switch (caractere)
{
case ';' : return m_SymboleCourant=FIN;
case '*': return m_SymboleCourant=MUL;
case '/': return m_SymboleCourant=DIV;
case '+': return m_SymboleCourant=PLUS;
case '-': return m_SymboleCourant=MOINS;
case '(': return m_SymboleCourant=LP;
case ')': return m_SymboleCourant=RP;
case ',': return m_SymboleCourant=VIRGULE;
case ':': return m_SymboleCourant=DEUXPOINT;
case '=': return m_SymboleCourant=EGAL;
case '<':
caractere=*m_chExpressionChaine++;
if(caractere == '>')return m_SymboleCourant=DIFFERENT;
if(caractere == '=')return m_SymboleCourant=INFERIEUREGAL;
m_chExpressionChaine--;
return m_SymboleCourant=INFERIEUR;
break;
case '>':
caractere=*m_chExpressionChaine++;
if(caractere == '=')return m_SymboleCourant=SUPERIEUREGAL;
m_chExpressionChaine--;
return m_SymboleCourant=SUPERIEUR;
break;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9': case '.':
{
char* p=m_NomNombre;
*p++=caractere;
caractere=*m_chExpressionChaine++;
while(isdigit(caractere) || caractere == '.')
{
*p++=caractere;
caractere=*m_chExpressionChaine++;
}
m_chExpressionChaine--;
*p=0;
m_dValeurNombre=atof(m_NomNombre);
return m_SymboleCourant=NOMBRE;
}
break;

394

Annexe
case 'v': // variable
case 'V':
{
char* p=m_chNomIdentifiant;
caractere=*m_chExpressionChaine++;
while(isdigit(caractere))
{
*p++=caractere;
caractere=*m_chExpressionChaine++;
}
m_chExpressionChaine--;
*p=0;
int iIndice=atoi(m_chNomIdentifiant);
int iNovar=m_pSchema->m_pRelations[m_iNoth]->m_pAttributs[iIndice]->m_iNumero;
m_dValeurNombre=(double) *(m_pVariables+iNovar);
return m_SymboleCourant=NOMBRE;
}
break;
default :
if(isalpha(caractere))
{
char* p=m_chNomIdentifiant;
*p++=(char ) tolower(caractere);
caractere=*m_chExpressionChaine++;
while(isalpha(caractere))
{
*p++=(char ) tolower(caractere);
caractere=*m_chExpressionChaine++;
}
m_chExpressionChaine--;
*p=0;
if(strcmp(m_chNomIdentifiant,"sin") == 0)return m_SymboleCourant=SIN;
else if(strcmp(m_chNomIdentifiant,"cos") == 0)return m_SymboleCourant=COS;
else if(strcmp(m_chNomIdentifiant,"tan") == 0)return m_SymboleCourant=TAN;
else if(strcmp(m_chNomIdentifiant,"asin") == 0)return m_SymboleCourant=ASIN;
else if(strcmp(m_chNomIdentifiant,"acos") == 0)return m_SymboleCourant=ACOS;
else if(strcmp(m_chNomIdentifiant,"atan") == 0)return m_SymboleCourant=ATAN;
else if(strcmp(m_chNomIdentifiant,"abs") == 0)return m_SymboleCourant=ABS;
else if(strcmp(m_chNomIdentifiant,"exp") == 0)return m_SymboleCourant=EXP;
else if(strcmp(m_chNomIdentifiant,"log") == 0)return m_SymboleCourant=LOG;
else if(strcmp(m_chNomIdentifiant,"ln") == 0)return m_SymboleCourant=LN;
else if(strcmp(m_chNomIdentifiant,"pow") == 0)return m_SymboleCourant=POW;
else if(strcmp(m_chNomIdentifiant,"mod") == 0)return m_SymboleCourant=MOD;
else if(strcmp(m_chNomIdentifiant,"sqrt") == 0)return m_SymboleCourant=SQRT;
else if(strcmp(m_chNomIdentifiant,"int") == 0)return m_SymboleCourant=PARTINT;
else
else
else
else
else
else

if(strcmp(m_chNomIdentifiant,"si") == 0)return m_SymboleCourant=SI;


if(strcmp(m_chNomIdentifiant,"if") == 0)return m_SymboleCourant=SI;
if(strcmp(m_chNomIdentifiant,"et") == 0)return m_SymboleCourant=AND;
if(strcmp(m_chNomIdentifiant,"and") == 0)return m_SymboleCourant=AND;
if(strcmp(m_chNomIdentifiant,"ou") == 0)return m_SymboleCourant=OR;
if(strcmp(m_chNomIdentifiant,"or") == 0)return m_SymboleCourant=OR;

else if(strcmp(m_chNomIdentifiant,"pi") == 0)
{
m_dValeurNombre= PI;
return m_SymboleCourant=NOMBRE;
}
else if(strcmp(m_chNomIdentifiant,"e") == 0)
{
m_dValeurNombre= E;
return m_SymboleCourant=NOMBRE;
}
}

ErreurDeSyntaxe("Erreur de syntaxe : symbole inconnu !");


return m_SymboleCourant=FIN;
break;

double CCalculateur::ConditionExpression()
{
double dGauche = ConditionTerme();
for(;;)
{
switch (m_SymboleCourant)

Structures et mthodes : implmentation 395

}
}

{
case AND :
{
LireSymbole();
double dDroit=ConditionTerme();
if(dGauche != 0. && dDroit != 0.)dGauche=1.; else dGauche=0.;
}
break;
case OR :
{
LireSymbole();
double dDroit=ConditionTerme();
if(dGauche != 0. || dDroit != 0.)dGauche=1.; else dGauche=0.;
}
break;
default : return dGauche;
}

double CCalculateur::ConditionTerme()
{
double dGauche = Expression();
switch (m_SymboleCourant)
{
case EGAL :
{
LireSymbole();
double dDroit=Expression();
if(dGauche == dDroit)return 1.; else return 0.;
}
case DIFFERENT :
{
LireSymbole();
double dDroit=Expression();
if(dGauche != dDroit)return 1.; else return 0.;
}
case INFERIEUR :
{
LireSymbole();
double dDroit=Expression();
if(dGauche < dDroit)return 1.; else return 0.;
}
case INFERIEUREGAL :
{
LireSymbole();
double dDroit=Expression();
if(dGauche <= dDroit)return 1.; else return 0.;
}
case SUPERIEUR :
{
LireSymbole();
double dDroit=Expression();
if(dGauche > dDroit)return 1.; else return 0.;
}
case SUPERIEUREGAL :
{
LireSymbole();
double dDroit=Expression();
if(dGauche >= dDroit)return 1.; else return 0.;
}
default : return dGauche;
}
}
double CCalculateur::Expression()
{
double dGauche = Terme();
for(;;)
{
switch (m_SymboleCourant)
{
case PLUS :
LireSymbole();
dGauche+=Terme();
break;
case MOINS :
LireSymbole();

396

}
}

Annexe
dGauche-=Terme();
break;
default : return dGauche;
}

double CCalculateur::Terme()
{
double dGauche = Primaire();
for(;;)
{
switch (m_SymboleCourant)
{
case MUL:
LireSymbole();
dGauche*=Primaire();
break;
case DIV:
{
LireSymbole();
double d=Primaire();
if(d == 0)return ErreurDeCalcul("division par zro");
dGauche/=d;
}
break;
default : return dGauche;
}
}
}
double CCalculateur::Primaire()
{
switch (m_SymboleCourant)
{
case LP :
{
LireSymbole();
double d=ConditionExpression();
LireSymbole(); // parenthese fermante
return d;
}
case NOMBRE :
LireSymbole();
if(m_dValeurNombre <= DINCONNU)return ErreurDeCalcul("variable : valeur inconnue");
return m_dValeurNombre;
case MOINS :
LireSymbole();
return -Primaire();
case PLUS :
LireSymbole();
return Primaire();
case COS :
LireSymbole();
return cos(Primaire());
case ACOS :
{
LireSymbole();
double d=Primaire();
if(d<-1. || d>1.)return ErreurDeCalcul("acos : erreur de domaine");
return acos(d);
}
case SIN :
LireSymbole();
return sin(Primaire());
case ASIN :
{
LireSymbole();
double d=Primaire();
if(d<-1. || d>1.)return ErreurDeCalcul("asin : erreur de domaine");
return asin(d);
}
case TAN :
LireSymbole();
return tan(Primaire());
case ATAN :
LireSymbole();
return atan(Primaire());
case EXP :

Structures et mthodes : implmentation 397


LireSymbole();
return exp(Primaire());
case LOG :
{
LireSymbole();
double d= Primaire();
if(d<=0)return ErreurDeCalcul("log : erreur de domaine");
return log(d);
}
case LN :
{
LireSymbole();
double d= Primaire();
if(d<=0)return ErreurDeCalcul("ln : erreur de domaine");
return log10(d);
}
case SQRT :
{
LireSymbole();
double d= Primaire();
if(d<0)return ErreurDeCalcul("sqrt : erreur de domaine");
return sqrt(d);
}
case ABS :
LireSymbole();
return fabs(Primaire());
case PARTINT :
LireSymbole();
return floor(Primaire());
case POW :
{
LireSymbole(); // parenthese ouvrante
LireSymbole();
double d1= Expression();
LireSymbole(); // virgule
double d2= Expression();
LireSymbole(); // parenthese fermante
if(d1==0 || d2<0)return ErreurDeCalcul("pow : erreur de domaine");
double d3=double(int(d2));
if(d1<0 && d3 != d2)return ErreurDeCalcul("pow : exposant non entier");
return pow(d1,d2);
}
case MOD :
{
LireSymbole(); // parenthese ouvrante
LireSymbole();
double d1= Expression();
LireSymbole(); // virgule
double d2= Expression();
LireSymbole(); // parenthese fermante
if(d2 == 0)return ErreurDeCalcul("mod : division par zro");
return fmod(d1,d2);
}
case SI :
{
LireSymbole(); // parenthese ouvrante
LireSymbole();
double dCondition= ConditionExpression();
LireSymbole(); // parenthese fermante
double dAlors= ConditionExpression();
LireSymbole(); // deux points
double dSinon= ConditionExpression();
if(dCondition == 1.)return dAlors; else return dSinon;
}
case FIN : return 1.;

default : return 1.;


}

A.2.1.6. La classe CBabel pour linterpolation


La classe CBabel encapsule lensemble des oprations de cration dune relation
de type mosaque par interpolation.
class CBabel

398

Annexe

{
private:
//--- variables gnrales
CCadre* m_pCadre;
int m_iInterpolation;
BOOL m_bMasque;
int m_iNbcol;
int m_iNblig;
int m_iMarge;
int m_iDatasize;
int m_iTypeAttribut;
int m_iNbLecture;
int m_iNbmaxObjets;
unsigned char* m_ctabImageMasque;
int m_iNbVoisins;
float m_ftabValeurVoisin[100];
float m_ftabContrainteVoisin[100];
double m_dResolution;
double m_dtabDistance[100];
double m_dZmin;
double m_dZmax;
BOOL m_bDistanceMax;
double m_dDistanceMax;
//--- variables pour l'interpolation sous contrainte
BOOL m_bContrainte;
int m_iNothContrainte;
int m_iNoattContrainte;
double m_dFacteurContrainte;
float* m_ftabImagetteContrainte;
//--- variables pour les objets de base (potentiel)
float *m_ftabValeur;
float *m_ftabContrainte;
double *m_dtabX;
double *m_dtabY;
double m_dFlxCalcul;
double m_dFlyCalcul;
double m_dFhxCalcul;
double m_dFhyCalcul;
double m_dFlxRecherche;
double m_dFlyRecherche;
double m_dFhxRecherche;
double m_dFhyRecherche;
//--- variables pour le calcul
int m_iXDebCalcul,m_iYDebCalcul,m_iXFinCalcul,m_iYFinCalcul;
int m_iXDebRecherche,m_iYDebRecherche,m_iXFinRecherche,m_iYFinRecherche;
//--- variables pour le lissage
float *m_fLigne;
double m_dw1[3];
double m_dw2[3];
double m_dp1[20];
double m_dp2[20];
double m_dC[20][20];
int m_iPas;
void Voisin(float fValeur, float fValeurContrainte,double distance);
float BaryCalcul(float fValeurContrainte);
float PotentielCalcul(double dXProj,double dYProj);
public:
float *m_ftabImagette;
int *m_itabNombre;
unsigned char* m_ctabData;
BOOL m_bMoyenne;
CBabel(CCadre* pCadre,int iInterpolation,int iNbcol,int iNblig,int iMarge,double
dResolution,BOOL bMasque,BOOL bMoyenne,unsigned char* ctabImageMasque);
~CBabel();
BOOL Alloc();
void SetDistanceMax(BOOL bDistanceMax,double dDistanceMax);
void SetContrainte(BOOL bContrainte,int iNoth,int iNoatt,double dFacteur);
void InitFenetre(CWind* pWind,double dFlx,double dFly);
int Lecture(int iNoImagette,int iNbRelations,int *itabRelation,int *itabAttribut,double
dConstante);
void LectureContrainte(int iNoImagette);
BOOL IntersectionMasque();

Structures et mthodes : implmentation 399


BOOL
BOOL
BOOL
BOOL
BOOL
void

Barycentre(int iNoImagette,int iPassage);


Potentiel();
Lissage(int ideb);
EcrireImagette(const char* chNomFichier,FILE* FileAttribut);
RemplacerImagette(int ptrdeb,FILE* FileAttribut);
ProjToImagette(double dXProj,double dYProj,double& dXRas,double& dYRas);

int GetNblig() {return m_iNblig;};


int GetNbcol() {return m_iNbcol;};
int GetMarge() {return m_iMarge;};
double GetMin() {return m_dZmin;};
double GetMax() {return m_dZmax;};
float* GetPtrImagette(int ilig)
{return (float* ) &m_ftabImagette[m_iMarge +
(ilig+m_iMarge)*m_iNbcol];};
};

Par exemple, la mthode Lecture() charge les points de rfrences dans la


mmoire de limagette crer, partir des relations et attributs choisis
(itabRelation, itabAttribut) :
int CBabel::Lecture(int iNoImagette,int iNbRelations,int *itabRelation,int
*itabAttribut,double dConstante)
{
//--- lecture des donnes
CSchema* pSchema=m_pCadre->GetSchema();
int i;
int iNoth,iNoatt;
int iNb0,iNba,iNovar;
float fXSav,fYSav;
float fWindXbSav,fWindYbSav,fWindXhSav,fWindYhSav;
float v[NB_MAX_ATTRIBUTS];
double dXProj,dYProj;
//--- fenetre de recherche en coordonnees savane
m_pCadre->ProjToSav(m_dFlxRecherche,m_dFlyRecherche,fWindXbSav,fWindYbSav);
m_pCadre->ProjToSav(m_dFhxRecherche,m_dFhyRecherche,fWindXhSav,fWindYhSav);
::Ordonner(fWindXbSav,fWindXhSav);
::Ordonner(fWindYbSav,fWindYhSav);
//--CString strTexte;
switch(config.m_iLangage)
{
case FRANCAIS:
default:
strTexte.Format(" Imagette %d : lecture des donnes...",iNoImagette);
break;
case ESPAGNOL:
strTexte.Format(" Imagette %d :lectura de los datos...",iNoImagette);
break;
case ANGLAIS:
strTexte.Format(" Imagette %d : reading the data...",iNoImagette);
break;
}
pMainFrame->SetStatusTexte(strTexte);
m_iNbLecture=0;
switch(m_iInterpolation)
{
case INTERPOLATION_BARYCENTRE:
{
int iXRas,iYRas;
double dXRasImagette,dYRasImagette;
//--- init
int iNbPixels=m_iNblig*m_iNbcol;
for(i=0;i < iNbPixels;i++)
{
m_itabNombre[i]=0;
m_ftabImagette[i]=0.F;
}
if(m_bMoyenne == FALSE)
{
for(i=0;i < iNbPixels;i++)m_ctabData[i]=0;
}
//--- crire dans la mmoire de l'imagette

400

Annexe
int iNoRelation=0;
while(iNoRelation < iNbRelations)
{
iNoth=itabRelation[iNoRelation];
iNoatt=itabAttribut[iNoRelation];
iNb0=pSchema->m_pRelations[iNoth]->m_iNb0;
iNba=pSchema->m_pRelations[iNoth]->m_iNba;
iNovar=pSchema->m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iNumero;
int iTypeRelation=pSchema->m_pRelations[iNoth]->m_iType;
if(iTypeRelation != 2 && iTypeRelation != 12)
{
//--- zone ou point, par centrode
CLecture lecture;
if(lecture.Open(m_pCadre,iNoth))
{
lecture.SetFenetreLecture(fWindXbSav,fWindYbSav,fWindXhSav,fWindYhSav);
i=lecture.Lire(v);
while(i != -1)
{
if(i == 1)
{
if(v[iNovar] > FINCONNU)
{
v[iNovar]*=(float) dConstante;
if(v[iNovar] > m_dZmax)m_dZmax=(double) v[iNovar];
if(v[iNovar] < m_dZmin)m_dZmin=(double) v[iNovar];
lecture.GetCentroide(fXSav,fYSav);
m_pCadre->SavToProj(fXSav,fYSav,dXProj,dYProj);
ProjToImagette(dXProj,dYProj,dXRasImagette,dYRasImagette);
iXRas=(int) (dXRasImagette +0.5);
iYRas=(int) (dYRasImagette +0.5);
if(iXRas >= 0 && iXRas < m_iNbcol && iYRas >= 0 && iYRas < m_iNblig)
{
if(m_bMoyenne == FALSE)
{
if(m_ctabData[iXRas+(iYRas*m_iNbcol)] == 0)
{
m_itabNombre[iXRas+(iYRas*m_iNbcol)]++;
m_ftabImagette[iXRas+(iYRas*m_iNbcol)]+=v[iNovar];
m_iNbLecture++;
}
}
else
{
m_itabNombre[iXRas+(iYRas*m_iNbcol)]++;
m_ftabImagette[iXRas+(iYRas*m_iNbcol)]+=v[iNovar];
m_iNbLecture++;
}
}
}

}
i=lecture.Lire(v);
}
lecture.Close();
}

}
else
{
int iPtrarc;
float v[NB_MAX_ATTRIBUTS];
CArc arc;
CLecture lecture;
if(lecture.Open(m_pCadre,iNoth))
{
lecture.SetFenetreLecture(fWindXbSav,fWindYbSav,fWindXhSav,fWindYhSav);
FILE* FileArc=lecture.GetFileArc();
i=lecture.Lire(v);
while(i != -1)
{
if(i == 1)
{
if(v[iNovar] > FINCONNU)
{
v[iNovar]*=(float) dConstante;
if(v[iNovar] > m_dZmax)m_dZmax=(double) v[iNovar];

Structures et mthodes : implmentation 401


if(v[iNovar] < m_dZmin)m_dZmin=(double) v[iNovar];
iPtrarc=lecture.GetPointeurArc();
//--- tester la fentre de l'arc

//--- lecture des points


arc.LirePoints(FileArc,iPtrarc);
m_iNbLecture++;
arc.Draw(m_pCadre,v[iNovar],this);
}

i=lecture.Lire(v);
}
lecture.Close();
}

if(m_bMoyenne == FALSE)
{
for(i=0;i < iNbPixels;i++)
{
if(m_itabNombre[i] > 0)m_ctabData[i]=1;
}
}
iNoRelation++;
}
//--- calcul de la moyenne par pixel a partir de la somme
for(i=0;i < iNbPixels;i++)
{
if(m_itabNombre[i] > 0)m_ftabImagette[i]/=m_itabNombre[i];
else m_ftabImagette[i]=FINCONNU;
}
}
break;
case INTERPOLATION_POTENTIEL:
case INTERPOLATION_PLUSPROCHEVOISIN:
case INTERPOLATION_SOMME:
case INTERPOLATION_SOMME_DECROISSANTE:
case INTERPOLATION_MOYENNE:
case INTERPOLATION_MOYENNE_DECROISSANTE:
{
//--- init
int iNbPixels=m_iNblig*m_iNbcol;
for(i=0;i < iNbPixels;i++)
{
m_ftabImagette[i]=0.F;
}
//--- crire dans les tableaux
int iNoRelation=0;
while(iNoRelation < iNbRelations && m_iNbLecture < m_iNbmaxObjets)
{
iNoth=itabRelation[iNoRelation];
iNoatt=itabAttribut[iNoRelation];
iNb0=pSchema->m_pRelations[iNoth]->m_iNb0;
iNba=pSchema->m_pRelations[iNoth]->m_iNba;
iNovar=pSchema->m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iNumero;
CLecture lecture;
if(lecture.Open(m_pCadre,iNoth))
{
i=lecture.LireSansTestFenetre(v);
while(i != -1 && m_iNbLecture < m_iNbmaxObjets)
{
if(i == 1)
{
if(v[iNovar] > FINCONNU)
{
v[iNovar]*=(float) dConstante;
if(v[iNovar] > m_dZmax)m_dZmax=(double) v[iNovar];
if(v[iNovar] < m_dZmin)m_dZmin=(double) v[iNovar];
lecture.GetCentroide(fXSav,fYSav);
m_pCadre->SavToProj(fXSav,fYSav,dXProj,dYProj);
m_dtabX[m_iNbLecture]=dXProj;
m_dtabY[m_iNbLecture]=dYProj;

402

Annexe
m_ftabValeur[m_iNbLecture]=v[iNovar];
m_iNbLecture++;
}

}
i=lecture.Lire(v);
}
lecture.Close();
}
iNoRelation++;
}

//--- lecture de la contrainte pour tous les points, par appartenance


if(m_bContrainte)
{
FILE *FileMosaic;
FILE *FileFeuille;
FILE *FileImage;
int iMosaiqueNbcol,iMosaiqueNblig,nbcol,nblig;
int no,ptr,ptrlib,ptrdeb;
double dXbf,dYbf,dXhf,dYhf,dZmin,dZmax;
double dMosaiqueResolution;
char chNomFichierFeuille[_MAX_PATH];
char chNomFichierMosaique[_MAX_PATH];
char chNomFichierAttribut[_MAX_PATH];
char cValeur;
short int sValeur;
float fValeur;
fValeur=0.;
for(i=0;i < m_iNbLecture;i++)
{
m_ftabContrainte[i]=FINCONNU;
}
//--- ouverture des fichiers de la mosaque
strcpy(chNomFichierMosaique,pSchema->m_pRelations[m_iNothContrainte]->m_chFichZone);
strcat(chNomFichierMosaique,"\\");
strcat(chNomFichierMosaique,pSchema->m_pRelations[m_iNothContrainte]->m_chNom);
strcat(chNomFichierMosaique,"_d");
//--- lecture des parametres de la mosaique
FileMosaic=OuvrirMosaique(pSchema,chNomFichierMosaique,m_iNothContrainte);
if(FileMosaic != NULL)
{
fscanf(FileMosaic,"%lf",&dMosaiqueResolution);
fscanf(FileMosaic,"%d",&iMosaiqueNbcol);
fscanf(FileMosaic,"%d",&iMosaiqueNblig);
fclose(FileMosaic);
int iTypeAttribut=pSchema->m_pRelations[m_iNothContrainte]>m_pAttributs[m_iNoattContrainte]->m_iType;
int iTemporaire=pSchema->m_pRelations[m_iNothContrainte]>m_pAttributs[m_iNoattContrainte]->m_iTemporaire;
if(iTemporaire)
{
strcpy(chNomFichierAttribut,carte.m_chNomDir);
strcat(chNomFichierAttribut,"\\");
strcat(chNomFichierAttribut,m_pCadre->m_chNom);
strcat(chNomFichierAttribut,"\\ft");
strcat(chNomFichierAttribut,pSchema->m_pRelations[m_iNothContrainte]->m_chNom);
strcat(chNomFichierAttribut,"_");
strcat(chNomFichierAttribut,pSchema->m_pRelations[m_iNothContrainte]>m_pAttributs[m_iNoattContrainte]->m_chNom);
}
else
{
strcpy(chNomFichierAttribut,pSchema->m_pRelations[m_iNothContrainte]>m_chFichZone);
strcat(chNomFichierAttribut,"\\");
strcat(chNomFichierAttribut,pSchema->m_pRelations[m_iNothContrainte]>m_pAttributs[m_iNoattContrainte]->m_chNom);
}
strcpy(chNomFichierFeuille,chNomFichierAttribut);
strcat(chNomFichierFeuille,"_f");
FileFeuille=fopen(chNomFichierFeuille,"rb");
FileImage=fopen(chNomFichierAttribut,"rb");

Structures et mthodes : implmentation 403


if(FileImage == NULL || FileFeuille == NULL)
{
if(FileImage != NULL)fclose(FileImage);
if(FileFeuille != NULL)fclose(FileFeuille);
}
else
{
//--- lecture des feuilles
int iDatasize=1;
if(iTypeAttribut == 1 || iTypeAttribut == 5 || iTypeAttribut == 6)iDatasize=1;
else if(iTypeAttribut == 7)iDatasize=2;
else if(iTypeAttribut == 8)iDatasize=3;
else if(iTypeAttribut == 9)iDatasize=4;
fscanf(FileFeuille,"%2d%20d%*c",&i,&ptrlib);
while(fscanf(FileFeuille,"%2d%20lf%20lf%10d%10d%20lf%20lf%20d%*c",
&no,&dXbf,&dYbf,&nbcol,&nblig,&dZmin,&dZmax,&ptrdeb) == 8)
{
if(no != 0)
{
dXhf=dXbf + (dMosaiqueResolution*(double) iMosaiqueNbcol);
dYhf=dYbf + (dMosaiqueResolution*(double) iMosaiqueNblig);
for(i=0;i < m_iNbLecture;i++)
{
if(m_ftabContrainte[i] == FINCONNU)
{
if(m_dtabX[i] >= dXbf && m_dtabX[i] <= dXhf && m_dtabY[i] >= dYbf &&
m_dtabY[i] <= dYhf)
{
ptr=ptrdeb + (((int) ((m_dtabY[i]dYbf)/dMosaiqueResolution))*iMosaiqueNbcol + (int) ((m_dtabX[i]dXbf)/dMosaiqueResolution))*iDatasize;
fseek(FileImage,ptr,SEEK_SET);
switch(iTypeAttribut)
{
case 1:
case 5:
case 6:
fread(&cValeur,iDatasize,1,FileImage);
if(cValeur != CINCONNU)m_ftabContrainte[i]=(float) cValeur;
break;
case 7:
fread(&sValeur,iDatasize,1,FileImage);
if(sValeur != SINCONNU)m_ftabContrainte[i]=(float) sValeur;
break;
case 9:
fread(&fValeur,iDatasize,1,FileImage);
if(fValeur != FINCONNU)m_ftabContrainte[i]=fValeur;
break;
default: break;
}
}
}
}
}
}

}
}
}
break;

fclose(FileImage);
fclose(FileFeuille);
}

default:
break;
}

Dans le cas de linterpolation barycentrique sur les voisins, la mthode


Barycalcul() effectue le calcul barycentrique sur les voisins qui ont t
prcdemment dtermins par la mthode Barycentre().
float CBabel::BaryCalcul(float fValeurContrainte)
{
int k;

404

Annexe

for(k=0;k < m_iNbVoisins;k++)


{
if(m_dtabDistance[k] <= 0.)return m_ftabValeurVoisin[k];
}
float fz=0.F;
double ds1,ds2,du;
ds1=0.;
ds2=0.;
if(m_bContrainte && fValeurContrainte > FINCONNU)
{
for(k=0;k < m_iNbVoisins;k++)
{
du=1./m_dtabDistance[k];
ds1+=du;
if(m_ftabContrainteVoisin[k] > FINCONNU)
{
ds2+=(((double)m_ftabValeurVoisin[k] +
m_dFacteurContrainte*(m_ftabContrainteVoisin[k]- fValeurContrainte))*du);
}
else ds2+=((double)m_ftabValeurVoisin[k]*du);
}
fz=(float) (ds2/ds1);
}
else
{
for(k=0;k < m_iNbVoisins;k++)
{
du=1./m_dtabDistance[k];
ds1+=du;
ds2+=((double)m_ftabValeurVoisin[k]*du);
}
fz=(float) (ds2/ds1);
}
return fz;
}

Dans le cas de linterpolation sur tous les points sans contrainte, le calcul est
effectu par la mthode PotentielCalcul(). Les points de rfrence pris en
compte sont filtrs sur la distance au point interpoler (m_dDistanceMax) lorsque
cette option a t choisie par lutilisateur (m_bDistanceMax) :
float CBabel::PotentielCalcul(double dXProj,double dYProj)
{
float fz=0.F;
switch(m_iInterpolation)
{
case INTERPOLATION_POTENTIEL: //--- barycentre sur tous les points
{
double ds1,ds2,du,dDistance;
ds1=0.;
ds2=0.;
if(m_bDistanceMax)
{
for(int i=0;i < m_iNbLecture;i++)
{
dDistance=sqrt((dXProj-m_dtabX[i])*(dXProj-m_dtabX[i]) + (dYProjm_dtabY[i])*(dYProj-m_dtabY[i]));
if(dDistance == 0.)
{
fz=m_ftabValeur[i];
return fz;
}
if(dDistance <= m_dDistanceMax)
{
du=1./dDistance;
ds1+=du;
ds2+=((double) m_ftabValeur[i]*du);
}
}
if(ds1 > 0.)fz=(float) (ds2/ds1);
else fz=FINCONNU;
}

Structures et mthodes : implmentation 405


else
{
for(int i=0;i < m_iNbLecture;i++)
{
dDistance=sqrt((dXProj-m_dtabX[i])*(dXProj-m_dtabX[i]) + (dYProjm_dtabY[i])*(dYProj-m_dtabY[i]));
if(dDistance == 0.)
{
fz=m_ftabValeur[i];
return fz;
}
du=1./dDistance;
ds1+=du;
ds2+=((double) m_ftabValeur[i]*du);
}
fz=(float) (ds2/ds1);
}
return fz;
}
break;
case INTERPOLATION_PLUSPROCHEVOISIN: //--- plus proche voisin
{
double dDistance,dDistanceMin;
fz=m_ftabValeur[0];
dDistanceMin=(dXProj-m_dtabX[0])*(dXProj-m_dtabX[0]) + (dYProj-m_dtabY[0])*(dYProjm_dtabY[0]);
for(int i=1;i < m_iNbLecture;i++)
{
dDistance=(dXProj-m_dtabX[i])*(dXProj-m_dtabX[i]) + (dYProj-m_dtabY[i])*(dYProjm_dtabY[i]);
if(dDistance <= dDistanceMin)
{
fz=m_ftabValeur[i];
dDistanceMin=dDistance;
}
}
return fz;
}
break;
case INTERPOLATION_SOMME:
{
int iNb=0;
float fSomme;
double dDistance;
fSomme=0.F;
for(int i=0;i < m_iNbLecture;i++)
{
dDistance=sqrt((dXProj-m_dtabX[i])*(dXProj-m_dtabX[i]) + (dYProj-m_dtabY[i])*(dYProjm_dtabY[i]));
if(dDistance <= m_dDistanceMax)
{
fSomme+=m_ftabValeur[i];
iNb++;
}
}
if(iNb == 0)fSomme=FINCONNU;
return fSomme;
}
break;
case INTERPOLATION_SOMME_DECROISSANTE:
{
int iNb=0;
float fSomme;
double dSomme,dDistance;
dSomme=0.;
for(int i=0;i < m_iNbLecture;i++)
{
dDistance=sqrt((dXProj-m_dtabX[i])*(dXProj-m_dtabX[i]) + (dYProj-m_dtabY[i])*(dYProjm_dtabY[i]));
if(dDistance <= m_dDistanceMax)
{
dSomme+=((double)m_ftabValeur[i]*(m_dDistanceMax - dDistance)/m_dDistanceMax);
iNb++;
}

406

Annexe
}
if(iNb == 0)fSomme=FINCONNU;
else fSomme=(float) dSomme;
return fSomme;
}
break;

case INTERPOLATION_MOYENNE:
{
int iNb=0;
float fSomme;
double dDistance;
fSomme=0.F;
for(int i=0;i < m_iNbLecture;i++)
{
dDistance=sqrt((dXProj-m_dtabX[i])*(dXProj-m_dtabX[i]) + (dYProj-m_dtabY[i])*(dYProjm_dtabY[i]));
if(dDistance <= m_dDistanceMax)
{
fSomme+=m_ftabValeur[i];
iNb++;
}
}
if(iNb == 0)fSomme=FINCONNU;
else fSomme/=iNb;
return fSomme;
}
break;
case INTERPOLATION_MOYENNE_DECROISSANTE:
{
int iNb=0;
float fSomme;
double dSomme,dDistance;
dSomme=0.;
for(int i=0;i < m_iNbLecture;i++)
{
dDistance=sqrt((dXProj-m_dtabX[i])*(dXProj-m_dtabX[i]) + (dYProj-m_dtabY[i])*(dYProjm_dtabY[i]));
if(dDistance <= m_dDistanceMax)
{
dSomme+=((double)m_ftabValeur[i]*(m_dDistanceMax - dDistance)/m_dDistanceMax);
iNb++;
}
}
if(iNb == 0)fSomme=FINCONNU;
else fSomme=(float) (dSomme/iNb);
return fSomme;
}
break;
default:
break;
}
return fz;
}

A.2.2. Algorithmique graphique


A.2.2.1. La classe CArc
La classe CArc reprsente un objet de type arc; les points sont conservs dans un
tableau m_tpoint, allou dynamiquement lors de la cration de lobjet arc :
class CArc
{
private:
int m_iNbpt;
int m_iNz1;

Structures et mthodes : implmentation 407


int m_iNz2;
int m_Ptrsuiv;
float m_fXmin,m_fYmin,m_fXmax,m_fYmax;
float* m_tpoint;
public:
CArc();
~CArc();
int GetPtrSuivant() {return m_Ptrsuiv;};
int GetNbpt() {return m_iNbpt;};
void SetNbpt(int iNbpt) {m_iNbpt=iNbpt;};
void GetPoint(int i,float &fX,float &fY) {fX=m_tpoint[(i-1)*2]; fY=m_tpoint[(i-1)*2+1];};
void SetPoint(int i,float fX,float fY) {m_tpoint[(i-1)*2]=fX; m_tpoint[(i-1)*2+1]=fY;};
void LireEntete(FILE* FileArc,int ptr,int& iNz1,int& iNz2,int& ptrSuivant);
void LireFenetre(FILE* FileArc,int ptr);
int LireNbpt(FILE* FileArc,int ptr);
void LirePoints(FILE* FileArc,int ptr);
void LireBout(FILE* FileArc,int ptr,float &fX1,float &fY1,float &fX2,float &fY2);
void GetFenetre(FILE* FileArc,int ptr,float& fX1,float& fY1,float& fX2,float& fY2);
int Ecrire(FILE* FileArc,int iNz1,int iNz2,int iPtr);
BOOL Intersect(float fX1,float fY1,float fX2,float fY2);
BOOL IntersectMasque(CCadre* pCadre,unsigned char *itabImage);
void Filtre(CCadre* pCadre,double dSurfaceMinimum);
void Douglas(CCadre* pCadre,double dDistanceMinimum,int iNo1,int iNo2);
void FinDouglas();
void Tracer(CDC* pDC,CCadre* pCadre);
void Tracer(CDC* pDC,CCadre* pCadre,int iType);
void Imprimer(CDC* pDC,CCadre* pCadre,BOOL bSens);
void Chainer(CDC* pDC,CCadre* pCadre,BOOL bSens,int& iNbptTotal,LPPOINT tabPoint);
void Chainer(CCadre* pCadre,BOOL bSens,int& iNbptTotal,int& iNbptPolygon,double*
dtabPoints);
double DistanceAUnPoint(CCadre* pCadre,double dX,double dY);
double DistanceAUnPoint(float fXSav,float fYSav);
double Longueur(CCadre* pCadre);
void CalculCentroide(float &fX,float &fY);
void CalculBBox(CDC* pDC,CCadre* pCadre,int &iXb,int &iYb,int &iXh,int &iYh);
void CalculBBox(CCadre* pCadre,double &dXbProj,double &dYbProj,double &dXhProj,double
&dYhProj);
void Draw(CCadre* pCadre,unsigned char *itabImage,unsigned char iValeur);
void Draw(CCadre* pCadre,int *itabImage,int iValeur);
void Draw(CCadre* pCadre,float fValeur,CBabel* pBabel);
void Draw0(CCadre* pCadre,unsigned char *itabImage,unsigned char iValeur);
void Draw0(CCadre* pCadre,float *ftabImage,int *itabNombre,float fValeur,int iNbcol, int
iNblig);
};

Voici par exemple la procdure de recherche de lintersection dun arc avec un


segment. La procdure utilise une autre procdure globale qui recherche
lintersection de deux segments de droite (A.2.2.5) :
BOOL CArc::IntersectionAvecUnSegment(double dX1Seg,double dY1Seg,double dX2Seg,double
dY2Seg,double& dXRes,double& dYRes)
{
dXRes=0.;
dYRes=0.;
//--- tester l'intersection du segment avec la fentre de larc
::Ordonner(dX1Seg,dX2Seg);
::Ordonner(dY1Seg,dY2Seg);
if(Intersect(dX1Seg,dY1Seg,dX2Seg,dY2Seg) == FALSE)return FALSE;
//--- tester l'intersection de l'arc et du segment
double dX1,dY1,dX2,dY2;
for(int i=1;i < m_iNbpt;i++)
{
GetPoint(i-1,dX1,dY1);
GetPoint(i,dX2,dY2);
if(SegmentIntersection(dX1Seg,dY1Seg,dX2Seg,dY2Seg,dX1,dY1,dX2,dY2,dXRes,dYRes))return
TRUE;
}
return FALSE;
}

408

Annexe

La mthode Draw() permet de dessiner un arc dans un tableau matriciel. Cette


procdure est notamment utilise dans linterpolation pour charger les points de
rfrences dans la matrice de limagette calculer :
void CArc::Draw(CCadre* pCadre,float fValeur,CBabel* pBabel)
{
int ipt,nbpix,iX,iY,iXp,iYp,nb;
int iNbcol,iNblig;
float fX,fY;
double dCosinus,dSinus,dDistance,dR;
double dXProj,dYProj,dXa,dYa,dXb,dYb,dX,dY;
iNbcol=pBabel->GetNbcol();
iNblig=pBabel->GetNblig();
fX=m_tpoint[0];
fY=m_tpoint[1];
pCadre->SavToProj(fX,fY,dXProj,dYProj);
pBabel->ProjToImagette(dXProj,dYProj,dXa,dYa);
iX=(int) dXa;
iY=(int) dYa;
if(iX >= 0 && iX < iNbcol && iY >= 0 && iY < iNblig)
{
if(pBabel->m_bMoyenne)
{
pBabel->m_ftabImagette[iX+(iY*iNbcol)]+=fValeur;
pBabel->m_itabNombre[iX+(iY*iNbcol)]++;
}
else
{
if(pBabel->m_ctabData[iX+(iY*iNbcol)] == 0)
{
pBabel->m_ftabImagette[iX+(iY*iNbcol)]+=fValeur;
pBabel->m_itabNombre[iX+(iY*iNbcol)]++;
}
}
}
iXp=iX;
iYp=iY;
ipt=1;
int j=2;
while(ipt < m_iNbpt)
{
fX=m_tpoint[j];
fY=m_tpoint[j+1];
j+=2;
pCadre->SavToProj(fX,fY,dXProj,dYProj);
pBabel->ProjToImagette(dXProj,dYProj,dXb,dYb);
dX=dXb-dXa;
dY=dYb-dYa;
dDistance=sqrt(dX*dX + dY*dY);
if(dDistance > 0.)
{
dCosinus=dX/dDistance;
dSinus=dY/dDistance;
nbpix=int(dDistance);
nb=1;
while(nb < nbpix)
{
dR=(double) nb;
iX=(int) (dXa + dR*dCosinus);
iY=(int) (dYa + dR*dSinus);
if(iX != iXp || iY != iYp)
{
if(iX >= 0 && iX < iNbcol && iY >= 0 && iY < iNblig)
{
if(pBabel->m_bMoyenne)
{
pBabel->m_ftabImagette[iX+(iY*iNbcol)]+=fValeur;
pBabel->m_itabNombre[iX+(iY*iNbcol)]++;
}
else
{
if(pBabel->m_ctabData[iX+(iY*iNbcol)] == 0)
{
pBabel->m_ftabImagette[iX+(iY*iNbcol)]+=fValeur;
pBabel->m_itabNombre[iX+(iY*iNbcol)]++;
}

Structures et mthodes : implmentation 409

}
}
iXp=iX;
iYp=iY;
}
nb++;
}
iX=(int) dXb;
iY=(int) dYb;
if(iX != iXp || iY != iYp)
{
if(iX >= 0 && iX < iNbcol && iY >= 0 && iY < iNblig)
{
if(pBabel->m_bMoyenne)
{
pBabel->m_ftabImagette[iX+(iY*iNbcol)]+=fValeur;
pBabel->m_itabNombre[iX+(iY*iNbcol)]++;
}
else
{
if(pBabel->m_ctabData[iX+(iY*iNbcol)] == 0)
{
pBabel->m_ftabImagette[iX+(iY*iNbcol)]+=fValeur;
pBabel->m_itabNombre[iX+(iY*iNbcol)]++;
}
}
}
}
}
dXa=dXb;
dYa=dYb;
ipt++;
}

A.2.2.2. Les classes CCellule et CYX


Les classes CCellule et CYX sont utilises pour les procdures de rasterisation.
Un objet CCellule reprsente une cellule dun chanage, et conserve une
coordonne (m_iX), ainsi que les codes gauche et droite du point sur la ligne
chane. Les cellules peuvent tre chanes grce la variable m_ptrSuivant. La
classe CYX contient un tableau de pointeurs de cellules : chaque pointeur
correspond la premire cellule dune ligne horizontale.
class CCellule
{
public:
int m_iX;
int m_iCode1;
int m_iCode2;
CCellule* m_ptrSuivant;
public:
CCellule();
};
class CYX
{
private:
CCadre* m_pCadre;
CCellule* m_Y[NB_MAX_DEFY];
int m_iNoth;
void YX(char *chNomFichierImage);
void Points(FILE* FileArc,int iNbarc,int iPtrarc,int *itabZone,int iNzMax);
void InsererCellule(int iY,int iX,int iCode1,int iCode2);
public:
CYX(CCadre* pCadre);
~CYX();
void Rasteriser(int iNoth);
void RasteriserParAttribut(int iNoth,int iNoatt,int* itabImage);
void MasqueRasteriser(char *chNomFichierMasque,char *chNomFichierImage);

410

Annexe

};

La procdure Points() calcule lintersection des arcs de la relation avec les


lignes horizontales et cre le chanage des points par ligne. La procdure YX()
calcule le fichier image partir du chanage par ligne. Voici limplmentation des
principales procdures de cette classe :
void CYX::Points(FILE* FileArc,int iNbarc,int iPtrarc,int *itabZone,int iNzMax)
{
int i;
int iCode1,iCode2,iX,iXb,iXh,iYb,iYh;
int ligsup,iNb,iNbpt,nocol,nolig,iNz1,iNz2;
int ptr,ptrSuivant;
float fPx1,fPy1,fPx2,fPy2,fP,fX,fY;
CArc arc;
int iXMaximum=config.m_iDefX-1;
ptr=iPtrarc;
iNb=0;
while(iNb < iNbarc)
{
arc.LireEntete(FileArc,ptr,iNz1,iNz2,ptrSuivant);
if(iNz1 <= iNzMax)iCode1=itabZone[iNz1]; else iCode1=0;
if(iNz2 <= iNzMax)iCode2=itabZone[iNz2]; else iCode2=0;
if(iCode1 != iCode2)
{
arc.LirePoints(FileArc,ptr);
arc.GetPoint(1,fX,fY);
m_pCadre->SavToRas(fX,fY,fPx1,fPy1);
iNbpt=arc.GetNbpt();
i=2;
while(i <= iNbpt)
{
fPx2=fPx1;
fPy2=fPy1;
arc.GetPoint(i,fX,fY);
m_pCadre->SavToRas(fX,fY,fPx1,fPy1);
if(fPy1 < fPy2)
{
iXb=(int) (fPx1+0.5);
iYb=(int) fPy1;
iXh=(int) (fPx2+0.5);
iYh=(int) fPy2;
}
else
{
iXb=(int) (fPx2+0.5);
iYb=(int) fPy2;
iXh=(int) (fPx1+0.5);
iYh=(int) fPy1;
}
if(iYh != iYb)
{
if(iYb >= 0 && iYb < config.m_iDefY)
{
nocol=__max(0,__min(iXMaximum,iXb));
InsererCellule(iYb,nocol,iCode1,iCode2);
}
fP=(float)(iXh-iXb)/(float)(iYh-iYb);
fX=(float)iXb+fP;
nolig=iYb+1;
ligsup=__min(config.m_iDefY,iYh);
if(nolig < ligsup)
{
while(nolig < 0)
{
fX+=fP;
nolig++;
}
while(nolig < ligsup)
{
iX=(int) (fX+0.5);
nocol=__max(0,__min(iXMaximum,iX));

Structures et mthodes : implmentation 411

}
i++;
}

InsererCellule(nolig,nocol,iCode1,iCode2);
nolig++;
fX+=fP;
}

}
ptr=ptrSuivant;
iNb++;
}

void CYX::YX(char *chNomFichierImage)


{
FILE *FileImage;
CCellule *ptr;
int i,iC,recherche;
int iCode,iCode1,iCode2;
int iXc,iXp,iXs,iSegment,iNbpt;
int multiple[1000];
FileImage=fopen(chNomFichierImage,"wb");
if(FileImage == NULL)return;
int iXMaximum=config.m_iDefX-1;
int ilig=0;
while(ilig < config.m_iDefY)
{
ptr=m_Y[ilig];
if(ptr == 0)
{
//--- ligne vide
iCode=0;
fprintf(FileImage,"%d %d\n",iCode,config.m_iDefX);
}
else
{
//--- calcul des segments
iCode=0;
iSegment=0;
iNbpt=0;
iXc=ptr->m_iX;
iCode1=ptr->m_iCode1;
iCode2=ptr->m_iCode2;
if(iXc > 0)
{
fprintf(FileImage,"%d %d\n",iCode,iXc);
iNbpt+=iXc;
}
iC=1;
multiple[1]=0;
iXp=iXc;
do
{
//--- repeat tant qu'il y a des points dans la ligne
do
{
//--- repeat tant qu'il y a des points confondus
i=1;
recherche=1;
while(i <= iC && recherche)
{
if(iCode1 != multiple[i])i++;
else
{
recherche=0;
while(i < iC)
{
multiple[i]=multiple[i+1];
i++;
}
iC--;
}
}
if(recherche)
{
iC++;

412

Annexe
multiple[iC]=iCode1;
}
i=1;
recherche=1;
while(i <= iC && recherche)
{
if(iCode2 != multiple[i])i++;
else
{
recherche=0;
while(i < iC)
{
multiple[i]=multiple[i+1];
i++;
}
iC--;
}
}
if(recherche)
{
iC++;
multiple[iC]=iCode2;
}
ptr=ptr->m_ptrSuivant;
if(ptr != 0)
{
iXs=ptr->m_iX;
iCode1=ptr->m_iCode1;
iCode2=ptr->m_iCode2;
}
}
while(ptr != 0 && iXs == iXc);
if(ptr != 0)
{
//--- determiner le code sortant
if(iC == 1)
{
iCode=multiple[1];
iSegment=iXs-iXp;
if(iXs == iXMaximum)iSegment++;
fprintf(FileImage,"%d %d\n",iCode,iSegment);
iNbpt+=iSegment;
iC=1;
iXp=iXs;
}
iXc=iXs;
}
}
while(ptr != 0);

if(iNbpt < config.m_iDefX)


{
iCode=0;
iSegment=config.m_iDefX-iNbpt;
fprintf(FileImage,"%d %d\n",iCode,iSegment);
}
}
ilig++;
}
fclose(FileImage);
}
void CYX::InsererCellule(int iY,int iX,int iCode1,int iCode2)
{
CCellule* ptrNew;
CCellule* ptrTete;
//--- creation d'une cellule
ptrNew=new CCellule();
ptrNew->m_iX=iX;
ptrNew->m_iCode1=iCode1;
ptrNew->m_iCode2=iCode2;
ptrTete=m_Y[iY];
if(ptrTete == 0)
{
//--- premier lment de la ligne
m_Y[iY]=ptrNew;

Structures et mthodes : implmentation 413


ptrNew->m_ptrSuivant=0;
}
else
{
//--- insertion
if(ptrTete->m_iX > iX)
{
ptrNew->m_ptrSuivant=ptrTete;
m_Y[iY]=ptrNew;
}
else
{
CCellule* ptr;
CCellule* ptrPred;

ptrPred=ptrTete;
ptr=ptrTete->m_ptrSuivant;
while(ptr > 0)
{
if(ptr->m_iX <= iX)
{
ptrPred=ptr;
ptr=ptr->m_ptrSuivant;
}
else break;
}
//--- chainage
ptrNew->m_ptrSuivant=ptr;
ptrPred->m_ptrSuivant=ptrNew;
}

A.2.2.3. la classe CVectoriser


La classe CVectoriser permet de raliser lopration inverse de la
rasterisation. Elle cre des arcs partir dune image raster :
class CVectoriser
{
private:
CCadre* m_pCadre;
int m_iNoth;
int m_iNbObjets;
int m_iNbArcCree;
int m_iPtrlib;
char m_chNomFichierArc[_MAX_PATH];
int *m_itabImage;
unsigned char *m_ctabSegment;
float* m_ligx;
float* m_ligy;
int m_iNbpoint;
FILE* m_FileArc;
BOOL m_bPasDePixelsIsoles;
int SegmentType(int iX,int iY);
void CreationDesArcs(void);
void EcrireUneLigne(int iNza,int iNzb);
public:
CVectoriser(CCadre* pCadre,BOOL bPasDePixelsIsoles);
~CVectoriser();
int GetNbarc() {return m_iNbArcCree;};
};

BOOL Relation(int iNoth);

Par exemple, la procdure SegmentType() permet dinitialiser les valeurs de


chaque configuration de quatre pixel adjacents :
int CVectoriser::SegmentType(int iX,int iY)
{
int iIndice;
int iType;
int iNz1,iNz2,iNz3,iNz4;

414

Annexe

iIndice=iY*config.m_iDefX+iX;
iNz1=m_itabImage[iIndice];
iNz2=m_itabImage[iIndice+1];
iIndice+=config.m_iDefX;
iNz3=m_itabImage[iIndice];
iNz4=m_itabImage[iIndice+1];
if(iNz1 == iNz2
else if(iNz1 ==
else if(iNz1 ==
else if(iNz1 ==
else if(iNz2 ==
else if(iNz1 ==
else if(iNz1 ==
else if(iNz1 ==
else if(iNz1 ==
else if(iNz1 ==
else if(iNz1 ==
else if(iNz3 ==
else if(iNz2 ==
else if(iNz2 ==
else iType=13;

&& iNz1 == iNz3


iNz2 && iNz1 ==
iNz2 && iNz1 ==
iNz3 && iNz1 ==
iNz3 && iNz2 ==
iNz2 && iNz3 ==
iNz3 && iNz2 ==
iNz4 && iNz2 ==
iNz2)iType=5;
iNz3)iType=6;
iNz4)iType=7;
iNz4)iType=8;
iNz3)iType=9;
iNz4)iType=10;

&& iNz1 == iNz4)iType=0;


iNz4)iType=1;
iNz3)iType=2;
iNz4)iType=3;
iNz4)iType=4;
iNz4)iType=11;
iNz4)iType=12;
iNz3)iType=13;

return iType;
}

Le code de la procdure CreationDesArcs() est trs long, car le programme


teste toutes les configurations possibles. En voici un extrait :
int iDefX=config.m_iDefX-1;
int iDefY=config.m_iDefY-1;
ilig=0;
while(ilig < iDefY)
{
icol=0;
while(icol < iDefX)
{
iIndiceDebut=icol+(config.m_iDefX*ilig);
iseg=m_ctabSegment[iIndiceDebut];
if(iseg != 0)
{
//--- un segment non chaine, dbut d'une ligne, initialisation
icol1=icol;
ilig1=ilig;
icol2=icol;
ilig2=ilig;
col=(float)icol;
lig=(float)ilig;
icote1=0;
icote2=0;
fin1=0;
fin2=1;
switch(iseg)
{
case 1:
iType=SegmentType(icol,ilig);
if(iType == 1 || iType == 7 || iType == 10)
{
x0=col;
y0=lig+0.5F;
xc=col+0.5F;
yc=lig+1.F;
icote1=2;
ilig1++;
if(ilig1 >= iDefY)fin1=1;
fin2=1;
iNz1=m_itabImage[iIndiceDebut+config.m_iDefX];
iNz2=m_itabImage[iIndiceDebut+config.m_iDefX+1];
}
else if(iType == 5)
{
x0=col;
y0=lig+0.5F;
xc=col+0.5F;
yc=lig+1.F;
fin1=1;
iNz1=m_itabImage[iIndiceDebut];

Structures et mthodes : implmentation 415


iNz2=m_itabImage[iIndiceDebut+config.m_iDefX];
}
m_ctabSegment[iIndiceDebut]=0;
break;
case 2:
iType=SegmentType(icol,ilig);
if(iType == 2 || iType == 9)
{
x0=col+0.5F;
y0=lig+1.F;
xc=col+1.F;
yc=lig+0.5F;
icote1=1;
icol1++;
if(icol1 >= iDefX)fin1=1;
iNz1=m_itabImage[iIndiceDebut+1];
iNz2=m_itabImage[iIndiceDebut+1+config.m_iDefX];
icote2=2;
ilig2++;
fin2=0;
if(ilig2 >= iDefY)fin2=1;
}
else if(iType == 5)
{
x0=col+0.5F;
y0=lig+1.F;
xc=col+1.F;
yc=lig+0.5F;
icote1=1;
icol1++;
if(icol1 >= iDefX)fin1=1;
iNz1=m_itabImage[iIndiceDebut+1];
iNz2=m_itabImage[iIndiceDebut+1+config.m_iDefX];
}
else if(iType == 6)
{
x0=col+1.F;
y0=lig+0.5F;
xc=col+0.5F;
yc=lig+1.F;
icote1=2;
ilig1++;
if(ilig1 >= iDefY)fin1=1;
iNz1=m_itabImage[iIndiceDebut+config.m_iDefX];
iNz2=m_itabImage[iIndiceDebut+1+config.m_iDefX];
}
m_ctabSegment[iIndiceDebut]=0;
break;

case 26:
x0=col+0.5F;
y0=lig;
xc=col+0.5F;
yc=lig+0.5F;
fin1=1;
iNz1=m_itabImage[iIndiceDebut];
iNz2=m_itabImage[iIndiceDebut+1];
m_ctabSegment[iIndiceDebut]=0;
break;
case 27:
x0=col;
y0=lig+0.5F;
xc=col+0.5F;
yc=lig+0.5F;
fin1=1;
iNz1=m_itabImage[iIndiceDebut];
iNz2=m_itabImage[iIndiceDebut+config.m_iDefX];
m_ctabSegment[iIndiceDebut]=0;
break;
default:
break;
}
iNza=19+iNz1;
iNzb=19+iNz2;
nbpt1=0;
lig1x[nbpt1]=x0;
lig1y[nbpt1]=y0;

416

etc.

Annexe
nbpt1++;
//--- fin initialisation de la ligne, debut chainage avant
while(fin1 == 0)
{
iIndice=icol1+(ilig1*config.m_iDefX);
iseg=m_ctabSegment[iIndice];
if(iseg == 0)fin1=1;
else
{
col=(float)icol1;
lig=(float)ilig1;
switch(icote1)
{
case 1: //--- icote1
switch(iseg)
{
case 1: //--- iseg
iType=SegmentType(icol1,ilig1);
if(iType == 1 || iType == 7)
{
m_ctabSegment[iIndice]=0;
lig1x[nbpt1]=xc;
lig1y[nbpt1]=yc;
nbpt1++;
xc=col+0.5F;
yc=lig+1.F;
icote1=2;
ilig1++;
}
else if(iType == 5)
{
m_ctabSegment[iIndice]=0;
lig1x[nbpt1]=xc;
lig1y[nbpt1]=yc;
nbpt1++;
xc=col+0.5F;
yc=lig+1.F;
fin1=1;
}
else if(iType == 10)fin1=1;
break;
case 4: //--- iseg
iType=SegmentType(icol1,ilig1);
if(iType == 4 || iType == 9)
{
m_ctabSegment[iIndice]=0;
lig1x[nbpt1]=xc;
lig1y[nbpt1]=yc;
nbpt1++;
xc=col+0.5F;
yc=lig;
icote1=4;
ilig1--;
}
else if(iType == 8)
{
m_ctabSegment[iIndice]=0;
lig1x[nbpt1]=xc;
lig1y[nbpt1]=yc;
nbpt1++;
xc=col+0.5F;
yc=lig;
fin1=1;
}
else if(iType == 10)fin1=1;
break;

Le programme teste ainsi lensemble des configurations possibles en fonction du


segment prcdent, du segment courant, et du type temporaire de segment. Il avance
ainsi de segment en segment ou sarrte sil rencontre un nud. La recherche est
effectue dans les deux sens. Il passe la cration dun nouvel arc sil reste encore
des segments non chans dans limage.

Structures et mthodes : implmentation 417


A.2.2.4. DilaterImage()
Cette fonction globale permet de crer un masque en dilatant une image de
iDistancePixel pixels :
void DilaterImage(int* itabImage,int iDistancePixel,unsigned char* ctabMasque)
{
int* itabNewImage=(int *) malloc(config.m_iDefX*config.m_iDefY*sizeof(int));
if(itabNewImage == NULL)
{
::ErreurDeMemoire();
return;
}
//--- existence du masque
BOOL bMasque=TRUE;
if(ctabMasque == NULL)bMasque=FALSE;
if(iDistancePixel > 200)iDistancePixel=200;
//--- prparation des pixels de la recherche
int i,j,ilig,icol,iligAuCarre,iD;
int iDistancePixelAuCarre=iDistancePixel*iDistancePixel;
int iNbPixels=(2*iDistancePixel+1)*(2*iDistancePixel+1);
int iSizeElement=3*sizeof(int);
unsigned char* ctabElements=(unsigned char *) malloc(iNbPixels*iSizeElement);
if(ctabElements == NULL)
{
::ErreurDeMemoire();
free(itabNewImage);
return;
}
//--- tableau non tri des pixels
int iNbElements=0;
j=0;
for(ilig=-iDistancePixel;ilig <= iDistancePixel;ilig++)
{
iligAuCarre=ilig*ilig;
for(icol=-iDistancePixel;icol <= iDistancePixel;icol++)
{
iD=iligAuCarre + icol*icol;
if(iD > 0 && iD <= iDistancePixelAuCarre)
{
//--- ajouter au tableau trier
memcpy(&ctabElements[j],&iD,sizeof(int));
j+=sizeof(int);
memcpy(&ctabElements[j],&icol,sizeof(int));
j+=sizeof(int);
memcpy(&ctabElements[j],&ilig,sizeof(int));
j+=sizeof(int);
iNbElements++;
}
}
}
//--- tri sur la distance
qsort(ctabElements,iNbElements,iSizeElement,comparnumDistance);
//--- traitement
int iCode,iCodeARemplir;
unsigned char cCodeMasque=1;
int iX,iY,iX0,iY0,iIndice;
iCodeARemplir=0;
iY=0;
while(iY < config.m_iDefY)
{
iIndice=iY*config.m_iDefX;
iX=0;
while(iX < config.m_iDefX)
{
iCode=itabImage[iIndice];
if(bMasque)cCodeMasque=ctabMasque[iIndice];
if(iCode == iCodeARemplir && cCodeMasque == 1)
{
j=0;

418

Annexe
for(i=0;i < iNbElements;i++)
{
j+=sizeof(int);
memcpy(&iX0,&ctabElements[j],sizeof(int));
j+=sizeof(int);
memcpy(&iY0,&ctabElements[j],sizeof(int));
j+=sizeof(int);
icol=iX+iX0;
ilig=iY+iY0;
if(ilig >= 0 && ilig < config.m_iDefY && icol >= 0 && icol < config.m_iDefX)
{
iCode=itabImage[ilig*config.m_iDefX + icol];
if(iCode != iCodeARemplir)break;
}
}
}
itabNewImage[iIndice]=iCode;
iX++;
iIndice++;
}
iY++;
}

iNbPixels=config.m_iDefX*config.m_iDefY;
memcpy(itabImage,itabNewImage,iNbPixels*sizeof(int));
free(ctabElements);
free(itabNewImage);
}

A.2.2.5. SegmentIntersection()
La procdure SegmentIntersection() teste lintersection de deux segments
et calcule les coordonnes de lintersection si elle existe. Elle est utilise dans de
nombreuses procdures faisant intervenir les arcs dcrivant des zones ou des lignes.
Lorsquil y a intersection possible des deux segments, le calcul est effectu en
changeant de repre pour aligner lun des segment avec laxe des abscisses.
BOOL SegmentIntersection(double dX1,double dY1,double dX2,double dY2,double dX3,double
dY3,double dX4,double dY4,double& dXRes,double& dYRes)
{
double dPx1,dPx2,dPx3,dPx4;
double dPy1,dPy2,dPy3,dPy4;
double dF1xmin,dF1xmax,dF2xmin,dF2xmax,dF1ymin,dF1ymax,dF2ymin,dF2ymax;
//--- si deux extremits sont gales, retourner FALSE
//if(dX1 == dX3 && dY1 == dY3)return FALSE;
//if(dX1 == dX4 && dY1 == dY4)return FALSE;
//if(dX2 == dX3 && dY2 == dY3)return FALSE;
//if(dX2 == dX4 && dY2 == dY4)return FALSE;
if(dX1 == dX2 && dY1 == dY2)return FALSE;
if(dX3 == dX4 && dY3 == dY4)return FALSE;
//--- ordonner le premier segment en y et calculer sa fentre
dXRes=0.;
dYRes=0.;
if(dY1 < dY2)
{
dPx1=dX1;
dPy1=dY1;
dPx2=dX2;
dPy2=dY2;
dF1ymin=dY1;
dF1ymax=dY2;
if(dX1 <= dX2)
{
dF1xmin=dX1;
dF1xmax=dX2;
}
else
{
dF1xmin=dX2;
dF1xmax=dX1;
}
}

Structures et mthodes : implmentation 419


else if(dY1 > dY2)
{
dPx1=dX2;
dPy1=dY2;
dPx2=dX1;
dPy2=dY1;
dF1ymin=dY2;
dF1ymax=dY1;
if(dX1 <= dX2)
{
dF1xmin=dX1;
dF1xmax=dX2;
}
else
{
dF1xmin=dX2;
dF1xmax=dX1;
}
}
else if(dY1 == dY2)
{
if(dX1 <= dX2)
{
dPx1=dX1;
dPy1=dY1;
dPx2=dX2;
dPy2=dY2;
dF1xmin=dX1;
dF1xmax=dX2;
}
else
{
dPx1=dX2;
dPy1=dY2;
dPx2=dX1;
dPy2=dY1;
dF1xmin=dX2;
dF1xmax=dX1;
}
dF1ymin=dY1;
dF1ymax=dY2;
}
//--- ordonner le second segment
if(dY3 < dY4)
{
dPx3=dX3;
dPy3=dY3;
dPx4=dX4;
dPy4=dY4;
dF2ymin=dY3;
dF2ymax=dY4;
if(dX3 <= dX4)
{
dF2xmin=dX3;
dF2xmax=dX4;
}
else
{
dF2xmin=dX4;
dF2xmax=dX3;
}
}
else if(dY3 > dY4)
{
dPx3=dX4;
dPy3=dY4;
dPx4=dX3;
dPy4=dY3;
dF2ymin=dY4;
dF2ymax=dY3;
if(dX3 <= dX4)
{
dF2xmin=dX3;
dF2xmax=dX4;
}
else
{
dF2xmin=dX4;
dF2xmax=dX3;
}

420

Annexe

}
else if(dY3 == dY4)
{
if(dX3 <= dX4)
{
dPx3=dX3;
dPy3=dY3;
dPx4=dX4;
dPy4=dY4;
dF2xmin=dX3;
dF2xmax=dX4;
}
else
{
dPx3=dX4;
dPy3=dY4;
dPx4=dX3;
dPy4=dY3;
dF2xmin=dX4;
dF2xmax=dX3;
}
dF2ymin=dY3;
dF2ymax=dY4;
}
if(dF1xmax > dF2xmin && dF2xmax > dF1xmin && dF1ymax > dF2ymin && dF2ymax > dF1ymin)
{
//--- test d'intersection
double dP1P2=sqrt((dPx2-dPx1)*(dPx2-dPx1) + (dPy2-dPy1)*(dPy2-dPy1));
if(dP1P2 == 0.)return FALSE;
double cosTeta=(dPx2-dPx1)/dP1P2;
double sinTeta=(dPy2-dPy1)/dP1P2;
dX2=(dPx2-dPx1)*cosTeta+(dPy2-dPy1)*sinTeta;
dX3=(dPx3-dPx1)*cosTeta+(dPy3-dPy1)*sinTeta;
dY3=-(dPx3-dPx1)*sinTeta+(dPy3-dPy1)*cosTeta;
dX4=(dPx4-dPx1)*cosTeta+(dPy4-dPy1)*sinTeta;
dY4=-(dPx4-dPx1)*sinTeta+(dPy4-dPy1)*cosTeta;
double dYmin,dYmax;
if(dY3 < dY4)
{
dYmin=dY3;
dYmax=dY4;
}
else
{
dYmin=dY4;
dYmax=dY3;
}
if(dY3 == dY4)
{
if(dY3 == 0)
{
Ordonner(dX3,dX4);
if(dX3 >= dX2)return FALSE;
if(dX4 <= 0.)return FALSE;
dXRes=dX3*cosTeta + dPx1;
dYRes=dX3*sinTeta + dPy1;
return TRUE;
}
else return FALSE;
}
if(dYmin >= 0.)return FALSE;
if(dYmax <= 0.)return FALSE;
if(dX3 == dX4)
{
//--- parallle l'axe des Y
if(dX3 <= 0.)return FALSE;
if(dX3 >= dX2)return FALSE;
//--- rotation inverse pour le resultat
dXRes=dX3*cosTeta + dPx1;
dYRes=dX3*sinTeta + dPy1;
return TRUE;
}
else
{
//--- point d'intersection avec l'axe des X
double dX=dX3-(dY3*(dX4-dX3)/(dY4-dY3));

Structures et mthodes : implmentation 421


if(dX <= 0.)return FALSE;
if(dX >= dX2)return FALSE;
//--- rotation inverse pour le resultat
dXRes=dX*cosTeta + dPx1;
dYRes=dX*sinTeta + dPy1;
return TRUE;
}

}
return FALSE;
}

A.2.2.6. Les classes CZone et CTache


Les classes CZone et CTache permettent, pour les zones, de passer dune
reprsentation par arc frontire une reprsentation par arcs chans. Une tache
reprsente le contour dun polygone. Une zone est un ensemble de polygones. Les
taches dune mme zone peuvent tre imbriques et la principale difficult du
chanage consiste dterminer cette imbrication uniquement partir des arcs
frontires.
class CTache
{
private:
int m_iNbpt;
int m_iIndex;
int m_iPere;
double m_dSurface;
double m_dXMin;
double m_dYMin;
double m_dXMax;
double m_dYMax;
CZone* m_pZone;
public:
CTache(CZone* pZone,int iIndex,int iNbpt);
BOOL BoundingBox(double& dXMin,double& dYMin,double& dXMax,double& dYMax);
BOOL IsPointInside(double dX,double dY);
void CalculCentroide(double &dX,double &dY);
BOOL GetPointInterieur(double &dX,double &dY);
void SetPere(int iPere) {m_iPere=iPere;};
int GetNbpt() {return m_iNbpt;};
int GetIndex() {return m_iIndex;};
int GetPere() {return m_iPere;};
double GetSurface() {return m_dSurface;};
void GetBB(double& dXMin,double& dYMin,double& dXMax,double& dYMax)
{
dXMin=m_dXMin;
dYMin=m_dYMin;
dXMax=m_dXMax;
dYMax=m_dYMax;
return;
};
void ChangerLeSens();
double Surface();
};
class CZone
{
private:
FILE* m_FileArc;
CCadre* m_pCadre;
int m_iNbArc;
int* m_itabPtrArc;
int m_iNz;
int m_iNbTaches;
int m_iNbptTotal;
public:
CTache* m_ptabTache[NB_MAX_TACHES];
double *m_dtabPoints;
private:
public:

422

Annexe
CZone();
~CZone();
BOOL Init(CCadre* pCadre,FILE* FileArc,int iNbarcDeLaZone,int* itabPtr);
BOOL BoundingBox(double& dXMin,double& dYmin,double& dXMax,double& dYmax);
BOOL Chainer();
int NbptTotal();
int GetNbTaches() {return m_iNbTaches;};
void Desalloc();
};

Voici limplmentation de la procdure Chainer() qui cre le chanage des arcs


appartenant une zone, partir de lensemble des arcs de la relation. Cette
procdure est notamment utilise pour exporter en format ShapeFile (ArcView) des
donnes graphiques SAVANE.
BOOL CZone::Chainer()
{
m_iNbTaches=0;
m_iNbptTotal=0;
//--- chainage par tache
double* dtabX1=(double *)
double* dtabY1=(double *)
double* dtabX2=(double *)
double* dtabY2=(double *)

malloc(sizeof(double)*m_iNbArcZone);
malloc(sizeof(double)*m_iNbArcZone);
malloc(sizeof(double)*m_iNbArcZone);
malloc(sizeof(double)*m_iNbArcZone);

BOOL *btabLibre=(BOOL *) malloc(sizeof(BOOL)*m_iNbArcZone);


BOOL *btabSens=(BOOL *) malloc(sizeof(int)*m_iNbArcZone);
int *itabArcDeLaTache=(int *) malloc(sizeof(int)*m_iNbArcZone);
//--- vrification des allocations mmoire
if(dtabX1 == NULL || dtabY1 == NULL || dtabX2 == NULL || dtabY2 == NULL || btabLibre == NULL
|| btabSens == NULL || itabArcDeLaTache == NULL)
{
if(dtabX1 != NULL)free(dtabX1);
if(dtabY1 != NULL)free(dtabY1);
if(dtabX2 != NULL)free(dtabX2);
if(dtabY2 != NULL)free(dtabY2);
if(btabLibre != NULL)free(btabLibre);
if(btabSens != NULL)free(btabSens);
if(itabArcDeLaTache != NULL)free(itabArcDeLaTache);
return FALSE;
}
//--- initialisations
int i,iArc,iNbpt;
CArcMygale* pArc;
double dX1,dY1,dX2,dY2;
for(iArc=0;iArc < m_iNbArcZone;iArc++)
{
pArc=m_ptabArc[iArc];
if(pArc != NULL)
{
iNbpt=pArc->GetNbpt();
pArc->GetPoint(0,dX1,dY1);
pArc->GetPoint(iNbpt-1,dX2,dY2);
dtabX1[iArc]=dX1;
dtabY1[iArc]=dY1;
dtabX2[iArc]=dX2;
dtabY2[iArc]=dY2;
btabLibre[iArc]=TRUE;
}
}
//--- chainage par tche
double dXDebut,dYDebut,dXFin,dYFin;
int iNbTachesNonFermees=0;
CTache* pTache=NULL;
iArc=0;
while(iArc < m_iNbArcZone && m_iNbTaches < NB_MAX_TACHES)
{
//--- chainage par tache
while(iArc < m_iNbArcZone && btabLibre[iArc] == FALSE)iArc++;

Structures et mthodes : implmentation 423


if(iArc == m_iNbArcZone)break;
//--- dbut du ring
dXDebut=dtabX1[iArc];
dYDebut=dtabY1[iArc];
dXFin=dtabX2[iArc];
dYFin=dtabY2[iArc];
int iNbarcTache=0;
itabArcDeLaTache[iNbarcTache]=iArc;
btabSens[iNbarcTache]=0;
iNbarcTache++;
btabLibre[iArc]=FALSE;
iArc++;
BOOL bFerme=FALSE;
if(dXDebut == dXFin && dYDebut == dYFin)bFerme=TRUE;
int jArc=iArc;
while(jArc < m_iNbArcZone && bFerme == FALSE)
{
if(btabLibre[jArc] == TRUE)
{
if(dtabX1[jArc] == dXFin && dtabY1[jArc] == dYFin)
{
itabArcDeLaTache[iNbarcTache]=jArc;
btabSens[iNbarcTache]=0;
iNbarcTache++;
dXFin=dtabX2[jArc];
dYFin=dtabY2[jArc];
btabLibre[jArc]=FALSE;
jArc=iArc;
if(dXFin == dXDebut && dYFin == dYDebut)bFerme=TRUE;
}
else if(dtabX2[jArc] == dXFin && dtabY2[jArc] == dYFin)
{
itabArcDeLaTache[iNbarcTache]=jArc;
btabSens[iNbarcTache]=1;
iNbarcTache++;
dXFin=dtabX1[jArc];
dYFin=dtabY1[jArc];
btabLibre[jArc]=FALSE;
jArc=iArc;
if(dXFin == dXDebut && dYFin == dYDebut)bFerme=TRUE;
}
else jArc++;
}
else jArc++;
}
//--- fin du chainage d'une tche, criture du polygone
if(bFerme)
{
//--- chainage dans m_dtabPoints
int iIndex=m_iNbptTotal;
int iNbptPolygon=0;
for(i=0;i < iNbarcTache;i++)
{
pArc=m_ptabArc[itabArcDeLaTache[i]];
pArc->Chainer(btabSens[i],m_iTypeCoordonnees,m_iNbptTotal,iNbptPolygon,m_dtabPoints);
}
if(iNbptPolygon > 3)
{
//--- trois points ou moins : surface nulle !
pTache=new CTache(this,iIndex,iNbptPolygon);
if(pTache != NULL)
{
m_ptabTache[m_iNbTaches]=pTache;
m_iNbTaches++;
}
}
}
else iNbTachesNonFermees++;
}
free(dtabX1);
free(dtabY1);
free(dtabX2);
free(dtabY2);
free(btabLibre);
free(btabSens);

424

Annexe

free(itabArcDeLaTache);
if(iNbTachesNonFermees > 0)return FALSE;
//--- calcul du sens pour chaque tche
if(m_iNbTaches == 0)return FALSE;
else if(m_iNbTaches == 1)
{
double dSurface=m_ptabTache[0]->Surface();
if(dSurface > 0.)m_ptabTache[0]->ChangerLeSens();
}
else if(m_iNbTaches == 2)
{
//--- zone de deux tches
double dX0b,dY0b,dX0h,dY0h;
double dX1b,dY1b,dX1h,dY1h;
double dXInterieur,dYInterieur;
m_ptabTache[0]->BoundingBox(dX0b,dY0b,dX0h,dY0h);
m_ptabTache[1]->BoundingBox(dX1b,dY1b,dX1h,dY1h);
double dSurface0=m_ptabTache[0]->Surface();
double dSurface1=m_ptabTache[1]->Surface();
if(fabs(dSurface0) > fabs(dSurface1))
{
if(dSurface0 > 0.)m_ptabTache[0]->ChangerLeSens();
//--- tester si 1 est inclus dans 0
if(dSurface1 != 0. && dX1b >= dX0b && dX1h <= dX0h && dY1b >= dY0b && dY1h <= dY0h)
{
//--- tester l'appartenance d'un point de la 1 dans la 0
m_ptabTache[1]->GetPointInterieur(dXInterieur,dYInterieur);
if(m_ptabTache[0]->IsPointInside(dXInterieur,dYInterieur))
if(dSurface1 < 0.)m_ptabTache[1]->ChangerLeSens();
else
if(dSurface1 > 0.)m_ptabTache[1]->ChangerLeSens();
}
else
{
//--- on est sr que la tache 1 n'est pas incluse
if(dSurface1 > 0.)m_ptabTache[1]->ChangerLeSens();
}
}
else
{
if(dSurface1 > 0.)m_ptabTache[1]->ChangerLeSens();
//--- tester si 0 est inclus dans 1
if(dSurface0 != 0. && dX0b >= dX1b && dX0h <= dX1h && dY0b >= dY1b && dY0h <= dY1h)
{
//--- tester l'appartenance d'un point de la 0 dans la 1
m_ptabTache[0]->GetPointInterieur(dXInterieur,dYInterieur);
if(m_ptabTache[1]->IsPointInside(dXInterieur,dYInterieur))
if(dSurface0 < 0.)m_ptabTache[0]->ChangerLeSens();
else
if(dSurface0 > 0.)m_ptabTache[0]->ChangerLeSens();
}
else
{
//--- on est sr que la tache 0 n'est pas incluse
if(dSurface0 > 0.)m_ptabTache[0]->ChangerLeSens();
}
}

}
else
{
//--- zones de plusieurs taches
BOOL bIncluse;
int j,iIndice,iNoTache,iNoTacheBis,iSize,iNbTachesNonNulles;
double dSurface,dXInterieur,dYInterieur;
double dX0b,dY0b,dX0h,dY0h;
double dX1b,dY1b,dX1h,dY1h;

iSize=sizeof(double) + sizeof(int);
unsigned char *ctabSurface=(unsigned char *) malloc(m_iNbTaches*iSize);
int *itabTri=(int *) malloc(m_iNbTaches*sizeof(int));
if(ctabSurface == NULL || itabTri == NULL)
{
::ErreurDeMemoire();
if(ctabSurface != NULL)free(ctabSurface);
if(itabTri != NULL)free(itabTri);

Structures et mthodes : implmentation 425


return FALSE;
}
//--- trier les taches sur leur surface, tablir le tableau des indices des taches tries
iNbTachesNonNulles=0;
iIndice=0;
for(i=0;i < m_iNbTaches;i++)
{
m_ptabTache[i]->BoundingBox(dX0b,dY0b,dX0h,dY0h);
dSurface=fabs(m_ptabTache[i]->Surface());
if(dSurface > 0.)
{
memcpy(&ctabSurface[iIndice],&dSurface,sizeof(double));
memcpy(&ctabSurface[iIndice + sizeof(double)],&i,sizeof(int));
iIndice+=iSize;
iNbTachesNonNulles++;
}
}
qsort(ctabSurface,iNbTachesNonNulles,iSize,compareDoubleAsc);
iIndice=0;
for(i=0;i < iNbTachesNonNulles;i++)
{
memcpy(&iNoTache,&ctabSurface[iIndice + sizeof(double)],sizeof(int));
itabTri[i]=iNoTache;
iIndice+=iSize;
}
//--- en partant de la plus petite tache, on cherche le premier incluant, pour chaque
tache
for(i=0;i < iNbTachesNonNulles;i++)
{
iNoTache=itabTri[i];
m_ptabTache[iNoTache]->SetPere(-2);
m_ptabTache[iNoTache]->GetBB(dX0b,dY0b,dX0h,dY0h);
m_ptabTache[iNoTache]->GetPointInterieur(dXInterieur,dYInterieur);
for(j=i+1;j < iNbTachesNonNulles;j++)
{
iNoTacheBis=itabTri[j];
m_ptabTache[iNoTacheBis]->GetBB(dX1b,dY1b,dX1h,dY1h);
if(dX0b >= dX1b && dX0h <= dX1h && dY0b >= dY1b && dY0h <= dY1h)
{
//--- vrifier l'inclusion par un point
bIncluse=m_ptabTache[iNoTacheBis]->IsPointInside(dXInterieur,dYInterieur);
if(bIncluse)
{
m_ptabTache[iNoTache]->SetPere(iNoTacheBis);
break;
}
}
}
}
//--- en partant du plus grand, on ecrit la tache (clockwise) et tous les fils
(counterclock) jusqu'a ecrire toutes les taches
for(i=iNbTachesNonNulles-1;i >= 0;i--)
{
iNoTache=itabTri[i];
if(m_ptabTache[iNoTache]->GetPere() != -2)
{
//--- ecriture de la tache iNoTache clockwise
if(m_ptabTache[iNoTache]->GetSurface() > 0.)m_ptabTache[iNoTache]->ChangerLeSens();
m_ptabTache[iNoTache]->SetPere(-2);
for(j=i-1;j >= 0;j--)
{
iNoTacheBis=itabTri[j];
if(m_ptabTache[iNoTacheBis]->GetPere() == iNoTache)
{
//--- ecriture de la tache iNoTacheBis counterclockwise
if(m_ptabTache[iNoTacheBis]->GetSurface() < 0.)m_ptabTache[iNoTacheBis]>ChangerLeSens();
m_ptabTache[iNoTacheBis]->SetPere(-2);
}
}
}

free(ctabSurface);
free(itabTri);

426

Annexe
}

return TRUE;
}

A.2.3. Fentre et projections


A.2.3.1. La classe CWind
La classe CWind encapsule donnes et mthodes permettant de manipuler la
fentre de slection gographique dans un cadre. Chaque cadre contient un objet de
type CWind.
class CWind
{
public:
CCadre* m_pCadre;
double m_dFi1;
double m_dFi2;
double m_dFi3;
double m_dFi4;
float m_fFx1;
float m_fFy1;
float m_fFx2;
float m_fFy2;
double m_dFlx;
double m_dFly;
double m_dFhx;
double m_dFhy;
double m_dCoefRas;
double m_dFpixRas; // taille en metre du pixel rasterisation savane
int m_iNbWind; // pour l'historique des fenetres
float m_fFx1Undo[NB_MAX_WIND];
float m_fFy1Undo[NB_MAX_WIND];
float m_fFx2Undo[NB_MAX_WIND];
float m_fFy2Undo[NB_MAX_WIND];
public:

};

CWind(CCadre* pCadre);
CWind(CCadre* pCadre,FILE* Fichier);
void Ecrire(FILE* Fichier);
void Copier(CWind* pWindInit);
void ProjToRas(double dProjX,double dProjY,float &fRasX,float &fRasY);
void RasToProj(float fRasX,float fRasY,double &dProjX,double &dProjY);
void NouvelleFenetre(float fFx1,float fFy1,float fFx2,float fFy2);
void NouvelleFenetre(double dFlx,double dFly,double dFpixRas);
void NouvelleFenetre(double dFlx,double dFly,double dFhx,double dFhy);
void NouvelleFenetre(double dFlx,double dFly,double dFhx,double dFhy,double dFpixRas);
void Undo();
void NouvelleProjection();

Par exemple, voici le code de la procdure permettant de modifier la fentre par


coordonnes de projection :
void CWind::NouvelleFenetre(double dFlx,double dFly,double dFhx,double dFhy)
{
//--- mise a jour du undo
if(m_iNbWind < NB_MAX_WIND)
{
m_fFx1Undo[m_iNbWind]=m_fFx1;
m_fFy1Undo[m_iNbWind]=m_fFy1;
m_fFx2Undo[m_iNbWind]=m_fFx2;
m_fFy2Undo[m_iNbWind]=m_fFy2;
m_iNbWind++;
}
else
{

Structures et mthodes : implmentation 427


for(int i=1;i < m_iNbWind;i++)
{
m_fFx1Undo[i-1]=m_fFx1Undo[i];
m_fFy1Undo[i-1]=m_fFy1Undo[i];
m_fFx2Undo[i-1]=m_fFx2Undo[i];
m_fFy2Undo[i-1]=m_fFy2Undo[i];
}
m_fFx1Undo[m_iNbWind-1]=m_fFx1;
m_fFy1Undo[m_iNbWind-1]=m_fFy1;
m_fFx2Undo[m_iNbWind-1]=m_fFx2;
m_fFy2Undo[m_iNbWind-1]=m_fFy2;
}
//--- nouvelle fentre par coordonnes de projection
m_dFlx=dFlx;
m_dFly=dFly;
m_dFhx=dFhx;
m_dFhy=dFhy;
//--- calcul des coefficients pour le raster Savane
if((m_dFhx-m_dFlx) > 0. && (m_dFhy-m_dFly) > 0.)
{
double d1=(double)(config.m_iDefX)/(m_dFhx-m_dFlx);
double d2=(double)(config.m_iDefY)/(m_dFhy-m_dFly);
if(d1 < d2)m_dCoefRas=d1; else m_dCoefRas=d2;
m_dFpixRas=1./m_dCoefRas;
}
//--- calcul de Fx1,Fy1,Fx2,Fy2
m_pCadre->ProjToSav(dFlx,dFly,m_fFx1,m_fFy1);
m_pCadre->ProjToSav(dFhx,dFhy,m_fFx2,m_fFy2);
//--- rinitialisation des rasterisations pour le cadre
CSchema* pSchema=m_pCadre->GetSchema();
int iNoth=1;
while(iNoth <= pSchema->m_iNbacc)
{
pSchema->m_pRelations[iNoth]->m_iNbObjets=-1;
int iTypeRel=pSchema->m_pRelations[iNoth]->m_iType;
if(iTypeRel == 24)
{
pSchema->m_pRelations[iNoth]->m_iType=14;
int iFim=pSchema->m_pRelations[iNoth]->m_iNoFichImage;
pSchema->m_iFdisImage[iFim]=0;
}
iNoth++;
}
//--- suppression de la relation Raster
int iNothRaster=pSchema->RelRecherche("Raster");
if(iNothRaster > 0)XRelProj(m_pCadre,iNothRaster);
//--- dimensionner le cadre la nouvelle fenetre
m_pCadre->ReAjuster();
groupes.TailleDesCadres();
}

B.2.3.2. La classe CProjection


La classe CProjection se charge de la gestion et du calcul des projection
gographique dans un cadre. Chaque cadre contient un objet de type
CProjection :
class CProjection
{
private:
//--- projection courante
int m_iProjection;
CString m_strNomProjection;
//--- description de l'ellipsode
double m_dEllipseA;
double m_dEllipseE;
double m_dEllipseE2;

428

Annexe

double m_dEllipseEprim;
double m_dEllipseEprim2;
double m_dEllipseEsur2;
//--- description de la projection
double m_dXOrigine;
double m_dYOrigine;
int m_iZoneUtm;
double m_dFacteur;
int m_iMeridienCentralD;
int m_iMeridienCentralM;
double m_dMeridienCentralS;
int m_iMeridienCentralHem;
int m_iParalleleOrigineD;
int m_iParalleleOrigineM;
double m_dParalleleOrigineS;
int m_iParalleleOrigineHem;
int m_iParallele1D;
int m_iParallele1M;
double m_dParallele1S;
int m_iParallele1Hem;
int m_iParallele2D;
int m_iParallele2M;
double m_dParallele2S;
int m_iParallele2Hem;
//--- membres pour les calculs
double m_dPi;
double m_dPisur2;
double m_dPisur4;
double m_dMinuteToRadian;
double m_dRadianToMinute;
double m_dMeridienCentral;
double m_dParalleleOrigine;
double m_dParallele1;
double m_dParallele2;
double m_dGelMer[5];
double m_dXs;
double m_dYs;
double m_dN;
double m_dC;
double m_dRh;
double m_dSin0;
double m_dCos0;
//--- procedures d'initialisation
void LambertTangenteInit();
void LambertSecanteInit();
void StereographicInit();
void OrthographicInit();
void AlbertEquivInit();
//--- procedures de calcul
void GeographicToGeo(double dX,double dY,double &dLongitude,double &dColatitude);
void GeoToGeographic(double dLongitude,double dColatitude,double &dX,double &dY);
void UtmToGeo(double dX,double dY,double &dLongitude,double &dColatitude);
void GeoToUtm(double dLongitude,double dColatitude,double &dX,double &dY);
void LambertToGeo(double dX,double dY,double &dLongitude,double &dColatitude);
void GeoToLambert(double dLongitude,double dColatitude,double &dX,double &dY);
void MercatorToGeo(double dX,double dY,double &dLongitude,double &dColatitude);
void GeoToMercator(double dLongitude,double dColatitude,double &dX,double &dY);
void StereographicToGeo(double dX,double dY,double &dLongitude,double &dColatitude);
void GeoToStereographic(double dLongitude,double dColatitude,double &dX,double &dY);
void OrthographicToGeo(double dX,double dY,double &dLongitude,double &dColatitude);
void GeoToOrthographic(double dLongitude,double dColatitude,double &dX,double &dY);
void AlbertEquivToGeo(double dX,double dY,double &dLongitude,double &dColatitude);
void GeoToAlbertEquiv(double dLongitude,double dColatitude,double &dX,double &dY);
void GeodegreToGeo(double dX,double dY,double &dLongitude,double &dColatitude);
void GeoToGeodegre(double dLongitude,double dColatitude,double &dX,double &dY);
//--- procedures de
double Msfnz(double
double Qsfnz(double
double Phi1z(double
public:

calcul
sinphi,double cosphi);
sinphi,double cosphi);
qs);

Structures et mthodes : implmentation 429


CProjection();
CProjection(FILE* Fichier);
void Ecrire(FILE* Fichier);
BOOL SetProjection(int iProjection);
BOOL SetProjection(double dProj[20]);
int GetProjection();
void GetProjection(double dProj[20]);
CString GetNomProjection();
CString GetNomProjection(int iProjection);
BOOL SetEllipse(double dA,double dE2);
void GetEllipse(double &dA,double &dE2);
BOOL SetFacteur(double dFacteur);
double GetFacteur();
BOOL SetOrigine(double dX,double dY);
void GetOrigine(double &dX,double &dY);
void SetZoneUtm(int iZone);
int GetZoneUtm();
void SetMeridienCentral(class CLongitude);
void SetMeridienCentral(int iDegre,int iMinute,double dSeconde,int iHem);
BOOL SetMeridienCentral(double dMeridienCentral);
class CLongitude GetMeridienCentral();
void SetParalleleOrigine(class CLatitude);
void SetParalleleOrigine(int iDegre,int iMinute,double dSeconde,int iHem);
BOOL SetParalleleOrigine(double dColatitude);
class CLatitude GetParalleleOrigine();
void SetParallele1(class CLatitude);
void SetParallele1(int iDegre,int iMinute,double dSeconde,int iHem);
BOOL SetParallele1(double dColatitude);
class CLatitude GetParallele1();
void SetParallele2(class CLatitude);
void SetParallele2(int iDegre,int iMinute,double dSeconde,int iHem);
BOOL SetParallele2(double dColatitude);
class CLatitude GetParallele2();
void Init();
void GeoToProj(double dLongitude,double dColatitude,double &dX,double &dY);
void ProjToGeo(double dX,double dY,double &dLongitude,double &dColatitude);
};

Les coordonnes gographiques (dLongitude, dColatitude) sont toujours


exprimes en minutes dcimales dans la classe CProjection. Voici par exemple le
code permettant de calculer les transformations de coordonnes pour la projection
Mercator :
void CProjection::MercatorToGeo(double dX,double dY,double &dLongitude,double &dColatitude)
{
int i,iHem;
double v,phibis,phi,u,puissance,dLatitude;
dLongitude=m_dMeridienCentral+((dX/m_dEllipseA)*m_dRadianToMinute);
if(dLongitude < 0.)dLongitude+=21600.;
else if(dLongitude >= 21600.)dLongitude-=21600.;
if(dY <= 0.)
{
iHem=SUD;
dY=-dY;
}
else iHem=NORD;
v=exp(dY/m_dEllipseA);
phibis=2.*atan(v)-m_dPisur2;
phi=phibis;
u=m_dEllipseE*sin(phi);
puissance=pow(((1.+u)/(1.-u)),m_dEllipseEsur2);
phibis=2.*(atan(v*puissance))-m_dPisur2;
i=1;
while(phibis != phi && i < 50)
{
phi=phibis;
u=m_dEllipseE*sin(phi);
puissance=pow(((1.+u)/(1.-u)),m_dEllipseEsur2);

430

Annexe
phibis=2.*(atan(v*puissance))-m_dPisur2;
i++;
}

dLatitude=phi*m_dRadianToMinute;
if(iHem==NORD)dColatitude=5400.-dLatitude;
else dColatitude=5400.+dLatitude;
}
void CProjection::GeoToMercator(double dLongitude,double dColatitude,double &dX,double &dY)
{
int iLongitudeHem;
double rl,dLatitude,phi,u;
if(dLongitude < 0.)dLongitude+=21600.;
else if(dLongitude >= 21600.)dLongitude-=21600.;
if(dLongitude < 10800.)iLongitudeHem=EST;
else iLongitudeHem=OUEST;
if(m_iMeridienCentralHem == iLongitudeHem)rl=dLongitude-m_dMeridienCentral;
else if(m_iMeridienCentralHem == EST && iLongitudeHem == OUEST)
{
rl=dLongitude-m_dMeridienCentral;
if(rl > 10800.)rl-= 21600.;
}
else if(m_iMeridienCentralHem == OUEST && iLongitudeHem == EST)
{
rl=dLongitude+21600.-m_dMeridienCentral;
if(rl > 10800.)rl-= 21600.;
}
if(dColatitude > 5400.)dLatitude=dColatitude-5400.;
else dLatitude=5400.-dColatitude;
dX=(rl*m_dMinuteToRadian)*m_dEllipseA;
phi=dLatitude*m_dMinuteToRadian;
u=m_dEllipseE*sin(phi);
dY=m_dEllipseA*(log(tan(m_dPisur4+(phi/2.)))-(m_dEllipseEsur2*log((1.+u)/(1.-u))));
if(dColatitude > 5400.)dY=-dY;
}

La projection UTM ncessite de nombreux paramtres, dont ceux permettant de


calculer la longueur dun arc de mridien sur lellipsode. Les paramtres sont
calculs lors du chargement ou de la modification de lellipsode :
BOOL CProjection::SetEllipse(double dA,double dE2)
{
//--- indique en retour si l'ellipsode a chang
if(m_dEllipseA == dA && m_dEllipseE2 == dE2)return FALSE;
m_dEllipseA=dA;
m_dEllipseE2=dE2;
//--- calcul de e, e'2 et e/2
m_dEllipseE=sqrt(dE2);
m_dEllipseEsur2=m_dEllipseE/2.;
m_dEllipseEprim2=dE2/(1.-dE2);
m_dEllipseEprim=sqrt(m_dEllipseEprim2);
//--- calcul du nouveau gelmer pour UTM
m_dGelMer[0]=1.+ dE2*(3./4.+dE2*(45./64.+dE2*(175./256.+dE2*11025./16384.)));
m_dGelMer[1]=dE2*(3./4.+dE2*(15./16.+dE2*(525./512.+dE2*2205./2048.)));
m_dGelMer[2]=dE2*dE2*(15./64.+dE2*(105./256.+dE2*2205./4096.));
m_dGelMer[3]=dE2*dE2*dE2*(35./512.+dE2*315./2048.);
m_dGelMer[4]=dE2*dE2*dE2*dE2*315./16384.;
return TRUE;
}

Voici les calculs de transformations de coordonnes pour la projection UTM :


void CProjection::UtmToGeo(double dX,double dY,double &dLongitude,double &dColatitude)
{
int iLatitudeHem;
double y1,x1,rp,b,db,gelmer,x11,x12,rl,rp1,u,dLatitude;

Structures et mthodes : implmentation 431

y1=dY-10000000.;
x1=dX-500000.;
if(y1 < 0.)
{
iLatitudeHem=SUD;
y1=-y1;
}
else iLatitudeHem=NORD;
x1=x1/m_dFacteur;
y1=y1/m_dFacteur;
rp=m_dPi*y1/2.e+07;
b=m_dGelMer[0]*rp;
db=m_dGelMer[1]*sin(2.*rp)/2.;
b=b-db;
db=m_dGelMer[2]*sin(4.*rp)/4.;
b=b+db;
db=m_dGelMer[3]*sin(6.*rp)/6.;
b=b-db;
db=m_dGelMer[4]*sin(8.*rp)/8.;
b=b+db;
gelmer=b*m_dEllipseA*(1.- m_dEllipseE2);
y1=y1-gelmer;
u=sin(rp);
u=u*u;
x11=m_dEllipseA/sqrt(1.-m_dEllipseE2*u);
x12=m_dEllipseE2*(1.-u)/6./(1.- m_dEllipseE2);
y1=y1*(1.-3.*x12*x1*x1/x11/x11)/x11;
x1=x1*(1.-x12*x1*x1/x11/x11)/x11;
y1=y1+rp;
x1=2.*atan(exp(x1))-m_dPisur2;
rl=atan(tan(x1)/cos(y1));
dLongitude=m_dMeridienCentral+rl*m_dRadianToMinute;
if(dLongitude < 0.)dLongitude+=21600.;
else if(dLongitude >= 21600.)dLongitude-=21600.;
rp1=asin(sin(y1)*cos(x1));
rp=rp+(1.-m_dEllipseE2*sin(rp)*sin(rp))/(1.-m_dEllipseE2)*(rp1-rp)*(1.1.5*m_dEllipseEprim2*sin(rp)*cos(rp)*(rp1-rp));
dLatitude=rp*m_dRadianToMinute;
if(iLatitudeHem == NORD) dColatitude=5400.-dLatitude;
else dColatitude=5400.+dLatitude;
}
void CProjection::GeoToUtm(double dLongitude,double dColatitude,double &dX,double &dY)
{
int iLongitudeHem,iLatitudeHem;
double rl,rp,dLatitude;
double cpsi,spsi,tpsi,tpsi2,tpsi4,nu,nu2,N,u,u2,u3,x;
double y,b,db,gelmer;
if(dLongitude < 0.)dLongitude+=21600.;
else if(dLongitude >= 21600.)dLongitude-=21600.;
if(dLongitude < 10800.)iLongitudeHem=EST;
else iLongitudeHem=OUEST;
if(m_iMeridienCentralHem == iLongitudeHem)rl=dLongitude-m_dMeridienCentral;
else if(m_iMeridienCentralHem == EST && iLongitudeHem == OUEST)
{
rl=dLongitude-m_dMeridienCentral;
if(rl > 10800.)rl-=21600.;
}
else if(m_iMeridienCentralHem == OUEST && iLongitudeHem == EST)
{
rl=dLongitude+21600.-m_dMeridienCentral;
if(rl > 10800.)rl-=21600.;
}
if(dColatitude > 5400.)
{
iLatitudeHem=SUD;
dLatitude=dColatitude-5400.;
}

432

Annexe

else
{
iLatitudeHem=NORD;
dLatitude=5400.-dColatitude;
}
rl=rl*m_dMinuteToRadian;
rp=dLatitude*m_dMinuteToRadian;
cpsi=cos(rp);
spsi=sin(rp);
tpsi=spsi/cpsi;
tpsi2=tpsi*tpsi;
tpsi4=tpsi2*tpsi2;
nu=cpsi*m_dEllipseEprim;
nu2=nu*nu;
N=m_dEllipseA/sqrt(1.- m_dEllipseE2*spsi*spsi);
u=rl*cpsi;
u2=u*u;
u3=u2*u;
//--- calcul de x
x=N*u+(N*u3*(1.-tpsi2+nu2)/6.);
x=x+(N*u2*u3*(5.-(18.*tpsi2)+tpsi4+(14.*nu2)-(58.*tpsi2*nu2))/120.);
dX=500000.+ m_dFacteur*x;
//--- calcul de la longueur de l'arc de meridien central
b=m_dGelMer[0]*rp;
db=m_dGelMer[1]*sin(2.*rp)/2.;
b=b-db;
db=m_dGelMer[2]*sin(4.*rp)/4.;
b=b+db;
db=m_dGelMer[3]*sin(6.*rp)/6.;
b=b-db;
db=m_dGelMer[4]*sin(8.*rp)/8.;
b=b+db;
gelmer=b*m_dEllipseA*(1.- m_dEllipseE2);
//--- termes du developpement pour la projection
y=gelmer+(N*u2*tpsi/2.);
y=y+(N*u2*u2*tpsi*(5.-tpsi2+(9.*nu2)+(4.*nu2*nu2))/24.);
y=y+(N*u3*u3*tpsi*(61.-(58.*tpsi2)+tpsi4+(270.*nu2)-(330.*nu2*tpsi2))/720.);
y=m_dFacteur*y;
if(iLatitudeHem == SUD)dY=10000000.-y;
else dY=y+10000000.;
}

La projection Lambert est une conique. Les paramtres sont initialiss lors de la
dfinition de la projection dans le cadre :
void CProjection::LambertTangenteInit()
{
double dPar,phi0,W0,N0,u,L0,R0;
if(m_dParalleleOrigine>5400.)dPar=m_dParalleleOrigine-5400.;
else dPar=5400.-m_dParalleleOrigine;
phi0=dPar*m_dMinuteToRadian;
m_dN=sin(phi0);
W0=sqrt((1.-(m_dEllipseE2*m_dN*m_dN)));
N0=m_dEllipseA/W0;
u=m_dEllipseE*m_dN;
L0=log(tan(m_dPisur4+(phi0/2.)))-(m_dEllipseEsur2*log((1.+u)/(1.-u)));
R0=m_dFacteur*(N0/tan(phi0));
m_dC=R0*exp(m_dN*L0);
m_dXs=m_dXOrigine;
m_dYs=m_dYOrigine+R0;
}
void CProjection::LambertSecanteInit()
{
double dPar,phi0,phi1,phi2,u,w1,n1,l1,w2,n2,l2,l0,r0;
if(m_dParalleleOrigine > 5400.)dPar=m_dParalleleOrigine-5400.;
else dPar=5400.-m_dParalleleOrigine;
phi0=dPar*m_dMinuteToRadian;
if(m_dParallele1 > 5400.)dPar=m_dParallele1-5400.;

Structures et mthodes : implmentation 433


else dPar=5400.-m_dParallele1;
phi1=dPar*m_dMinuteToRadian;
if(m_dParallele2 > 5400.)dPar=m_dParallele2-5400.;
else dPar=5400.-m_dParallele2;
phi2=dPar*m_dMinuteToRadian;
u=sin(phi1);
w1=sqrt(1.-(m_dEllipseE2*u*u));
n1=m_dEllipseA/w1;
u=m_dEllipseE*u;
l1=log(tan(m_dPisur4+(phi1/2.)))-(m_dEllipseEsur2*log((1.+u)/(1.-u)));
u=sin(phi2);
w2=sqrt(1.-(m_dEllipseE2*u*u));
n2=m_dEllipseA/w2;
u=m_dEllipseE*u;
l2=log(tan(m_dPisur4+(phi2/2.)))-(m_dEllipseEsur2*log((1.+u)/(1.-u)));
m_dN=(log((n2*cos(phi2))/(n1*cos(phi1))))/(l1-l2);
m_dC=((n1*cos(phi1))/m_dN)*exp(m_dN*l1);
u=m_dEllipseE*sin(phi0);
l0=log(tan(m_dPisur4+(phi0/2.)))-(m_dEllipseEsur2*log((1.+u)/(1.-u)));
r0=m_dC*exp(-m_dN*l0);
m_dXs=m_dXOrigine;
m_dYs=m_dYOrigine+r0;
}
void CProjection::GeoToLambert(double dLongitude,double dColatitude,double &dX,double &dY)
{
int iLongitudeHem,iLatitudeHem;
double rl,dLatitude,phi,u,L,gama,r;
if(dLongitude < 0.)dLongitude+=21600.;
else if(dLongitude >= 21600.)dLongitude-=21600.;
if(dLongitude < 10800.)iLongitudeHem=EST;
else iLongitudeHem=OUEST;
if(m_iMeridienCentralHem == iLongitudeHem)rl=dLongitude-m_dMeridienCentral;
else if(m_iMeridienCentralHem == EST && iLongitudeHem == OUEST)
{
rl=dLongitude-m_dMeridienCentral;
if(rl > 10800.)rl-=21600.;
}
else if(m_iMeridienCentralHem == OUEST && iLongitudeHem == EST)
{
rl=dLongitude+21600.-m_dMeridienCentral;
if(rl > 10800.)rl-=21600.;
}
if(dColatitude > 5400.)
{
iLatitudeHem=SUD;
dLatitude=dColatitude-5400.;
}
else
{
iLatitudeHem=NORD;
dLatitude=5400.-dColatitude;
}
if(iLatitudeHem != m_iParalleleOrigineHem)dLatitude=-dLatitude;
phi=dLatitude*m_dMinuteToRadian;
rl*=m_dMinuteToRadian;
u=m_dEllipseE*sin(phi);
L=log(tan(m_dPisur4+(phi/2.)))-(m_dEllipseEsur2*log((1.+u)/(1.-u)));
gama=m_dN*rl;
r=m_dC*exp(-m_dN*L);
//--- traitement en fonction de l'hmisphre
if(m_iParalleleOrigineHem == NORD)
{
dX=m_dXs+(r*sin(gama));
dY=m_dYs-(r*cos(gama));
}
else
{
dX=m_dXs-(r*sin(gama));
dY=-m_dYs+(r*cos(gama));
}

434

Annexe

}
void CProjection::LambertToGeo(double dX,double dY,double &dLongitude,double &dColatitude)
{
int i;
double u,v,r,gama,l,phibis,phi,puissance,dLatitude;
//--- calcul de la longitude
u=dX-m_dXs;
v=dY-m_dYs;
r=sqrt(u*u+v*v);
gama=atan(-(u/v));
dLongitude=(gama/m_dN);
dLongitude=m_dMeridienCentral+(dLongitude*m_dRadianToMinute);
if(dLongitude < 0.)dLongitude+=21600.;
else if(dLongitude >= 21600.)dLongitude-=21600.;
//--- calcul de la colatitude
l=-(log(r/m_dC))/m_dN;
phibis=l;
v=exp(l);
phi=phibis;
u=m_dEllipseE*sin(phi);
puissance=pow(((1.+u)/(1.-u)),m_dEllipseEsur2);
phibis=2.*(atan(v*puissance))-m_dPisur2;
i=1;
while(phibis != phi && i<50)
{
phi=phibis;
u=m_dEllipseE*sin(phi);
puissance=pow(((1.+u)/(1.-u)),m_dEllipseEsur2);
phibis=2.*(atan(v*puissance))-m_dPisur2;
i++;
}
dLatitude=phi*m_dRadianToMinute;
if(m_iParalleleOrigineHem == NORD)dColatitude=5400.-dLatitude;
else dColatitude=5400.+dLatitude;
}

A.2.3.3. La classe CMolodensky


La classe CModolensky permet de calculer des changements de datum. Le
calcul utilise les formules de Molodensky. La prcision absolue de ces formules est
denviron deux mtres. Dans SAVANE, toutes les donnes dune mme base
doivent tre dans le mme datum. Le changement de datum dans SAVEDIT
concerne le seul document de digitalisation ouvert. Le changement de datum dans le
module SAVANE concerne lensemble des objets de la base de donnes.
class CMolodensky
{
private:
double m_dA;
double m_dF;
double m_dDeltaX;
double m_dDeltaY;
double m_dDeltaZ;
double m_dDeltaA;
double m_dDeltaF;
double m_dBsurA;
double m_dAsurB;
double m_dE2;
public:
CMolodensky();
void Init(double dA,double dE2,double dDeltaX,double dDeltaY,double dDeltaZ,double
dDeltaA,double dDeltaF);
void Calcul(double dLongitude,double dColatitude,double dHauteur,double& dLongRes,double&
dLatRes,double& dHauteurRes);
};
void CMolodensky::Init(double dA,double dE2,double dDeltaX,double dDeltaY,double
dDeltaZ,double dDeltaA,double dDeltaF)

Structures et mthodes : implmentation 435


{
m_dA=dA;
m_dE2=dE2;
m_dDeltaX=dDeltaX;
m_dDeltaY=dDeltaY;
m_dDeltaZ=dDeltaZ;
m_dDeltaA=dDeltaA;
m_dDeltaF=dDeltaF;
m_dF=1.- sqrt(1.-m_dE2);
m_dBsurA=1.-m_dF;
m_dAsurB=1./m_dBsurA;
}
void CMolodensky::Calcul(double dLongitude,double dColatitude,double dHauteur,double&
dLongitudeRes,double& dColatitudeRes,double& dHauteurRes)
{
double dMinuteToRadian=acos(-1.)/10800.;
//--- longitude
double dLong=dLongitude;
if(dLong > 10800.)dLong=21600.-dLong;
dLong*=dMinuteToRadian;
double dSinLong=sin(dLong);
double dCosLong=cos(dLong);
//--- latitude
double dLat=dColatitude;
dLat=5400.-dLat;
dLat*=dMinuteToRadian;
double dSinLat=sin(dLat);
double dCosLat=cos(dLat);
double dRn=m_dA/sqrt(1.-m_dE2*dSinLat*dSinLat);
double dRm=m_dA*(1.-m_dE2)/pow(1.-m_dE2*dSinLat*dSinLat,1.5);
double dDeltaLong=(-m_dDeltaX*dSinLong + m_dDeltaY*dCosLong)/((dRn+dHauteur)*dCosLat);
dDeltaLong/=dMinuteToRadian;
double dDeltaLat=-m_dDeltaX*dSinLat*dCosLong-m_dDeltaY*dSinLat*dSinLong+m_dDeltaZ*dCosLat;
dDeltaLat=dDeltaLat + m_dDeltaA*(dRn*m_dE2*dSinLat*dCosLat)/m_dA;
dDeltaLat=dDeltaLat + m_dDeltaF*(dRm*m_dAsurB + dRn*m_dBsurA)*dSinLat*dCosLat;
dDeltaLat=dDeltaLat/(dRm + dHauteur);
dDeltaLat/=dMinuteToRadian;
double dDeltaH=m_dDeltaX*dCosLat*dCosLong+m_dDeltaY*dCosLat*dSinLong+m_dDeltaZ*dSinLat;
dDeltaH=dDeltaH-m_dDeltaA*sqrt(1.- m_dE2*dSinLat*dSinLat)
+ m_dDeltaF*m_dBsurA*dRn*dSinLat*dSinLat;
if(dLongitude < 0. || dLongitude > 10800.)dLongitudeRes=dLongitude-dDeltaLong;
else dLongitudeRes=dLongitude+dDeltaLong;
dColatitudeRes=dColatitude-dDeltaLat;
dHauteurRes=dHauteur+dDeltaH;
}

dA, dE2 sont les paramtres de l'ellipsode de dpart ; dDeltaX,dDeltaY,dDeltaZ


sont les diffrences de position des centres des datum ; dDeltaA et dDeltaF sont les
diffrences de grand cot et d'aplatissement entre les deux ellipsodes.

436

Annexe

A.2.4. Documents et cartographie


A.2.4.1. La classe CCarte
La classe CCarte encapsule donnes et mthodes pour le document de base du
module SAVANE. Le module SAVANE ne contient quune seule instance de cette
classe.
class CCarte
{
//--- attributs
private:
BOOL m_bASauver;
int m_iVersion;
long m_ptrlib;
void DeleteObjets();
public:
char m_chNom[_MAX_PATH];
char m_chNomDir[_MAX_PATH];
int m_iLargeur; //--- largeur de la feuille (mm/100)
int m_iHauteur; //--- hauteur de la feuille (mm/100)
int m_iTaille; //--- taille de la feuille, cod
int m_iOrientation; //--- orientation de la feuille (0 portrait,1 paysage)
int m_iNbCadres; //--- nombre de cadres gographiques
//--- pointeur des objets cadres
CCadre* m_pCadre[NB_MAX_CADRES];
int m_iXVueDansCarte; //--- position du point (0,0) de la vue (espace de visualisation)
dans la carte (mm)
int m_iYVueDansCarte;
double m_dFacteur; //--- facteur de zoom de trac pour la carte
double m_dCoef; //--- coefficient de zoom pour la carte
double m_dMMToPrint; //--- pour passer des coordonnes en MM/100 aux coordonnes du
DCPrint
int
int
int
int

m_iRegle; //--- active ou desactive le trac des rgles


m_iGrille; //--- active ou desactive les repres magntiques
m_iGapPixel; //--- taille de la grille magnetique en pixel ecran
m_iGapMM; //--- taille de la grille magnetique en mm/10

int
int
int
int

m_iGuideCarteX[NB_MAX_GUIDES]; //--- position des guides de trac


m_iGuideCarteY[NB_MAX_GUIDES];
m_iGuideVueX[NB_MAX_GUIDES]; //--- position des guides de trac dans la vue
m_iGuideVueY[NB_MAX_GUIDES];

int m_iNbObjets;
CODD m_tabObjets[NB_MAX_OBJET]; //--- tableau des objets tracer dans la carte
//--- mmoire des zoom successifs
int m_iMemoireNbZoom;
int m_itabMemoireXVueDansCarte[10];
int m_itabMemoireYVueDansCarte[10];
double m_dtabMemoireFacteur[10];
//--- implmentation
public:
CCarte();
BOOL Nouveau(void);
BOOL Ouvrir(char* chNomCarte);
BOOL Fermer(void);
BOOL Sauver(void);
BOOL SauverSous(void);
BOOL ChargerLesCadres();
BOOL SauverLesCadres();
BOOL ChargerLesObjets();
BOOL SauverLesObjets();
void ReInit();
int QuelCadre(CPoint point);
void ASauver() {m_bASauver=TRUE;};
BOOL IsASauver() {return m_bASauver;};
BOOL IsPointDansCadre(CCadre* pCadre,int iXVue,int iYVue);
void TailleDesGroupes(void);

Structures et mthodes : implmentation 437


void ModifierLaSelection(int iMode,int iX,int iY);
void SauverLeZoom();
void ZoomDansCarte();
void ZoomDansCadre(int iNoCadre);
void EffacerPixmap();
void ToutTracer();
void TracerUnCadre(CCadre* pCadre);
void TracerLePapier();
void TracerLePapier(int iXbas,int iYbas,int iXhaut,int iYHaut);
void TracerLesObjets(CDC* pDC);
void TracerTexte(CDC* pDC,int iXbCarte,int iYbCarte,int iXhCarte,int iYhCarte,int
iSizePoint,COLORREF Couleur,LOGFONT* pLogfont,const char* chTexte);
int EpaisseurMMToVue(double dEpaisseur,int iPrint);
int MMToVue(double dMM,int iPrint);
};

Les seuls membres lies la base de donnes sont les pointeurs des objets de
type CCadre (CCadre* m_pCadre[NB_MAX_CADRES]). Tous les autres membres
et mthodes de cette classe sont lies la reprsentation graphique de la carte, sur
lcran ou sur imprimante. Outre des cadres, une carte peut contenir des objets
graphiques provenant du dessin direct effectu lcran. Ces objets sont grs par la
classe CODD (B.2.4.2). Les ODD reprsentent des classes propres chaque type
dobjet graphique (texte, ligne, polyligne, polygone, rectangle, rectangle dgrad,
cercle, ellipse, symbole, chelle graphique, bitmap). Les objets graphiques sont
conservs dans la carte par le tableau des pointeurs des objets de type CODD
correspondants.
A.2.4.2. Les classes CODD
Les ODD reprsentent des classes propres chaque type dobjet graphique
pouvant tre dessin lcran par lutilisateur du systme (texte, ligne, polyligne,
polygone, rectangle, rectangle dgrad, cercle, ellipse, symbole, chelle graphique,
bitmap). Les classe CODD_ encapsulent toutes les informations ncessaires la
manipulation des objets graphiques, selon leur type. Voici par exemple les classes
CODD_Symbole et CODD_Texte :
class CODD_Symbole
{
public:
int m_iNumero;
int m_iXCarte;
int m_iYCarte;
int m_iTaille; //--- taille en mm/100
double m_dEpaisseur; //--- epaisseur en mm/100
int m_iDetourage;
int m_iTrame;
COLORREF m_CouleurInt;
COLORREF m_CouleurExt;
};
class CODD_Texte
{
public:
int m_itabX[6];
int m_itabY[6];
int m_iSizePoint;
COLORREF m_Couleur;
LOGFONT m_logfont;
char m_chTexte[500];
public:
CODD_Texte();
};

438

Annexe

Ces classes ne contiennent pas de mthodes. La classe CODD regroupe


lensemble des mthodes de manipulation des objets graphiques, quelque soit leur
type :
class CODD
{
public:
BOOL m_bValid;
int m_iType; //--- type (texte, rectangle, ...)
int m_iGroupe;
int m_iXbCarte; //--- position de l'objet dans la carte
int m_iYbCarte;
int m_iXhCarte;
int m_iYhCarte;
double m_dAngle; //--- angle de rotation,sens trigo, en radian
LPVOID m_lpODD; //--- pointeur vers un ODD
public:
CODD();
void Deplacer(int iX,int iY);
int Dupliquer(int iX,int iY);
void Modifier(int iAction,int iX,int iY);
void Symetrie(BOOL bVertical=TRUE);
void Rotation(double dAngle);
void Couleur(COLORREF Couleur,BOOL bInterieur=TRUE);
void Trait(int iType,double dEpaisseur,COLORREF Couleur);
void Taille(int iX1,int iY1,int iX2,int iY2);
int Lire(FILE* Fichier);
BOOL Ecrire(FILE* Fichier);
};

A.2.4.3. Les classes CGroupe et CSelection


Les classes CGroupe et CSelection permettent de grer le groupement
dobjets graphiques et de manipuler les objets graphiques sur lcran.
class CGroupes
{
private:
BOOL m_bOccupe[NB_MAX_GROUP];
public:
int m_iXbCarte[NB_MAX_GROUP];
int m_iYbCarte[NB_MAX_GROUP];
int m_iXhCarte[NB_MAX_GROUP];
int m_iYhCarte[NB_MAX_GROUP];
public:
void Init(void);
int Nouveau(void);
int NbObjets(int iNoGroupe);
BOOL IsOccupe(int iNoGroupe) {return m_bOccupe[iNoGroupe];};
void TailleDesCadres();
void TailleDesObjets();
};

La variable m_iGroupe de CODD donne le numro du groupe auquel appartient


lobjet.
class CSelection
{
public:
int m_iNb;
int m_iNoDuGroupe[NB_MAX_SELECTION];
int m_iFirst;
public:
BOOL IsPointInside(int iXVue,int iYVue);
void RectangleCarte(int& iXb,int& iYb,int& iXh,int& iYh);
CRect RectangleVue();
};

Structures et mthodes : implmentation 439


La variable m_iNoDuGroupe est un tableau qui donne lensemble des groupes
dobjets graphiques slectionns sur lcran.
A.2.4.4. La classe CCadre
La classe CCadre est une des plus importantes du module SAVANE. Elle dcrit
un cadre gographique. Elle contient des variables dcrivant lapparence graphique
du cadre (position dans la carte, type bord, chelle, amorces gographiques, etc.), et
des variables dcrivant la requte sur la base de donnes (m_pWind, m_pSchema,
etc.) :
class CCadre
{
private:
//--- carte propritaire
CCarte* m_pCarte;
//--- wind et projection, schma d'interrogation SGBD, macro, explorateur
CProjection* m_pProjection;
CWind* m_pWind;
CSchema* m_pSchema;
CMacro* m_pMacro;
CMacro* m_pMacroCadre;
CCartExplorateur* m_pExplorateur;
CDialogStatExplorateur* m_pDlgStatExplorateur;
public:
//--- fenetre du cadre en projection, normalement identique la fenetre wind
double m_dFgxb;
double m_dFgyb;
double m_dFgxh;
double m_dFgyh;
//--- proprits de dessin du cadre
int m_iType;
int m_iXDansCarte;
int m_iYDansCarte;
double m_dEchelle; //--- echelle en metre du cadre geo dans la carte
double m_dEchelleMM; //--- echelle en mm/100 du cadre geo dans la carte
double m_dUnite; //--- unite pour le bord et la legende (metres)
//--- amorces de projection
BOOL m_bAmorcesProj;
double m_dAmorcesProjIntervalle;
int m_iAmorcesProjLignes;
double m_dAmorcesProjEpaisseur;
COLORREF m_couleurAmorcesProj;
BOOL m_bAmorcesProjTexte;
LOGFONT m_logfontAmorcesProj;
COLORREF m_couleurAmorcesProjTexte;
int m_iAmorcesProjSizeFont;
//--- amorces geographiques
BOOL m_bAmorcesGeo;
int m_iAmorcesGeoDeg;
int m_iAmorcesGeoMin;
int m_iAmorcesGeoSec;
int m_iAmorcesGeoLignes;
double m_dAmorcesGeoEpaisseur;
COLORREF m_couleurAmorcesGeo;
BOOL m_bAmorcesGeoTexte;
LOGFONT m_logfontAmorcesGeo;
COLORREF m_couleurAmorcesGeoTexte;
int m_iAmorcesGeoSizeFont;
//--- amorces de coin
BOOL m_bAmorcesCoin;
LOGFONT m_logfontAmorcesCoin;
COLORREF m_couleurAmorcesCoin;
int m_iAmorcesCoinSizeFont;
public:
char m_chNom[_MAX_PATH]; //--- nom du rpertoire de sauvegarde pour le cadre
public:

440

Annexe
CCadre(CCarte* pCarte,int iNoCadre);
CCadre(CCarte* pCarte,int iNoCadre,BOOL bMemeBase,FILE* Fichier);
~CCadre();
CCarte* GetCarte() {return m_pCarte;};
CProjection* GetProjection() {return m_pProjection;};
CWind* GetWind() {return m_pWind;};
CSchema* GetSchema() {return m_pSchema;};
CMacro* GetMacro() {return m_pMacro;};
CMacro* GetMacroCadre() {return m_pMacroCadre;};
CCartExplorateur* GetExplorateur() {return m_pExplorateur;};
CDialogStatExplorateur* GetDlgStatExplorateur() {return m_pDlgStatExplorateur;};
//--- procdures de changement de repre
void SavToProj(float fSavX,float fSavY,double& dProjX,double& dProjY);
void SavToRas(float fSavX,float fSavY,float& fRasX,float& fRasY);
void SavToRas(float fXSav,float fYSav,int& iXRas,int& iYRas);
void SavToCarte(float fSavX,float fSavY,int& iCarteX,int& iCarteY);
void SavToVue(float fSavX,float fSavY,int& iVueX,int& iVueY,int iPrint);
void
void
void
void

ProjToSav(double dProjX,double dProjY,float& fSavX,float& fSavY);


ProjToCarte(double dProjX,double dProjY,int& iCarteX,int& iCarteY);
ProjToVue(double dProjX,double dProjY,int& iVueX,int& iVueY);
ProjToVue(double dProjX,double dProjY,int& iVueX,int& iVueY,int iPrint);

void VueToSav(int iVueX,int iVueY,float& fSavX,float& fSavY);


void VueToProj(int iVueX,int iVueY,double& dProjX,double& dProjY);
void VueToRas(int iVueX,int iVueY,float& fRasX,float& fRasY);
void RasToVue(float fRasX,float fRasY,int& iVueX,int& iVueY);
void RasToSav(float fRasX,float fRasY,float& fSavX,float& fSavY);

};

void
void
void
void
void
void

Unite();
ReAjuster();
Effacer();
ToutEffacer();
TracerBord(CDC* pDC);
CoordonneesDansLaVue(int& iXb,int& iYb,int& iXh,int& iYh,int iPrint=0);

La classe contient des mthodes permettant de changer de repre, entre


coordonnes gographiques, coordonnes de projection, coordonnes carte,
coordonnes cran ou imprimante. Par exemple, voici l'implmentation de la
fonction GeoToVue, permettant de passer des coordonnes gographiques d'un point
sa position dans la vue (cran ou imprimante) :
void CCadre::GeoToVue(double dXGeo,double dYGeo,int& iVueX,int& iVueY,int iPrint)
{
double dX,dY;
GeoToProj(dXGeo,dYGeo,dX,dY);
if(iPrint)
{
dX=((double)m_iXDansCarte)+((dX-m_dFgxb)*m_dEchelleMM);
dY=((double)m_iYDansCarte)+((dY-m_dFgyb)*m_dEchelleMM);
iVueX=(int) (dX*carte.m_dMMToPrint);
iVueY=(int) ((dY - carte.m_iHauteur)*carte.m_dMMToPrint);
if(config.m_bMetaFile)iVueY=-iVueY;
if(iVueX > INFINI)iVueX=INFINI;else if(iVueX < -INFINI)iVueX=-INFINI;
if(iVueY > INFINI)iVueY=INFINI;else if(iVueY < -INFINI)iVueY=-INFINI;
}
else
{
dX=((double)m_iXDansCarte)+((dX-m_dFgxb)*m_dEchelleMM);
dY=((double)m_iYDansCarte)+((dY-m_dFgyb)*m_dEchelleMM);
iVueX= (int) ((dX - (double)carte.m_iXVueDansCarte)*carte.m_dCoef);
iVueY=config.m_iVueHauteurRes-1 -(int) ((dY(double)carte.m_iYVueDansCarte)*carte.m_dCoef);
if(iVueX > INFINI)iVueX=INFINI;else if(iVueX < -INFINI)iVueX=-INFINI;
if(iVueY > INFINI)iVueY=INFINI;else if(iVueY < -INFINI)iVueY=-INFINI;
}
}

Structures et mthodes : implmentation 441


Un certain nombre de procdures globales permettent de passer dun systme de
coordonnes un autre. Par exemple, la procdure globale permettant de passer des
coordonnes carte aux coordonnes vue est la suivante :
void CarteToVue(int iCarteX,int iCarteY,int& iVueX,int& iVueY,int iPrint)
{
if(iPrint)
{
iVueX=(int) (iCarteX*carte.m_dMMToPrint);
iVueY=(int) ((iCarteY - carte.m_iHauteur)*carte.m_dMMToPrint);
}
else
{
iVueX= (int) ((double)(iCarteX - carte.m_iXVueDansCarte)*carte.m_dCoef);
iVueY=config.m_iVueHauteurRes-1 - (int) ((double)(iCarteY carte.m_iYVueDansCarte)*carte.m_dCoef);
}
if(iVueX > INFINI)iVueX=INFINI;else if(iVueX < -INFINI)iVueX=-INFINI;
if(iVueY > INFINI)iVueY=INFINI;else if(iVueY < -INFINI)iVueY=-INFINI;
}

A.2.4.5. La classe CCartExplorateur


La classe CCartExplorateur correspond lexplorateur cartographique dun
cadre. Elle regroupe lensemble des informations permettant de dessiner dans un
cadre partir des objets de la base de donnes. Les paramtres de dessin sont
contenus dans les variables membres de type CDessin, que nous allons dcrire au
paragraphe suivant. La classe CCartExplorateur permet surtout de grer la liste
des relations, masques, ou fonds graphiques dessiner. A chaque entre
correspondent un objet de chaque type dimplantation graphique (CDessinPixel,
CDessinZone, ) contenant les paramtres reliant base de donnes et variables
visuelles, et que nous prsenterons dans le paragraphe suivant.
class CCartExplorateur
{
public:
CDessinPixel* m_pDessinPixel[NB_MAX_DESSIN];
CDessinZone* m_pDessinZone[NB_MAX_DESSIN];
CDessinLigne* m_pDessinLigne[NB_MAX_DESSIN];
CDessinSymbole* m_pDessinSymbole[NB_MAX_DESSIN];
CDessinMasque* m_pDessinMasque[NB_MAX_DESSIN];
CDessinFond* m_pDessinFond[NB_MAX_DESSIN];
int m_iType[NB_MAX_DESSIN];
char m_chNom[NB_MAX_DESSIN][100];
BOOL m_btabTracer[NB_MAX_DESSIN];
private:
CCadre* m_pCadre;
int m_iNbEntree;
public:
CCartExplorateur(CCadre* pCadre);
CCartExplorateur(CCadre* pCadre,FILE* Fichier);
~CCartExplorateur();
void Ecrire(FILE* Fichier);
void AjouterUneRelation(int iNoth);
void AjouterUnMasque(const char *chNomMasque);
void AjouterUnFond(const char *chNomFond);
void SupprimerUneEntree(int iIndex);
int GetNbEntree() {return m_iNbEntree;};
CCadre* GetCadre() {return m_pCadre;};
BOOL IsRelationInside(const char* chNomRelation);
BOOL IsRelationInside(int iNoth);
void MiseAJour();
void TracerUneEntree(CDC* pDC,int iIndex);

442

};

Annexe
void ExporterUneEntreeEnBMP(int iIndex,const char* chNomFichierBMP);
void ToutTracer(CDC* pDC);

A.2.4.6. Les classes CDessin


Les classes CDessin correspondent aux diffrentes implantations graphiques en
cartographie (par pixel, par zone, par ligne, par point). Chaque objet contient
lensemble des paramtres permettant de relier les valeurs des objets de la relation
dessiner et les variables visuelles choisies par lutilisateur. Ces classes contiennent
donc de trs nombreuses variables. Elles contiennent galement les mthodes de
trac ou dimpression, ainsi que les procdures de srialisation de lensemble des
paramtres.
class CDessinPixel
{
//--- classe pour le dessin de pixel
private:
CCadre* m_pCadre;
public:
char m_chNomRelation[100];
//--- type de dessin (palette, valeurs, illumination, rvb)
int m_iDessin;
//--- attribut tracer
int m_iNoatt;
char m_chNomAttribut[100];
//--- trac par palette
int m_iPalNbValeurs;
char m_chPalValeurs[TAILLE_PALETTE_VALEUR][NB_MAX_CHARACTER];
int m_iPalTrame[TAILLE_PALETTE_VALEUR];
int m_iPalCouleur[TAILLE_PALETTE_VALEUR];
//--- trac par valeur
float m_fA;
float m_fB;
int m_iIndexDeCouleur1;
int m_iIndexDeCouleur2;
int m_iIndexDeTrame;
int m_iEtalement;
//--- trac par illumination
int m_iIllumOrientation; //--- en degr
int m_iIllumInclinaison;
double m_dIllumFacteur;
//--- trac avec estompage
int m_iEstompage;
char m_chNomRelationEstompage[100];
char m_chNomAttributEstompage[100];
int m_iInclinaisonEstompage;
int m_iOrientationEstompage;
double m_dFacteurEstompage;
private:
void TracerPalette(CDC* pDC);
void TracerValeur(CDC* pDC);
void TracerIllum(CDC* pDC);
void TracerRVB(CDC* pDC);
void ImprimerPalette(CDC* pDC);
void ImprimerValeur(CDC* pDC);
void ImprimerIllum(CDC* pDC);
void ImprimerRVB(CDC* pDC);
void TracerPaletteRaster(CDC* pDC);
void TracerValeurRaster(CDC* pDC);
void TracerIllumRaster(CDC* pDC);
void TracerRVBRaster(CDC* pDC);
void ExporterPalette(const char* chNomFichier);
void ExporterValeur(const char* chNomFichier);
void ExporterIllum(const char* chNomFichier);
void ExporterRVB(const char* chNomFichier);
public:
CDessinPixel(CCadre* pCadre);
void Lire(FILE* Fichier);

Structures et mthodes : implmentation 443

};

void Ecrire(FILE* Fichier);


void Tracer(CDC* pDC);
void TracerRaster(CDC* pDC);
void Exporter(const char* chNomFichierBmp);
CCadre* GetCadre() {return m_pCadre;};
BOOL MiseAJour();

class CDessinZone
{
//--- classe pour le dessin de zones et contours de zones
private:
CCadre* m_pCadre;
public:
//--- attributs gnraux
char m_chNomRelation[100];
//--- attributs pour le trac de zones par plages
//--- type de dessin (palette, valeurs)
int m_iDessinPlage;
int m_iTypeDessinPlage;
int m_iNoattPlage;
char m_chNomAttributPlage[100];
//--- trac par palette
int m_iPalNbValeursPlage;
char m_chPalValeursPlage[TAILLE_PALETTE_VALEUR][NB_MAX_CHARACTER];
int m_iPalTramePlage[TAILLE_PALETTE_VALEUR];
int m_iPalCouleurPlage[TAILLE_PALETTE_VALEUR];
//--- trac par valeurs
float m_fAPlage;
float m_fBPlage;
int m_iIndexDeCouleur1Plage;
int m_iIndexDeCouleur2Plage;
int m_iIndexDeTrame1Plage;
int m_iIndexDeTrame2Plage;
int m_iEtalementPlage;
//--- trac par trame
float m_fATrame;
float m_fBTrame;
int m_iMotifTrame;
int m_iIntervalle1Trame;
int m_iEpaisseur1Trame;
int m_iIntervalle2Trame;
int m_iEpaisseur2Trame;
COLORREF m_CouleurTrame;
//--- trac avec estompage
int m_iEstompage;
char m_chNomRelationEstompage[100];
char m_chNomAttributEstompage[100];
int m_iInclinaisonEstompage;
int m_iOrientationEstompage;
double m_dFacteurEstompage;
//--- attributs pour le trac des contours des zones
//--- type de dessin (rien, tout, attribut)
int m_iDessinContour;
int m_iIndexDeCouleurContour;
double m_dEpaisseurContour; //--- en mm/100
int m_iTypeDeTraitContour;
int m_iNoattContour;
char m_chNomAttributContour[100];
int m_bDessinArcEgalite;
int m_bDessinArcDifference;
int m_iIndexDeCouleurContourEgalite;
double m_dEpaisseurContourEgalite;
int m_iTypeDeTraitContourEgalite;
int m_iIndexDeCouleurContourDifference;
double m_dEpaisseurContourDifference;
int m_iTypeDeTraitContourDifference;
private:
void TracerPlage(CDC* pDC);
void TracerPlageRaster(CDC* pDC,int iModeSuperposition,CPerspective* pPerspective);
void TracerParEstompage(CDC* pDC);
void TracerContours(CDC* pDC);

444

Annexe

void ImprimerPlage(CDC* pDC);


void ImprimerParEstompage(CDC* pDC);
void ImprimerZones(CDC* pDC);
BOOL ImprimerUneZone(CDC* pDC,FILE* FileArc,COLORREF couleur,int iTrame,int iNbarc,int*
itabPtrarc);
public:
CDessinZone(CCadre* pCadre);
void Lire(FILE* Fichier);
void Ecrire(FILE* Fichier);
void Tracer(CDC* pDC);
void TracerRaster(CDC* pDC,int iModeSuperposition,CPerspective* pPerspective);
CCadre* GetCadre() {return m_pCadre;};
BOOL MiseAJour();
void ExporterParEstompage(const char* chNomFichier);
};
class CDessinLigne
{
//--- classe pour le dessin de ligne
private:
CCadre* m_pCadre;
public:
//--- attributs gnraux
char m_chNomRelation[100];
int m_iDessin;
//--- tous les objets identiques
COLORREF m_Couleur;
int m_iTypeDeTrait;
double m_dEpaisseur;
//--- courbes de niveaux
int m_iTrace1Courbe;
int m_iTrace2Courbe;
double m_dIntervalle1Courbe;
double m_dIntervalle2Courbe;
double m_dEpaisseur1Courbe; //--- en mm/100
double m_dEpaisseur2Courbe; //--- en mm/100
COLORREF m_Couleur1Courbe;
COLORREF m_Couleur2Courbe;
int m_iTraceDesValeurs1Courbe;
int m_iTraceDesValeurs2Courbe;
COLORREF m_CouleurTexte1Courbe;
COLORREF m_CouleurTexte2Courbe;
LOGFONT m_logfontTexte1Courbe;
LOGFONT m_logfontTexte2Courbe;
int m_iSizePointTexte1Courbe; //--- taille en points
int m_iSizePointTexte2Courbe; //--- taille en points
//--- paisseur par attribut numrique, couleur et type constant (ou venant du nominal si
existe)
int m_iNoattNum;
char m_chNomAttributNum[100];
float m_fA;
float m_fB;
int m_iEtalement;
double m_dEpaisseur1; //--- en mm/100
double m_dEpaisseur2; //--- en mm/100
//--- couleur, type, epaisseur par attribut nominal (epaisseur venant du numerique si
existe)
int m_iNoattNom;
char m_chNomAttributNom[100];
int m_iPalNbValeurs;
char m_chtabPalValeurs[TAILLE_PALETTE_VALEUR][NB_MAX_CHARACTER];
int m_tabPalCouleur[TAILLE_PALETTE_VALEUR];
int m_itabPalType[TAILLE_PALETTE_VALEUR];
double m_dtabPalEpaisseur[TAILLE_PALETTE_VALEUR];
public:
CDessinLigne(CCadre* pCadre);
void Lire(FILE* Fichier);
void Ecrire(FILE* Fichier);
void Tracer(CDC* pDC);
CCadre* GetCadre() {return m_pCadre;};
BOOL MiseAJour();
};
class CDessinSymbole
{
//--- classe pour le dessin de symboles et de valeurs

Structures et mthodes : implmentation 445


private:
CCadre* m_pCadre;
void TracerSymboles(CDC* pDC);
void TracerValeurs(CDC* pDC);
void TracerDiagrammes(CDC* pDC);
public:
char m_chNomRelation[100];
//--- attributs gnraux pour les symboles
int m_iNoSymbole;
double m_dEpaisseurSymbole;
double m_dTailleSymbole;
int m_iTrameSymbole;
COLORREF m_CouleurIntSymbole;
COLORREF m_CouleurExtSymbole;
int m_iDetourageSymbole;
int m_iTriSymbole;
//--- attributs pour le dessin de symboles
int m_iDessinSymbole;
int m_iNoattNomSymbole;
int m_iNoattNumSymbole;
char m_chNomAttributNomSymbole[100];
char m_chNomAttributNumSymbole[100];
//--- trac par palette de valeur pour l'attribut nominal ou l'attribut nominal associ
int m_iPalNbValeurs;
char m_chtabPalValeurs[TAILLE_PALETTE_VALEUR][NB_MAX_CHARACTER];
int m_itabPalNoSymbole[TAILLE_PALETTE_VALEUR];
double m_dtabPalEpaisseur[TAILLE_PALETTE_VALEUR]; //--- taille en mm/100
double m_dtabPalTaille[TAILLE_PALETTE_VALEUR]; //--- taille en mm/100
int m_itabPalTrame[TAILLE_PALETTE_VALEUR];
COLORREF m_tabPalCouleurInt[TAILLE_PALETTE_VALEUR];
COLORREF m_tabPalCouleurExt[TAILLE_PALETTE_VALEUR];
//--- trac par valeurs pour attribut numrique
int m_iEtalementSymbole;
int m_iProportionaliteSymbole;
float m_fASymbole;
float m_fBSymbole;
float m_fCSymbole;
double m_dTailleMinSymbole;
double m_dTailleMaxSymbole;
double m_dTaillePourCSymbole;
//--- attributs pour le dessin de valeurs
int m_iDessinTexte;
int m_iNoattTexte;
char m_chNomAttributTexte[100];
COLORREF m_CouleurTexte;
LOGFONT m_logfontTexte;
int m_iSizePointTexte; //--- taille en points
int m_iXDeplacementTexte;
int m_iYDeplacementTexte;
int m_iNbCaracteresTexte;
int m_iDebutTexte;
int m_iNbDecimalesTexte;
BOOL m_bConditionTexte;
char m_chConditionTexte[100];
//--- Attributs pour le dessin de diagrammes sectoriels
int m_iDessinDiagrammes;
int m_iNbAttributDiagrammes;
char m_chtabNomAttributDiagrammes[NB_MAX_ATTRIBUTS][100];
COLORREF m_tabCouleurDiagrammes[NB_MAX_ATTRIBUTS];
COLORREF m_CouleurDuBordDiagrammes;
int m_iTypeDeTailleDiagrammes;
char m_chNomAttributTailleDiagrammes[100];
float m_fCDiagrammes;
double m_dTaillePourCDiagrammes;
int m_iEtalementValeursDiagrammes;
int m_iEtalementTailleDiagrammes;
public:
CDessinSymbole(CCadre* pCadre);
void Lire(FILE* Fichier);
void Ecrire(FILE* Fichier);
void Tracer(CDC* pDC);
CCadre* GetCadre() {return m_pCadre;};
BOOL MiseAJour();
};

446

Annexe

class CDessinMasque
{
//--- classe pour le dessin de masque
private:
CCadre* m_pCadre;
BOOL ImprimerUneZone(CDC* pDC,FILE* FileArc,COLORREF couleur,int iTrame,int iNbarc,int*
itabPtrarc);
public:
//--- attributs gnraux
char m_chNom[100];
int m_bContour;
int m_bInterieur;
int m_bExterieur;
int m_iIndexDeCouleurTrait;
int m_iTypeDeTrait;
double m_dEpaisseurTrait;
int m_iIndexDeCouleurInterieur;
int m_iTrameInterieur;
int m_iIndexDeCouleurExterieur;
int m_iTrameExterieur;
public:
CDessinMasque(CCadre* pCadre);
void Lire(FILE* Fichier);
void Ecrire(FILE* Fichier);
void Tracer(CDC *pDC);
void TracerPlage(CDC *pDC);
void ImprimerPlage(CDC *pDC);
void TracerRaster(CDC *pDC,int iModeSuperposition,CPerspective* pPerspective);
CCadre* GetCadre() {return m_pCadre;};
BOOL MiseAJour();
};
class CDessinFond
{
//--- classe pour le dessin de fond graphique
private:
CCadre* m_pCadre;
public:
//--- attributs gnraux
char m_chNom[100];
int m_bNiveau[256];
public:
CDessinFond(CCadre* pCadre);
void Lire(FILE* Fichier);
void Ecrire(FILE* Fichier);
void Tracer(CDC *pDC);
CCadre* GetCadre() {return m_pCadre;};
BOOL MiseAJour();
};

Par exemple, la classe CDessinPixel permet de tracer ou dimprimer une


relation de type mosaque. Les procdures de tracer sur cran sont quelque peu
diffrentes des procdures de trac sur imprimante : le trac sur cran se fait pixel
par pixel, alors que limpression utilise des procdures de la MFC pour la gestion
des DIB (StretchDibBits()). Les procdures de trac ou dimpression sont
diffrentes selon le type de lattribut reprsenter : si lattribut tracer est nominal,
la procdure TracerPalette() sera utilise pour affecter chaque pixel la
couleur et la trame dfinies par lutilisateur dans la palette de valeur.
TracerValeur() est utilise pour le trac dun attribut numrique (sans palette de
valeurs), TracerIllum() pour tracer un attribut numrique par illumination,
TracerRVB() pour tracer un attribut de type RVB. Par exemple, voici le code de la
procdure TracerIllum() :

Structures et mthodes : implmentation 447

void CDessinPixel::TracerIllum(CDC* pDC)


{
//--- paramtres
double dPI=acos(-1.);
int iPrint=config.IsPrinting(pDC);
CSchema* pSchema=m_pCadre->GetSchema();
int iNoth=pSchema->RelRecherche(m_chNomRelation);
if(iNoth == 0)return;
int iNoatt=pSchema->AttrRecherche(iNoth,m_chNomAttribut);
if(iNoatt == 0)return;
FILE *FileMosaic;
FILE *FileFeuille;
FILE *FileImage;
int iMosaiqueNbcol,iMosaiqueNblig;
double dMosaiqueResolution;
int iTypeAttribut,iDatasize;
int iLargeur,iHauteur,iX,iY;
int iVueX,iVueY;
int iImageX,iImageY,iPrecedentY;
int i,iColor,no,nbcol,nblig;
int ptr,ptrdeb,ptrlib;
double dAvanceX,dAvanceY,dFacteur;
double d1,d2,dZmin,dZmax;
double dXbf,dYbf,dXhf,dYhf;
char chNomFichierFeuille[_MAX_PATH];
char chNomFichierMosaique[_MAX_PATH];
char chNomFichierAttribut[_MAX_PATH];
BYTE bColor;
unsigned char cval1,cval2,cval3,cval4;
short int sval1,sval2,sval3,sval4;
float fval1,fval2,fval3,fval4;
double dCol,dSol,dCil,dSil,dNxl,dNyl,dNzl;
double dA,dB,dNx,dNy,dNz,dNz2,dTeta,dNorme,dAngle;
unsigned char *bufima1,*bufima2;
//--- coordonnees du cadre
double dCadreXbProj,dCadreYbProj,dCadreXhProj,dCadreYhProj;
int iCadreXbVue,iCadreYbVue,iCadreXhVue,iCadreYhVue;
//--- coordonnees de l'imagette
double dImagetteXbProj,dImagetteYbProj,dImagetteXhProj,dImagetteYhProj;
int iImagetteXbVue,iImagetteYbVue,iImagetteXhVue,iImagetteYhVue;
double dImagetteXbImage,dImagetteYbImage;
int iImagetteXbImage,iImagetteYbImage;
strcpy(chNomFichierMosaique,pSchema->m_pRelations[iNoth]->m_chFichZone);
strcat(chNomFichierMosaique,"\\");
strcat(chNomFichierMosaique,pSchema->m_pRelations[iNoth]->m_chNom);
strcat(chNomFichierMosaique,"_d");
//--- lecture des parametres de la mosaique
FileMosaic=OuvrirMosaique(pSchema,chNomFichierMosaique,iNoth);
::SetCursor(LoadCursor(NULL, IDC_WAIT));
if(FileMosaic != NULL)
{
fscanf(FileMosaic,"%lf",&dMosaiqueResolution);
fscanf(FileMosaic,"%d",&iMosaiqueNbcol);
fscanf(FileMosaic,"%d",&iMosaiqueNblig);
fclose(FileMosaic);
}
else return;
int iTemporaire=pSchema->m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iTemporaire;
if(iTemporaire)
{
strcpy(chNomFichierAttribut,carte.m_chNomDir);
strcat(chNomFichierAttribut,"\\");
strcat(chNomFichierAttribut,m_pCadre->m_chNom);
strcat(chNomFichierAttribut,"\\ft");
strcat(chNomFichierAttribut,pSchema->m_pRelations[iNoth]->m_chNom);
strcat(chNomFichierAttribut,"_");
strcat(chNomFichierAttribut,pSchema->m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_chNom);
}
else
{
strcpy(chNomFichierAttribut,pSchema->m_pRelations[iNoth]->m_chFichZone);

448

Annexe
strcat(chNomFichierAttribut,"\\");
strcat(chNomFichierAttribut,pSchema->m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_chNom);
}

strcpy(chNomFichierFeuille,chNomFichierAttribut);
strcat(chNomFichierFeuille,"_f");
FileFeuille=fopen(chNomFichierFeuille,"rb");
FileImage=fopen(chNomFichierAttribut,"rb");
if(FileImage == NULL || FileFeuille == NULL)
{
if(FileImage != NULL)fclose(FileImage);
if(FileFeuille != NULL)fclose(FileFeuille);
return;
}
//--- caracteristiques du cadre dans la vue
dCadreXbProj=m_pCadre->m_dFgxb;
dCadreYbProj=m_pCadre->m_dFgyb;
dCadreXhProj=m_pCadre->m_dFgxh;
dCadreYhProj=m_pCadre->m_dFgyh;
iLargeur=(int) ((dCadreXhProj-dCadreXbProj)*m_pCadre->m_dEchelleMM);
iHauteur=(int) ((dCadreYhProj-dCadreYbProj)*m_pCadre->m_dEchelleMM);
::CarteToVue(m_pCadre->m_iXDansCarte,m_pCadre>m_iYDansCarte,iCadreXbVue,iCadreYbVue,iPrint);
iX=m_pCadre->m_iXDansCarte + iLargeur;
iY=m_pCadre->m_iYDansCarte + iHauteur;
::CarteToVue(iX,iY,iCadreXhVue,iCadreYhVue,iPrint);
::Ordonner(iCadreYbVue,iCadreYhVue);
if(iCadreXhVue < 0 || iCadreXbVue >= config.m_iVueLargeurRes || iCadreYhVue < 0 ||
iCadreYbVue >= config.m_iVueHauteurRes)
{
fclose(FileImage);
fclose(FileFeuille);
return;
}
if((iCadreXhVue-iCadreXbVue) == 0 || (iCadreYhVue-iCadreYbVue) == 0)
{
fclose(FileImage);
fclose(FileFeuille);
return;
}
//--- allocation memoire
iDatasize=1;
iTypeAttribut=pSchema->m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iType;
if(iTypeAttribut == 1 || iTypeAttribut == 5 || iTypeAttribut == 6)iDatasize=1;
else if(iTypeAttribut == 7)iDatasize=2;
else if(iTypeAttribut == 8)iDatasize=3;
else if(iTypeAttribut == 9)iDatasize=4;
bufima1=(unsigned char *) malloc(iMosaiqueNbcol*iDatasize);
bufima2=(unsigned char *) malloc(iMosaiqueNbcol*iDatasize);
if(bufima1 == NULL || bufima2 == NULL)
{
::ErreurDeMemoire();
if(bufima1 != NULL)free(bufima1);
if(bufima2 != NULL)free(bufima2);
fclose(FileImage);
fclose(FileFeuille);
return;
}
//--- facteur de lecture
double dFpix;
d1=(dCadreXhProj-dCadreXbProj)/((double)(iCadreXhVue-iCadreXbVue));
d2=(dCadreYhProj-dCadreYbProj)/((double)(iCadreYhVue-iCadreYbVue));
if(d1 < d2)dFpix=d2; else dFpix=d1;
dFacteur=dFpix/dMosaiqueResolution;
//--- parametres de visualisation
dAngle=(double) m_iIllumOrientation;
dAngle=dAngle+90.; //--- pour rattraper mon erreur...
if(dAngle > 360.)dAngle=dAngle-360.;
dAngle = (dAngle/180.)*dPI;
dCol= cos(dAngle);

Structures et mthodes : implmentation 449


dSol= sin(dAngle);
dAngle = (double) (m_iIllumInclinaison/180.)*dPI;
dCil = cos(dAngle);
dSil = sin(dAngle);
dNxl=dCil*dSol;
dNyl=(-1.)*dCil*dCol;
dNzl=dSil;
dNz= 2.*dMosaiqueResolution/m_dIllumFacteur;
dNz2=dNz*dNz;
//--- lecture des feuilles
BOOL bInconnu;
fscanf(FileFeuille,"%2d%20d%*c",&i,&ptrlib);
while(fscanf(FileFeuille,"%2d%20lf%20lf%10d%10d%20lf%20lf%20d%*c",
&no,&dXbf,&dYbf,&nbcol,&nblig,&dZmin,&dZmax,&ptrdeb) == 8)
{
if(no != 0)
{
dXhf=dXbf + (dMosaiqueResolution*(double) iMosaiqueNbcol);
dYhf=dYbf + (dMosaiqueResolution*(double) iMosaiqueNblig);
if(dXhf >= dCadreXbProj && dXbf <= dCadreXhProj && dYhf >= dCadreYbProj && dYbf <=
dCadreYhProj)
{
//--- au moins un bout de l'imagette dans le cadre
m_pCadre->ProjToVue(dXbf,dYbf,iImagetteXbVue,iImagetteYbVue);
m_pCadre->ProjToVue(dXhf,dYhf,iImagetteXhVue,iImagetteYhVue);
::Ordonner(iImagetteYbVue,iImagetteYhVue);
if(iImagetteXbVue
if(iImagetteXhVue
if(iImagetteYbVue
if(iImagetteYhVue

<
>
<
>

iCadreXbVue)iImagetteXbVue=iCadreXbVue;
iCadreXhVue)iImagetteXhVue=iCadreXhVue;
iCadreYbVue)iImagetteYbVue=iCadreYbVue;
iCadreYhVue)iImagetteYhVue=iCadreYhVue;

if(iImagetteXhVue >= 0 && iImagetteXbVue < config.m_iVueLargeurRes && iImagetteYhVue


>= 0 && iImagetteYbVue < config.m_iVueHauteurRes)
{
//--- au moins un bout de l'imagette dans la vue
if(iImagetteXbVue < 0)iImagetteXbVue=0;
if(iImagetteXhVue >=
config.m_iVueLargeurRes)iImagetteXhVue=config.m_iVueLargeurRes-1;
if(iImagetteYbVue < 0)iImagetteYbVue=0;
if(iImagetteYhVue >=
config.m_iVueHauteurRes)iImagetteYhVue=config.m_iVueHauteurRes-1;
//--- coordonnes du trac en projection
m_pCadre>VueToProj(iImagetteXbVue,iImagetteYhVue,dImagetteXbProj,dImagetteYbProj);
m_pCadre>VueToProj(iImagetteXhVue,iImagetteYhVue,dImagetteXhProj,dImagetteYhProj);
::Ordonner(dImagetteYbProj,dImagetteYhProj);
//--- coordonnes du trac dans l'image
if(dXbf >= dImagetteXbProj)dImagetteXbImage=0.;
else dImagetteXbImage=(dImagetteXbProj - dXbf)/dMosaiqueResolution;
if(dYbf >= dImagetteYbProj)dImagetteYbImage=0.;
else dImagetteYbImage=(dImagetteYbProj - dYbf)/dMosaiqueResolution;
iImagetteXbImage=(int) (dImagetteXbImage);
iImagetteYbImage=(int) (dImagetteYbImage);
//--- trac de l'image
dAvanceY=dImagetteYbImage - (double)iImagetteYbImage;
iImageY=0;
iPrecedentY=-1;
int iNbcolALire=nbcol-iImagetteXbImage;
iVueY=iImagetteYhVue;
while(iVueY >= iImagetteYbVue && iImageY < nblig)
{
//--- lire la ligne
if(iImageY != iPrecedentY)
{
if(iImageY < nblig-1)
{
ptr=ptrdeb+(iImagetteXbImage+(iImageY*nbcol))*iDatasize;
fseek(FileImage,ptr,SEEK_SET);
fread(bufima1,iNbcolALire,iDatasize,FileImage);
ptr=ptrdeb+(iImagetteXbImage+((iImageY+1)*nbcol))*iDatasize;

450

Annexe
fseek(FileImage,ptr,SEEK_SET);
fread(bufima2,iNbcolALire,iDatasize,FileImage);
}
else
{
ptr=ptrdeb+(iImagetteXbImage+((iImageY-1)*nbcol))*iDatasize;
fseek(FileImage,ptr,SEEK_SET);
fread(bufima1,iNbcolALire,iDatasize,FileImage);

ptr=ptrdeb+(iImagetteXbImage+(iImageY*nbcol))*iDatasize;
fseek(FileImage,ptr,SEEK_SET);
fread(bufima2,iNbcolALire,iDatasize,FileImage);
}

dAvanceX=dImagetteXbImage-(double)iImagetteXbImage;
iImageX=0;
iVueX=iImagetteXbVue;
while(iVueX < iImagetteXhVue && iImageX < iNbcolALire-1)
{
bInconnu=FALSE;
if(iTypeAttribut == 6)
{
memcpy(&cval1,&bufima1[iImageX],1);
memcpy(&cval2,&bufima1[iImageX+1],1);
memcpy(&cval3,&bufima2[iImageX],1);
memcpy(&cval4,&bufima2[iImageX+1],1);
if(cval1 == CINCONNU || cval2 == CINCONNU || cval3 == CINCONNU || cval4 ==
CINCONNU)bInconnu=TRUE;
else
{
fval1=(float) cval1;
fval2=(float) cval2;
fval3=(float) cval3;
fval4=(float) cval4;
}
}
else if(iTypeAttribut == 7)
{
memcpy(&sval1,&bufima1[iImageX*iDatasize],iDatasize);
memcpy(&sval2,&bufima1[(iImageX+1)*iDatasize],iDatasize);
memcpy(&sval3,&bufima2[iImageX*iDatasize],iDatasize);
memcpy(&sval4,&bufima2[(iImageX+1)*iDatasize],iDatasize);
if(sval1 == SINCONNU || sval2 == SINCONNU || sval3 == SINCONNU || sval4 ==
SINCONNU)bInconnu=TRUE;
else
{
fval1=(float) sval1;
fval2=(float) sval2;
fval3=(float) sval3;
fval4=(float) sval4;
}
}
else if(iTypeAttribut == 8)
{
bInconnu=TRUE;
}
else if(iTypeAttribut == 9)
{
memcpy(&fval1,&bufima1[iImageX*iDatasize],iDatasize);
memcpy(&fval2,&bufima1[(iImageX+1)*iDatasize],iDatasize);
memcpy(&fval3,&bufima2[iImageX*iDatasize],iDatasize);
memcpy(&fval4,&bufima2[(iImageX+1)*iDatasize],iDatasize);
if(fval1 <= FINCONNU || fval2 <= FINCONNU || fval3 <= FINCONNU || fval4 <=
FINCONNU)bInconnu=TRUE;
}
if(bInconnu == FALSE)
{
dA=(double) (fval4-fval1);
dB=(double) (fval2-fval3);
dNx= (dB-dA);
dNy= -(dA+dB);
dNorme= sqrt(dNx*dNx + dNy*dNy + dNz2);
dTeta= dNx*dNxl + dNy*dNyl + dNz*dNzl;
dTeta= dTeta/dNorme;
if(config.m_iPalette == 0)
{
//--- pas de palette de couleur, valeur directe de gris
bColor = (BYTE) (127.*dTeta + 128.);

Structures et mthodes : implmentation 451


pDC->SetPixelV(iVueX,iVueY,RGB(bColor,bColor,bColor));
}
else
{
iColor = (int) (PALETTE_IMAGE_MIN + 60.*dTeta +61.);
pDC->SetPixelV(iVueX,iVueY,PALETTEINDEX((WORD)iColor));
}
}
dAvanceX+=dFacteur;
iImageX=(int)dAvanceX;
iVueX++;
}
while(iVueX < iImagetteXhVue)
{
pDC->SetPixelV(iVueX,iVueY,PALETTEINDEX((WORD)iColor));
iVueX++;
}

iPrecedentY=iImageY;
dAvanceY+=dFacteur;
iImageY=iImagetteYbImage + (int)dAvanceY;
iVueY--;
}

}
free(bufima1);
free(bufima2);
fclose(FileImage);
fclose(FileFeuille);
}

Le trac de zones sur lcran utilise limage matricielle interne de la relation. La


couleur et la trame de chaque pixel sont dtermines par la valeur de la zone
correspondante. La vitesse du trac est ainsi trs rapide. Par contre, limpression
utilise les arcs constituant le contour des objets pour conserver une prcision
optimale, mais lalgorithme doit recrer le contour de chaque zone :
void CDessinZone::ImprimerZones(CDC* pDC)
{
if(m_iDessinPlage == 0)return;
int iPrint=config.IsPrinting(pDC);
if(iPrint == 0)return;
if(m_iEstompage != 0 && strlen(m_chNomRelationEstompage) != 0 &&
strlen(m_chNomAttributEstompage) != 0)
{
ImprimerParEstompage(pDC);
return;
}
pDC->SetPolyFillMode(ALTERNATE);
//--- paramtres gnraux
int iXb,iYb,iXh,iYh;
int i,iNoth,iNoatt,iX,iY,iLargeur,iHauteur;
int iCadreXbVue,iCadreYbVue,iCadreXhVue,iCadreYhVue;
double dCadreXbProj,dCadreYbProj,dCadreXhProj,dCadreYhProj;
CSchema* pSchema=m_pCadre->GetSchema();
CWind* pWind=m_pCadre->GetWind();
iNoth=pSchema->RelRecherche(m_chNomRelation);
if(iNoth == 0)return;
iNoatt=pSchema->AttrRecherche(iNoth,m_chNomAttributPlage);
if(iNoatt == 0)return;
//--- caracteristiques du cadre
dCadreXbProj=m_pCadre->m_dFgxb;
dCadreYbProj=m_pCadre->m_dFgyb;
dCadreXhProj=m_pCadre->m_dFgxh;
dCadreYhProj=m_pCadre->m_dFgyh;

452

Annexe

iLargeur=(int) ((dCadreXhProj-dCadreXbProj)*m_pCadre->m_dEchelleMM);
iHauteur=(int) ((dCadreYhProj-dCadreYbProj)*m_pCadre->m_dEchelleMM);
::CarteToVue(m_pCadre->m_iXDansCarte,m_pCadre>m_iYDansCarte,iCadreXbVue,iCadreYbVue,iPrint);
iX=m_pCadre->m_iXDansCarte + iLargeur;
iY=m_pCadre->m_iYDansCarte + iHauteur;
::CarteToVue(iX,iY,iCadreXhVue,iCadreYhVue,iPrint);
::Ordonner(iCadreYbVue,iCadreYhVue);
::CarteToVue(0,0,iXb,iYb,iPrint);
::CarteToVue(carte.m_iLargeur,carte.m_iHauteur,iXh,iYh,iPrint);
::Ordonner(iYb,iYh);
//--- le cadre est-il dans la carte ?
if(iCadreXhVue < iXb || iCadreXbVue >= iXh || iCadreYhVue < iYb || iCadreYbVue >=
iYh)return;
//--- la fenetre d'etude est-elle dans le cadre ?
if(pWind->m_dFhx < dCadreXbProj || pWind->m_dFlx >= dCadreXhProj || pWind->m_dFhy <
dCadreYbProj || pWind->m_dFly >= dCadreYhProj)return;
int iNbMaxArcParFeuille=pSchema->m_pRelations[iNoth]->NbMaxArcsParFeuille();
int* itabNz1=(int *) malloc(iNbMaxArcParFeuille*sizeof(int));
int* itabNz2=(int *) malloc(iNbMaxArcParFeuille*sizeof(int));
int* itabPtrarc=(int *) malloc(iNbMaxArcParFeuille*sizeof(int));
int* itabPtr=(int *) malloc(iNbMaxArcParFeuille*sizeof(int));
if(itabNz1 == NULL || itabNz2 == NULL || itabPtrarc == NULL || itabPtr == NULL)
{
::ErreurDeMemoire();
if(itabNz1 !=
if(itabNz2 !=
if(itabPtrarc
if(itabPtr !=
return;
}

NULL)free(itabNz1);
NULL)free(itabNz2);
!= NULL)free(itabPtrarc);
NULL)free(itabPtr);

BOOL bTrouve;
int iSizeIdentifiantTuple;
int iIndexDeCouleur,iTrame,iValeur;
int nz,iNz1,iNz2;
int iObjet,iNbObj,iPtrObj,iNbarc,iPtr,iArc,iPtrarc,iPtrsuiv;
int iIndexMin;
long lAdresse;
float fU;
float xc,yc,xb,yb,xh,yh;
float fXb,fYb,fXh,fYh;
float fValeur,v[NB_MAX_ATTRIBUTS];
char chNomValeur[128];
FILE* FileValeurs;
FILE* FileFeuille;
FILE* FileDescriptif;
FILE* FileArc;
CArc arc;
int
int
int
int
int
int
int
int

iTypeRelation=pSchema->m_pRelations[iNoth]->m_iType;
iTypeAttribut=pSchema->m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iType;
iNb0=pSchema->m_pRelations[iNoth]->m_iNb0;
iNba=pSchema->m_pRelations[iNoth]->m_iNba;
iNovar=pSchema->m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iNumero;
iNbcarAttr=pSchema->m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iNbcar;
iNbvalb=pSchema->m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iNbvalb;
iPtrval=pSchema->m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iPtrval;

FileValeurs=NULL;
if(iTypeAttribut == 4)
{
//--- trace par valeurs numeriques
iIndexMin=0;
if(m_iIndexDeCouleur2Plage >= m_iIndexDeCouleur1Plage)
{
switch(m_iEtalementPlage)
{
case 0:
default:
fU=((float)(m_iIndexDeCouleur2Plage-m_iIndexDeCouleur1Plage))/(m_fBPlagem_fAPlage);

Structures et mthodes : implmentation 453


break;
case 1:
fU=((float)(m_iIndexDeCouleur2Plagem_iIndexDeCouleur1Plage))/(float)log(1.+m_fBPlage-m_fAPlage);
break;
case 2:
fU=((float)(m_iIndexDeCouleur2Plagem_iIndexDeCouleur1Plage))/(float)sqrt(m_fBPlage-m_fAPlage);
break;
}
iIndexMin=m_iIndexDeCouleur1Plage;
}
else
{
switch(m_iEtalementPlage)
{
case 0:
default:
fU=((float)(m_iIndexDeCouleur1Plage-m_iIndexDeCouleur2Plage))/(m_fBPlagem_fAPlage);
break;
case 1:
fU=((float)(m_iIndexDeCouleur1Plagem_iIndexDeCouleur2Plage))/(float)log(1.+m_fBPlage-m_fAPlage);
break;
case 2:
fU=((float)(m_iIndexDeCouleur1Plagem_iIndexDeCouleur2Plage))/(float)sqrt(m_fBPlage-m_fAPlage);
break;
}

iIndexMin=m_iIndexDeCouleur2Plage;
}

else if(iTypeAttribut == 1 || iTypeAttribut == 5)


{
//--- attribut nominal, trac par palette de valeurs
if(iTypeAttribut == 1)FileValeurs=fopen(base.m_chNomFichierValeurs,"rb");
else FileValeurs=fopen(pSchema->m_chNomFtval,"rb");
}
//--- dbut
iSizeIdentifiantTuple=SIZEINT + 6*SIZECOOR;
if(iTypeRelation == 4)
{
FileFeuille=fopen(pSchema->m_pRelations[iNoth]->m_chFichFeuille,"rb");
FileDescriptif=fopen(pSchema->m_pRelations[iNoth]->m_chFichZone,"rb");
FileArc=fopen(pSchema->m_pRelations[iNoth]->m_chFichArc,"rb");
while(fscanf(FileFeuille,"%*17c%8f%8f%8f%8f%8i%8i%8i%8i%*c",&fXb,&fYb,&fXh,&fYh,&iNbObj,&iPt
rObj,&iNbarc,&iPtrarc) == 8)
{
if(fXh >= pWind->m_fFx1 && fXb <= pWind->m_fFx2 && fYh >= pWind->m_fFy1 && fYb <=
pWind->m_fFy2)
{
iPtr=iPtrarc;
iArc=0;
while(iArc < iNbarc)
{
arc.LireEntete(FileArc,iPtr,iNz1,iNz2,iPtrsuiv);
itabNz1[iArc]=iNz1;
itabNz2[iArc]=iNz2;
itabPtrarc[iArc]=iPtr;
iArc++;
iPtr=iPtrsuiv;
}
iPtr=(iPtrObj-1)*(iNb0*SIZEVAL + iSizeIdentifiantTuple);
fseek(FileDescriptif,iPtr,SEEK_SET);
iObjet=0;
while(iObjet < iNbObj)
{
fread(&nz,SIZEINT,1,FileDescriptif);
fread(&xc,SIZECOOR,1,FileDescriptif);
fread(&yc,SIZECOOR,1,FileDescriptif);
fread(&xb,SIZECOOR,1,FileDescriptif);
fread(&yb,SIZECOOR,1,FileDescriptif);

454

Annexe
fread(&xh,SIZECOOR,1,FileDescriptif);
fread(&yh,SIZECOOR,1,FileDescriptif);
for(i=1;i <= iNb0;i++)fread(&v[i],SIZEVAL,1,FileDescriptif);
iObjet++;

nz=UnixToDos(nz);
xc=UnixToDos(xc);
yc=UnixToDos(yc);
xb=UnixToDos(xb);
yb=UnixToDos(yb);
xh=UnixToDos(xh);
yh=UnixToDos(yh);
if(xh >= pWind->m_fFx1 && xb <= pWind->m_fFx2 && yh >= pWind->m_fFy1 && yb <=
pWind->m_fFy2)
{
for(i=1;i <= iNb0;i++)v[i]=UnixToDos(v[i]);
//--- couleur et trame de la zone nz
iIndexDeCouleur=-1;
iTrame=m_iIndexDeTrame1Plage;
if(iTypeAttribut == 4)
{
//--- attribut numrique
fValeur=v[iNovar];
if(fValeur > FINCONNU && fValeur >= m_fAPlage && fValeur <= m_fBPlage)
{
switch(m_iEtalementPlage)
{
case 0:
default:
iIndexDeCouleur=int((fU*(fValeur-m_fAPlage)) + iIndexMin);
break;
case 1:
iIndexDeCouleur=int((fU*(float)log(1+fValeur-m_fAPlage)) + iIndexMin);
break;
case 2:
iIndexDeCouleur=int((fU*(float)sqrt(fValeur-m_fAPlage)) + iIndexMin);
break;
}
}
}
else if(iTypeAttribut == 1 || iTypeAttribut == 5)
{
//--- attribut nominal, trac par palette de valeurs
iValeur= (int) (v[iNovar] + 0.1);
if(iValeur > 0)
{
lAdresse=(iPtrval+iValeur-2)*iNbcarAttr;
fseek(FileValeurs,lAdresse,SEEK_SET);
fread(chNomValeur,iNbcarAttr,1,FileValeurs);
chNomValeur[iNbcarAttr]=0;
strstrip(chNomValeur);
}
else
{
switch(config.m_iLangage)
{
case FRANCAIS:
default:
strcpy(chNomValeur,"valeur manquante");
break;
case ESPAGNOL:
strcpy(chNomValeur,"valor faltante");
break;
case ANGLAIS:
strcpy(chNomValeur,"unknow value");
break;
}
}
bTrouve=FALSE;
i=0;
while(i < m_iPalNbValeursPlage && bTrouve == FALSE)
{
if(strcmp(m_chPalValeursPlage[i],chNomValeur) == 0)
{
bTrouve=TRUE;
iIndexDeCouleur=m_iPalCouleurPlage[i];
iTrame=m_iPalTramePlage[i];

Structures et mthodes : implmentation 455

}
i++;
}

if(iIndexDeCouleur != -1)
{
//--- chainage de la zone en tches et impression
int iNbarcDeLaZone=0;
for(iArc=0;iArc < iNbarc;iArc++)
{
if(itabNz1[iArc] == nz || itabNz2[iArc] == nz)
{
itabPtr[iNbarcDeLaZone]=itabPtrarc[iArc];
iNbarcDeLaZone++;
}
}
COLORREF
Couleur=PALETTERGB(palette.rouge[iIndexDeCouleur],palette.vert[iIndexDeCouleur],palette.bleu[i
IndexDeCouleur]);
ImprimerUneZone(pDC,FileArc,Couleur,iTrame,iNbarcDeLaZone,itabPtr);
}
}
}
}
}
fclose(FileFeuille);
fclose(FileDescriptif);
fclose(FileArc);
}
else if(iTypeRelation == 14 || iTypeRelation == 24)
{
int iNo=pSchema->m_pRelations[iNoth]->m_iNoFichDescriptif;
FileDescriptif=fopen(pSchema->m_chFprovDescriptif[iNo],"rb");
iNo=pSchema->m_pRelations[iNoth]->m_iNoFichArc;
if(iNo == -1)FileArc=fopen(pSchema->m_pRelations[iNoth]->m_chFichArc,"rb");
else FileArc=fopen(pSchema->m_chFprovArc[iNo],"rb");
fread(&iNbarc,SIZEINT,1,FileDescriptif);
fread(&iPtrarc,SIZEINT,1,FileDescriptif);
while(iNbarc > 0)
{
//--- lire les arcs de la feuille
iPtr=iPtrarc;
iArc=0;
while(iArc < iNbarc)
{
arc.LireEntete(FileArc,iPtr,iNz1,iNz2,iPtrsuiv);
itabNz1[iArc]=iNz1;
itabNz2[iArc]=iNz2;
itabPtrarc[iArc]=iPtr;
iPtr=iPtrsuiv;
iArc++;
}
fread(&nz,SIZEINT,1,FileDescriptif);
fread(&xc,SIZECOOR,1,FileDescriptif);
fread(&yc,SIZECOOR,1,FileDescriptif);
fread(&xb,SIZECOOR,1,FileDescriptif);
fread(&yb,SIZECOOR,1,FileDescriptif);
fread(&xh,SIZECOOR,1,FileDescriptif);
fread(&yh,SIZECOOR,1,FileDescriptif);
for(i=1;i <= iNba;i++)fread(&v[i],SIZEVAL,1,FileDescriptif);
while(nz > 0)
{
if(xh >= pWind->m_fFx1 && xb <= pWind->m_fFx2 && yh >= pWind->m_fFy1 && yb <= pWind>m_fFy2)
{
//--- couleur et trame de la zone nz
iIndexDeCouleur=-1;
iTrame=m_iIndexDeTrame1Plage;
if(iTypeAttribut == 4)
{
//--- attribut numrique
fValeur=v[iNovar];
if(fValeur > FINCONNU && fValeur >= m_fAPlage && fValeur <= m_fBPlage)
{

456

Annexe

switch(m_iEtalementPlage)
{
case 0:
default:
iIndexDeCouleur=int((fU*(fValeur-m_fAPlage)) + iIndexMin);
break;
case 1:
iIndexDeCouleur=int((fU*(float)log(1+fValeur-m_fAPlage)) + iIndexMin);
break;
case 2:
iIndexDeCouleur=int((fU*(float)sqrt(fValeur-m_fAPlage)) + iIndexMin);
break;
}
}

else if(iTypeAttribut == 1 || iTypeAttribut == 5)


{
//--- attribut nominal, trac par palette de valeurs
iValeur= (int) (v[iNovar] + 0.1);
if(iValeur > 0)
{
lAdresse=(iPtrval+iValeur-2)*iNbcarAttr;
fseek(FileValeurs,lAdresse,SEEK_SET);
fread(chNomValeur,iNbcarAttr,1,FileValeurs);
chNomValeur[iNbcarAttr]=0;
strstrip(chNomValeur);
}
else
{
switch(config.m_iLangage)
{
case FRANCAIS:
default:
strcpy(chNomValeur,"valeur manquante");
break;
case ESPAGNOL:
strcpy(chNomValeur,"valor faltante");
break;
case ANGLAIS:
strcpy(chNomValeur,"unknow value");
break;
}
}
bTrouve=FALSE;
i=0;
while(i < m_iPalNbValeursPlage && bTrouve == FALSE)
{
if(strcmp(m_chPalValeursPlage[i],chNomValeur) == 0)
{
bTrouve=TRUE;
iIndexDeCouleur=m_iPalCouleurPlage[i];
iTrame=m_iPalTramePlage[i];
}
i++;
}
}
if(iIndexDeCouleur != -1)
{
//--- chainage de la zone en tches et impression
int iNbarcDeLaZone=0;
for(iArc=0;iArc < iNbarc;iArc++)
{
if(itabNz1[iArc] == nz || itabNz2[iArc] == nz)
{
itabPtr[iNbarcDeLaZone]=itabPtrarc[iArc];
iNbarcDeLaZone++;
}
}
COLORREF
Couleur=PALETTERGB(palette.rouge[iIndexDeCouleur],palette.vert[iIndexDeCouleur],palette.bleu[i
IndexDeCouleur]);
ImprimerUneZone(pDC,FileArc,Couleur,iTrame,iNbarcDeLaZone,itabPtr);
}
}
fread(&nz,SIZEINT,1,FileDescriptif);
fread(&xc,SIZECOOR,1,FileDescriptif);

Structures et mthodes : implmentation 457


fread(&yc,SIZECOOR,1,FileDescriptif);
fread(&xb,SIZECOOR,1,FileDescriptif);
fread(&yb,SIZECOOR,1,FileDescriptif);
fread(&xh,SIZECOOR,1,FileDescriptif);
fread(&yh,SIZECOOR,1,FileDescriptif);
for(i=1;i <= iNba;i++)fread(&v[i],SIZEVAL,1,FileDescriptif);
}
fread(&iNbarc,SIZEINT,1,FileDescriptif);
fread(&iPtrarc,SIZEINT,1,FileDescriptif);
}
fclose(FileDescriptif);
fclose(FileArc);
}
if(FileValeurs != NULL)fclose(FileValeurs);
free(itabNz1);
free(itabNz2);
free(itabPtrarc);
free(itabPtr);
}
BOOL CDessinZone::ImprimerUneZone(CDC* pDC,FILE* FileArc,COLORREF Couleur,int iTrame,int
iNbArc,int* itabPtrarc)
{
//--- impression d'une zone avec chainage par tche
double* dtabX1=(double *) malloc(sizeof(double)*iNbArc);
double* dtabY1=(double *) malloc(sizeof(double)*iNbArc);
double* dtabX2=(double *) malloc(sizeof(double)*iNbArc);
double* dtabY2=(double *) malloc(sizeof(double)*iNbArc);
BOOL *btabLibre=(BOOL *) malloc(sizeof(BOOL)*iNbArc);
BOOL *btabSens=(BOOL *) malloc(sizeof(int)*iNbArc);
int *itabPtrTache=(int *) malloc(sizeof(int)*iNbArc);
//--- vrification des allocations mmoire
if(dtabX1 == NULL || dtabY1 == NULL || dtabX2 == NULL || dtabY2 == NULL || btabLibre == NULL
|| btabSens == NULL || itabPtrTache == NULL)
{
if(dtabX1 != NULL)free(dtabX1);
if(dtabY1 != NULL)free(dtabY1);
if(dtabX2 != NULL)free(dtabX2);
if(dtabY2 != NULL)free(dtabY2);
if(btabLibre != NULL)free(btabLibre);
if(btabSens != NULL)free(btabSens);
if(itabPtrTache != NULL)free(itabPtrTache);
return FALSE;
}
//--- initialisations
CArc arc;
float fX1,fY1,fX2,fY2;
for(int iArc=0;iArc < iNbArc;iArc++)
{
arc.LireBout(FileArc,itabPtrarc[iArc],fX1,fY1,fX2,fY2);
dtabX1[iArc]=fX1;
dtabY1[iArc]=fY1;
dtabX2[iArc]=fX2;
dtabY2[iArc]=fY2;
btabLibre[iArc]=TRUE;
}
//--- bounding box de la zone
int iXbZone,iYbZone,iXhZone,iYhZone;
int iXbArc,iYbArc,iXhArc,iYhArc;
if(iTrame > 1)
{
for(iArc=0;iArc < iNbArc;iArc++)
{
arc.LirePoints(FileArc,itabPtrarc[iArc]);
arc.CalculBBox(pDC,m_pCadre,iXbArc,iYbArc,iXhArc,iYhArc);
if(iArc == 0)
{
iXbZone=iXbArc;
iYbZone=iYbArc;
iXhZone=iXhArc;
iYhZone=iYhArc;
}
else

458

Annexe

{
if(iXbArc
if(iXhArc
if(iYbArc
if(iYhArc
}

<
>
<
>

iXbZone)iXbZone=iXbArc;
iXhZone)iXhZone=iXhArc;
iYbZone)iYbZone=iYbArc;
iYhZone)iYhZone=iYhArc;

pDC->BeginPath();
//--- chainage par tche
double dXDebut,dYDebut,dXFin,dYFin;
int iNbTachesNonFermees=0;
CTrame trame;
trame.Set(iTrame);
iArc=0;
while(iArc < iNbArc)
{
//--- chainage par ring
while(iArc < iNbArc && btabLibre[iArc] == FALSE)iArc++;
if(iArc == iNbArc)break;
//--- dbut du ring
dXDebut=dtabX1[iArc];
dYDebut=dtabY1[iArc];
dXFin=dtabX2[iArc];
dYFin=dtabY2[iArc];
int iNbarcTache=0;
itabPtrTache[iNbarcTache]=itabPtrarc[iArc];
btabSens[iNbarcTache]=0;
iNbarcTache++;
btabLibre[iArc]=FALSE;
iArc++;
BOOL bFerme=FALSE;
if(dXDebut == dXFin && dYDebut == dYFin)bFerme=TRUE;
int jArc=iArc;
while(jArc < iNbArc && bFerme == FALSE)
{
if(btabLibre[jArc] == TRUE)
{
if(dtabX1[jArc] == dXFin && dtabY1[jArc] == dYFin)
{
itabPtrTache[iNbarcTache]=itabPtrarc[jArc];
btabSens[iNbarcTache]=0;
iNbarcTache++;
dXFin=dtabX2[jArc];
dYFin=dtabY2[jArc];
btabLibre[jArc]=FALSE;
jArc=iArc;
if(dXFin == dXDebut && dYFin == dYDebut)bFerme=TRUE;
}
else if(dtabX2[jArc] == dXFin && dtabY2[jArc] == dYFin)
{
itabPtrTache[iNbarcTache]=itabPtrarc[jArc];
btabSens[iNbarcTache]=1;
iNbarcTache++;
dXFin=dtabX1[jArc];
dYFin=dtabY1[jArc];
btabLibre[jArc]=FALSE;
jArc=iArc;
if(dXFin == dXDebut && dYFin == dYDebut)bFerme=TRUE;
}
else jArc++;
}
else jArc++;
}
//--- fin du chainage d'une tche, criture du polygone dans le path
if(bFerme)
{
//--- allocation mmoire pour le bigarc
int iNbpt=0;
int iNbptTotal=0;
for(int i=0;i < iNbarcTache;i++)
{
iNbpt=arc.LireNbpt(FileArc,itabPtrTache[i]);
iNbptTotal+=iNbpt;
}

Structures et mthodes : implmentation 459


CPoint* tabPoint=(CPoint *) malloc(sizeof(CPoint)*iNbptTotal);
if(tabPoint == NULL)return FALSE;
//--- chainage dans le bigarc
int iNbptPolygon=0;
for(i=0;i < iNbarcTache;i++)
{
arc.LirePoints(FileArc,itabPtrTache[i]);
arc.Chainer(pDC,m_pCadre,btabSens[i],iNbptPolygon,tabPoint);
}
//--- tracer dans le path
pDC->Polygon(tabPoint,iNbptPolygon);
free(tabPoint);
}
else iNbTachesNonFermees++;
}
pDC->EndPath();
free(dtabX1);
free(dtabY1);
free(dtabX2);
free(dtabY2);
free(btabLibre);
free(btabSens);
free(itabPtrTache);
if(iNbTachesNonFermees == 0)
{
//--- remplir avec la couleur
CBrush brosse,*pBrosseOld;
if(iTrame == 1)
{
brosse.CreateSolidBrush(Couleur);
pBrosseOld=(CBrush *) pDC->SelectObject(&brosse);
pDC->FillPath();
pDC->SelectObject(pBrosseOld);
}
else
{
//--- clipping dans le polygone
int iSave=pDC->SaveDC();
if(iSave != 0)
{
pDC->SelectClipPath(RGN_AND);
//--- tracer le rectangle avec la trame choisie
trame.Rectangle(pDC,iXbZone,iYbZone,iXhZone,iYhZone,Couleur);
pDC->RestoreDC(iSave);
}
}
return TRUE;
}
return FALSE;
}

A.2.4.7. Les classes CLegende


Les classes CLegende encapsulent toutes les oprations de dfinition et de trac
de lgendes, partir des donnes de lexplorateur cartographique du cadre. La
lgende dpend bien sr du type des objets reprsents et du type des variables
visuelles utilises. Diffrentes classes permettent de grer les diffrents types de
lgendes : lgendes par caissons, lgendes de symboles, de diagrammes, etc. :
class CLegendeCaisson
{
private:
int m_iNbCaissons;
char m_chTexte[TAILLE_PALETTE_VALEUR][NB_MAX_CHARACTER];
CSize m_tabSizeTexte[TAILLE_PALETTE_VALEUR];
int m_itabXbCaisson[TAILLE_PALETTE_VALEUR];
int m_itabYbCaisson[TAILLE_PALETTE_VALEUR];
int m_itabXhCaisson[TAILLE_PALETTE_VALEUR];
int m_itabYhCaisson[TAILLE_PALETTE_VALEUR];
int m_itabXbTexte[TAILLE_PALETTE_VALEUR];
int m_itabYbTexte[TAILLE_PALETTE_VALEUR];
int m_itabXhTexte[TAILLE_PALETTE_VALEUR];

460

Annexe
int m_itabYhTexte[TAILLE_PALETTE_VALEUR];
char m_chTitre[80];

public:
CLegendeCaisson();
void Init(CDC* pDC);
void TraceRapide(CDC* pDC,int iXVue,int iYVue);
void TraceDansCarte(CDC* pDC,int iXVue,int iYVue);
};
class CLegendeDegrade
{
private:
int m_iNbCaissons;
char m_chTexte[TAILLE_PALETTE_VALEUR][NB_MAX_CHARACTER];
CSize m_tabSizeTexte[TAILLE_PALETTE_VALEUR];
int m_itabXbCaisson[TAILLE_PALETTE_VALEUR];
int m_itabYbCaisson[TAILLE_PALETTE_VALEUR];
int m_itabXhCaisson[TAILLE_PALETTE_VALEUR];
int m_itabYhCaisson[TAILLE_PALETTE_VALEUR];
int m_itabXbTexte[TAILLE_PALETTE_VALEUR];
int m_itabYbTexte[TAILLE_PALETTE_VALEUR];
int m_itabXhTexte[TAILLE_PALETTE_VALEUR];
int m_itabYhTexte[TAILLE_PALETTE_VALEUR];
char m_chTitre[80];
public:
CLegendeDegrade();
void Init(CDC* pDC);
void TraceRapide(CDC* pDC,int iXVue,int iYVue);
void TraceDansCarte(CDC* pDC,int iXVue,int iYVue);
};
class CLegendeSymbole
{
private:
int m_iLargeurTexte;
int m_iHauteurTexte;
int m_iNoSymbole;
double m_dTailleSymbole;
char m_chTexte[100];
public:
CLegendeSymbole();
void Init(CDC* pDC);
void TraceRapide(CDC* pDC,int iXVue,int iYVue);
void TraceDansCarte(CDC* pDC,int iXVue,int iYVue);
};
class CLegendeSymboleParTaille
{
private:
int m_iDisposition;
int m_iNoSymbole;
int m_iNbSymboles;
int m_iSizePoint;
COLORREF m_CouleurTexte;
LOGFONT m_logfont;
double m_dtabTailleSymbole[20];
char m_chTexte[20][100];
char m_chTitre[80];
public:
CLegendeSymboleParTaille();
void Init();
void TraceRapide(CDC* pDC,int iXVue,int iYVue);
void TraceDansCarte(CDC* pDC,int iXVue,int iYVue);
};
class CLegendeSymboleParValeur
{
private:
int m_iNbSymboles;
int m_itabNoSymbole[TAILLE_PALETTE_VALEUR];
int m_itabTailleSymbole[TAILLE_PALETTE_VALEUR];
int m_itabXSymbole[TAILLE_PALETTE_VALEUR];
int m_itabYSymbole[TAILLE_PALETTE_VALEUR];
int m_itabXTexte[TAILLE_PALETTE_VALEUR];
int m_itabYTexte[TAILLE_PALETTE_VALEUR];
int m_itabLargeurTexte[TAILLE_PALETTE_VALEUR];

Structures et mthodes : implmentation 461


int m_itabHauteurTexte[TAILLE_PALETTE_VALEUR];
char m_chTitre[80];
int m_iXbTitre;
int m_iYbTitre;
int m_iXhTitre;
int m_iYhTitre;
public:
CLegendeSymboleParValeur();
void Init(CDC* pDC);
void TraceRapide(CDC* pDC,int iXVue,int iYVue);
void TraceDansCarte(CDC* pDC,int iXVue,int iYVue);
};
class CLegendeDiagrammeCaisson
{
private:
int m_iNbCaissons;
char m_chTexte[TAILLE_PALETTE_VALEUR][NB_MAX_CHARACTER];
CSize m_tabSizeTexte[TAILLE_PALETTE_VALEUR];
int m_itabXbCaisson[TAILLE_PALETTE_VALEUR];
int m_itabYbCaisson[TAILLE_PALETTE_VALEUR];
int m_itabXhCaisson[TAILLE_PALETTE_VALEUR];
int m_itabYhCaisson[TAILLE_PALETTE_VALEUR];
int m_itabXbTexte[TAILLE_PALETTE_VALEUR];
int m_itabYbTexte[TAILLE_PALETTE_VALEUR];
int m_itabXhTexte[TAILLE_PALETTE_VALEUR];
int m_itabYhTexte[TAILLE_PALETTE_VALEUR];
public:
CLegendeDiagrammeCaisson();
void Init(CDC* pDC);
void TraceRapide(CDC* pDC,int iXVue,int iYVue);
void TraceDansCarte(CDC* pDC,int iXVue,int iYVue);
};
class CLegendeDiagrammeParTaille
{
private:
int m_iDisposition;
int m_iNbSymboles;
int m_iSizePoint;
COLORREF m_CouleurTexte;
LOGFONT m_logfont;
double m_dtabTailleSymbole[20];
char m_chtabTexte[20][100];
char m_chTitre[80];
public:
CLegendeDiagrammeParTaille();
void Init();
void TraceRapide(CDC* pDC,int iXVue,int iYVue);
void TraceDansCarte(CDC* pDC,int iXVue,int iYVue);
};

Les procdures de trac rapide (TraceRapide()) permettent de trac


rapidement sur lcran le contour des objets graphiques constituant la lgende, pour
la positionner dans la carte de manire interactive. Les procdures
TraceDansCarte() inscrivent les objets graphiques dans la carte, sous forme
dobjets de type CODD.
A.2.4.8. La classe CPaletteSavane
La classe CPaletteSavane est drive de la classe CPalette de la MFC. Elle
ajoute des fonctionnalits permettant de grer les deux ensembles de couleurs
(thmatique et imagerie), de charger des palettes standards, de grer le passage
couleur-index. La gestion de la couleur dpend du mode daffichage de la carte
graphique de lordinateur (8 bits, 16 bits, 24 ou 32 bits). La classe
CPaletteSavane permet de maintenir la gestion dune palette dans le mode 24 ou

462

Annexe

32 bits, mode o Windows permet dafficher directement les couleurs sans


lindirection dune palette.
class CPaletteSavane : public CPalette
{
public :
CPaletteSavane();
int
int
int
int
int
int
int
int
int

rouge[PALETTE_SIZE];
vert[PALETTE_SIZE];
bleu[PALETTE_SIZE];
rouge_tmp[PALETTE_SIZE];
vert_tmp[PALETTE_SIZE];
bleu_tmp[PALETTE_SIZE];
rouge_image[256];
vert_image[256];
bleu_image[256];

int
int
int
int
int
int
int
int
int
int
int

m_iCouleur;
m_iColor1;
m_iColor2;
m_iCouleurTheme;
m_iCouleurImage;
m_iIndex;
m_iIndexOld;
m_iTrame;
m_iMini;
m_iMaxi;
m_iTheme;

void SetThematique();
void SetImagerie();
void CouleursSysteme();
int GetExactPaletteIndex(int iDebut,COLORREF couleur);
COLORREF RGBColorFromIndex(int iIndex) {return
PALETTERGB(rouge[iIndex],vert[iIndex],bleu[iIndex]);};
void Tetascan();
void Gris();
void Ntsc();
void Pseudocolor();
void Telecolor();
void Compocolor();

};

void Animer();
void SetColorInPaletteLogique(int iIndex,COLORREF Couleur);

A.2.4.9. La classe CPerspective


La classe CPerspective contient mthodes et variables permettant de tracer
une mosaque en perspective. Un attribut dune autre relation peut tre superpos
la mosaque.
class CPerspective
{
private:
CCadre* m_pCadre;
CImage* m_pImage;
double* m_dtabZBuffer;
int m_iLargeurVisu;
int m_iHauteurVisu;
int m_iNbcolImage;
int m_iNbligImage;
int m_iDatasize;
int m_iTypeImage;
double m_dFpix;
double m_dRapportVisu;
double m_dPi;
double m_dDegreToRadian;
//--- lumiere
double m_dCol;
double m_dSol;
double m_dCil;
double m_dSil;

Structures et mthodes : implmentation 463


double m_dNxl;
double m_dNyl;
double m_dNzl;
//--- camera intrinsic
int m_iCameraLargeurVisuMM;
int m_iCameraHauteurVisuMM;
int m_iCameraLargeurVisuPixel;
int m_iCameraHauteurVisuPixel;
int m_iCameraFocaleMM;
//--- camera extrinsic
int m_iCameraOrientationDegre;
int m_iCameraInclinaisonDegre;
int m_iCameraAssietteDegre;
double m_dCameraLongitude;
double m_dCameraColatitude;
double m_dCameraAltitudeMetre;
double
double
double
double
CBrush

m_dCoo;
m_dSoo;
m_dCio;
m_dSio;
m_tabBrosse[256];

private:
int m_iMargeXBas;
int m_iMargeYBas;
int m_iMargeXHaut;
int m_iMargeYHaut;
int m_iMargeXBasVisu;
int m_iMargeYBasVisu;
int m_iMargeXHautVisu;
int m_iMargeYHautVisu;
void SauverEnBmp(CDC* pDC,char* chNomFichierBmp);
//--- pour la perspective conique
double m_dX0;
double m_dY0;
double m_dZ0;
double m_dLG;
double m_dD;
double m_dXC;
double m_dYC;
double m_dCouleurMinimum;
double m_dCouleurLargeur;
int m_iNbSegment;
POINT3D m_dtabMaille[4];
POINT3D m_dPolygone[80];
unsigned char EclairMaille();
void AffecteMaille(int i,int j,int iCadran);
void ChangeRepere(POINT3D &point);
BOOL TestVisibilite(POINT3D point1,POINT3D point2);
BOOL CalculIntersecPlan(POINT3D point1,POINT3D point2,POINT3D &point_inter);
BOOL PointVisual(POINT3D point);
void InitConique(int iPas);
BOOL Conique(int i,int j,int &iX,int &iY);
void TracerConiqueFilaire(CDC* pDC);
public:
double m_dZmin;
private:
//--- pour la perspective cavaliere
int m_iPas;
double m_dA;
double m_dB;
double m_dU;
double m_dV;
double m_dXmin;
double m_dYmin;
double m_dCoef;
double m_dCtx;
double m_dCty;
void InitCavaliere(int iPas);
BOOL Cavaliere(int i,int j,int &iX,int &iY);
void TracerCavaliereFilaire(CDC* pDC);
void TracerCavaliereEclairement(CDC* pDC);
void TracerCavaliereTheme(CDC* pDC,int iNbSelection,int* itabSelection,int
iModeSuperposition);

464

Annexe

public:
CPerspective(CCadre* pCadre,CImage* pImage);
void GetParametreVisu(int &iLargeurVisu,int &iHauteurVisu);
void SetRapport(double dFacteur) {m_dRapportVisu=dFacteur/m_dFpix;};
void SetSoleilIntensite(int iIntensite);
void SetMarge(int iMargeXBas,int iMargeYBas,int iMargeXHaut,int iMargeYHaut)
{m_iMargeXBas=iMargeXBas;m_iMargeYBas=iMargeYBas;m_iMargeXHaut=iMargeXHaut;m_iMargeYHaut=iMarg
eYHaut;};
unsigned char GetEclairement(int i,int j);
BOOL Tracer(CDC* pDC,int iPas,int iXOrigine,int iYOrigine,int iLargeurVisu,int
iHauteurVisu,int iPerspective,int iMode,int iOLumiere,int iILumiere,int iOObserv,int
iIObserv);
BOOL TracerBmp(int iLargeurVisu,int iHauteurVisu,int iPerspective,int iMode,int
iOLumiere,int iILumiere,int iOObserv,int iIObserv,int iNbSelection,int* itabSelection,int
iMoseSuperposition,char* chNomFichierBmp);
BOOL Animer(int iLargeurVisu,int iHauteurVisu,int iPerspective,int iMode,int
iOLumiere,int iILumiere,int iOObservDebut,int iOObservFin,int iIObservDebut,int
iIObservFin,int iNbImages,int iNbSelection,int* itabSelection,int iModeSuperposition,char*
chNomFichierBmp);
void PreviewAnimation(CDC* pDC,int iXOrigine,int iYOrigine,int iLargeurVisu,int
iHauteurVisu,int iPerspective,int iMode,int iOLumiere,int iILumiere,int iOObservDebut,int
iOObservFin,int iIObservDebut,int iIObservFin,int iNbImages);
};

A.2.5. Exemples doprations dans un cadre


Cette section prsente des exemples dimplantation de procdures dexcution
de commande, correspondant des oprations sur les donnes dune base
SAVANE. Elles permettent notamment de montrer lutilisation de la classe
CLecture, et les mthodes de cration de nouveaux attributs ou relations.
A.2.5.1. XQuestUnion()
La procdure XQuestUnion() effectue une union entre deux relations. Comme
pour toutes les procdures dexcution de commande, la procdure commence par la
lecture des paramtres de la commande, en provenance du dialogue utilisateur ou
dune macro-commande. Elle cre ensuite dans un tableau contenant ladresse des
tuples metteurs en fonction de la valeur de la cl de jointure de la relation
mettrice, puis, pour chaque tuple de la relation rceptrice, lunion avec un tuple
metteur est recherche. Ds quune union est dtecte, les valeurs de attributs
metteurs sont ajouts au tuple rcepteur, qui est rcrit dans le nouveau fichier
descriptif de la relation. Enfin, la procdure met jour le schma de la relation pour
reflter lajout de nouveaux attributs temporaires.
void XQuestUnion(CCadre* pCadre)
{
HCURSOR hcurSave = ::SetCursor(LoadCursor(NULL, IDC_WAIT));
//--- union
CSchema* pSchema=pCadre->GetSchema();
CWind* pWind=pCadre->GetWind();
int
int
int
int

i,j,k,iNothEmetteur,iNothRecepteur;
iNoattCleEmetteur,iNoattCleRecepteur;
iNbAttributsEmetteur,itabNoattEmetteur[NB_MAX_ATTRIBUTS];
iJointure;

//--- lecture des paramtres


FILE* f=fopen(base.m_chNomFtmp,"rb");
fscanf(f,"%d%*c",&iNothEmetteur);
fscanf(f,"%d%*c",&iNoattCleEmetteur);
fscanf(f,"%d%*c",&iNbAttributsEmetteur);

Structures et mthodes : implmentation 465


for(i=0;i < iNbAttributsEmetteur;i++)
{
fscanf(f,"%d%*c",&itabNoattEmetteur[i]);
}
fscanf(f,"%d%*c",&iNothRecepteur);
fscanf(f,"%d%*c",&iNoattCleRecepteur);
fscanf(f,"%d%*c",&iJointure);
fclose(f);
//--- traitement
int iNoFichier=pSchema->FchoixDescriptif();
if(iNoFichier == -1)
{
::SetCursor(hcurSave);
return;
}
CString strTexte;
int iNbObjetsRecepteur=pSchema->NombreObjets(iNothRecepteur);
int tabpRecepteur[NB_MAX_ATTRIBUTS];
int iNbaRecepteur=pSchema->m_pRelations[iNothRecepteur]->m_iNba;
for(i=1;i <= iNbaRecepteur;i++)tabpRecepteur[i]=pSchema->m_pRelations[iNothRecepteur]>m_pAttributs[i]->m_iNumero;
int iNovarCleRecepteur=tabpRecepteur[iNoattCleRecepteur];
int iNbObjetsEmetteur=pSchema->NombreObjets(iNothEmetteur);
int tabpEmetteur[NB_MAX_ATTRIBUTS];
int iNbaEmetteur=pSchema->m_pRelations[iNothEmetteur]->m_iNba;
for(i=1;i <= iNbaEmetteur;i++)tabpEmetteur[i]=pSchema->m_pRelations[iNothEmetteur]>m_pAttributs[i]->m_iNumero;
int iNovarCleEmetteur=tabpEmetteur[iNoattCleEmetteur];
float
float
float
float

vEmetteur[NB_MAX_ATTRIBUTS];
vRecepteur[NB_MAX_ATTRIBUTS];
fValCleEmetteur,fValCleRecepteur;
vprim[NB_MAX_ATTRIBUTS];

//--- tableaux pour la cl mettrice et les pointeurs dans le fichier metteur


float* ftabCle=NULL;
long* itabPtr=NULL;
ftabCle=(float *) malloc((iNbObjetsEmetteur + 1)*sizeof(float));
itabPtr=(long *) malloc((iNbObjetsEmetteur + 1)*sizeof(long));
//--- lecture de l'metteur pour remplir les tableaux
CLecture lectureEmetteur;
if(lectureEmetteur.Open(pCadre,iNothEmetteur) == FALSE)
{
free(ftabCle);
free(itabPtr);
::SetCursor(hcurSave);
return;
}
int iObjet=0;
j=lectureEmetteur.Lire(vEmetteur);
while(j != -1)
{
if(j == 1)
{
iObjet++;
ftabCle[iObjet]=vEmetteur[iNovarCleEmetteur];
itabPtr[iObjet]=lectureEmetteur.GetPointeurTuple();
}
j=lectureEmetteur.Lire(vEmetteur);
}
lectureEmetteur.Close();
//--- codification des valeurs dans le cas d'une cl de jointure nominale
int iTypeCleEmetteur=pSchema->m_pRelations[iNothEmetteur]->m_pAttributs[iNoattCleEmetteur]>m_iType;
int iTypeCleRecepteur=pSchema->m_pRelations[iNothRecepteur]>m_pAttributs[iNoattCleRecepteur]->m_iType;
if(iTypeCleEmetteur == 1 || iTypeCleEmetteur == 5)
{
int iNbvalbRecepteur=pSchema->m_pRelations[iNothRecepteur]>m_pAttributs[iNoattCleRecepteur]->m_iNbvalb;
int iPtrvalRecepteur=pSchema->m_pRelations[iNothRecepteur]>m_pAttributs[iNoattCleRecepteur]->m_iPtrval;

466

Annexe

int iNbcarAttrRecepteur=pSchema->m_pRelations[iNothRecepteur]>m_pAttributs[iNoattCleRecepteur]->m_iNbcar;
int iNbvalbEmetteur=pSchema->m_pRelations[iNothEmetteur]>m_pAttributs[iNoattCleEmetteur]->m_iNbvalb;
int iPtrvalEmetteur=pSchema->m_pRelations[iNothEmetteur]>m_pAttributs[iNoattCleEmetteur]->m_iPtrval;
int iNbcarAttrEmetteur=pSchema->m_pRelations[iNothEmetteur]>m_pAttributs[iNoattCleEmetteur]->m_iNbcar;
if(iPtrvalEmetteur != iPtrvalRecepteur)
{
//--- indexation des modalites de l'attribut de rfrence
CIndexAttribut index(pSchema,iNothRecepteur,iNoattCleRecepteur);
if(index.Init())
{
FILE* FileValeurs=NULL;
if(iTypeCleEmetteur == 1)FileValeurs=fopen(base.m_chNomFichierValeurs,"rb");
else FileValeurs=fopen(pSchema->m_chNomFtval,"rb");
if(FileValeurs != NULL)
{
//--- recodification
int iRes,iVal,iPtr;
char chNomValeur[33];
for(i=1;i <= iNbObjetsEmetteur;i++)
{
iVal=(int) (ftabCle[i] + 0.5);
if(iVal > 0)
{
iPtr=(iPtrvalEmetteur+iVal-2)*iNbcarAttrEmetteur;
fseek(FileValeurs,iPtr,SEEK_SET);
fread(chNomValeur,iNbcarAttrEmetteur,1,FileValeurs);
chNomValeur[iNbcarAttrEmetteur]=0;
strstrip(chNomValeur);
iRes=index.Recherche(chNomValeur);
ftabCle[i]=(float) iRes;
}
}

fclose(FileValeurs);
}
index.Fermer();
}

//--- union
int iType;
float vInconnu[NB_MAX_ATTRIBUTS];
for(i=0;i < iNbAttributsEmetteur;i++)
{
iType=pSchema->m_pRelations[iNothEmetteur]->m_pAttributs[itabNoattEmetteur[i]]->m_iType;
if(iType == 1 || iType == 5)vInconnu[i]=0.;
else vInconnu[i]=FINCONNU;
}
int iObjetRecepteur=1;
CLecture lectureRecepteur;
if(lectureRecepteur.Open(pCadre,iNothRecepteur,iNoFichier,iNbAttributsEmetteur) == FALSE)
{
free(ftabCle);
free(itabPtr);
::SetCursor(hcurSave);
return;
}
CLecture lecture2Emetteur;
if(lecture2Emetteur.Open(pCadre,iNothEmetteur) == FALSE)
{
free(ftabCle);
free(itabPtr);
::SetCursor(hcurSave);
return;
}
i=lectureRecepteur.Lire(vRecepteur);
while(i != -1)
{
if(i == 1)
{
//--- initialisation du tupe

Structures et mthodes : implmentation 467


for(j=1;j <= iNbaRecepteur;j++)vprim[j]=vRecepteur[tabpRecepteur[j]];
for(j=0;j < iNbAttributsEmetteur;j++)vprim[iNbaRecepteur+1+j]=vInconnu[j];
fValCleRecepteur=vRecepteur[iNovarCleRecepteur];
strTexte.Format("Objet %d sur %d",iObjetRecepteur,iNbObjetsRecepteur);
pMainFrame->SetStatusTexte(strTexte);
if(iTypeCleRecepteur == 1 || iTypeCleRecepteur == 5)
{
//--- cas cls de jointure nominales
if(fValCleRecepteur > 0.)
{
j=0;
iObjet=1;
while(iObjet <= iNbObjetsEmetteur && j == 0)
{
fValCleEmetteur=ftabCle[iObjet];
if(fValCleEmetteur > 0.)
{
switch(iJointure)
{
default:
break;
case 0: //--- equijointure
if(fValCleEmetteur == fValCleRecepteur)j=1;
break;
case 1: //--- different
if(fValCleEmetteur != fValCleRecepteur)j=1;
break;
}
if(j == 1)
{
//--- lire le tuple emetteur
lecture2Emetteur.LireTuple(itabPtr[iObjet],vEmetteur);
for(k=0;k < iNbAttributsEmetteur;k++)
{
vprim[iNbaRecepteur+1+k]=vEmetteur[tabpEmetteur[itabNoattEmetteur[k]]];
}
}
}
iObjet++;
}
}
}
else
{
//--- cas cls de jointure numriques
if(fValCleRecepteur > FINCONNU)
{
j=0;
iObjet=1;
while(iObjet <= iNbObjetsEmetteur && j == 0)
{
fValCleEmetteur=ftabCle[iObjet];
if(fValCleEmetteur > FINCONNU)
{
switch(iJointure)
{
default:
break;
case 0: //--- equijointure
if(fValCleEmetteur == fValCleRecepteur)j=1;
break;
case 1: //--- different
if(fValCleEmetteur != fValCleRecepteur)j=1;
break;
case 2:
if(fValCleEmetteur <= fValCleRecepteur)j=1;
break;
case 3: //--if(fValCleEmetteur >= fValCleRecepteur)j=1;
break;
case 4: //--if(fValCleEmetteur < fValCleRecepteur)j=1;
break;
case 5: //--if(fValCleEmetteur > fValCleRecepteur)j=1;
break;
}
if(j == 1)

468

Annexe
{
//--- lire le tuple emetteur
lecture2Emetteur.LireTuple(itabPtr[iObjet],vEmetteur);
for(k=0;k < iNbAttributsEmetteur;k++)
{
vprim[iNbaRecepteur+1+k]=vEmetteur[tabpEmetteur[itabNoattEmetteur[k]]];
}
}

}
iObjet++;
}

//--- criture des valeurs dans le rcepteur


lectureRecepteur.Ecrire(vprim);
}
i=lectureRecepteur.Lire(vRecepteur);
iObjetRecepteur++;
}
lectureRecepteur.Close();
lecture2Emetteur.Close();
free(ftabCle);
free(itabPtr);
//--- schema
if(pSchema->m_pRelations[iNothRecepteur]->m_iType < 10)
{
pSchema->m_pRelations[iNothRecepteur]->m_iType+=10;
pSchema->m_pRelations[iNothRecepteur]->m_iNoFichDescriptif=iNoFichier;
pSchema->m_iFdisDescriptif[iNoFichier]=1;
for(i=1;i <= pSchema->m_pRelations[iNothRecepteur]->m_iNba;i++)pSchema>m_pRelations[iNothRecepteur]->m_pAttributs[i]->m_iNumero=i;
}
else
{
int iNo=pSchema->m_pRelations[iNothRecepteur]->m_iNoFichDescriptif;
unlink(pSchema->m_chFprovDescriptif[iNo]);
pSchema->m_pRelations[iNothRecepteur]->m_iNoFichDescriptif=iNoFichier;
pSchema->m_iFdisDescriptif[iNoFichier]=1;
pSchema->m_iFdisDescriptif[iNo]=0;
}
//--- creation des nouveaux attributs dans le schema
int iNbcar,iNoatt,iNbvalb,iPtrval;
char chNom[20];
char chDescription[128];
for(k=0;k < iNbAttributsEmetteur;k++)
{
iNoatt=itabNoattEmetteur[k];
strcpy(chNom,pSchema->m_pRelations[iNothEmetteur]->m_pAttributs[iNoatt]->m_chNom);
iType=pSchema->m_pRelations[iNothEmetteur]->m_pAttributs[iNoatt]->m_iType;
iNbcar=pSchema->m_pRelations[iNothEmetteur]->m_pAttributs[iNoatt]->m_iNbcar;
iNbvalb=pSchema->m_pRelations[iNothEmetteur]->m_pAttributs[iNoatt]->m_iNbvalb;
iPtrval=pSchema->m_pRelations[iNothEmetteur]->m_pAttributs[iNoatt]->m_iPtrval;
strcpy(chDescription,"");
pSchema->NouvelAttribut(iNothRecepteur,iType,iNbcar,iNbvalb,iPtrval,chNom,chDescription);
}
::SetCursor(hcurSave);
}

A.2.5.2. XQuestJoinGeo()
La procdure XQuestJoinGeo() cre une nouvelle relation par qui-jointure
gomtrique, en utilisant les reprsentations matricielles des deux relations. Elle
cre une image matricielle rsultant de lintersection des deux images matricielles
des deux relations initiales, cre ensuite les tuples correspondant cette image,
partir des valeurs des tuples des deux relations initiales. Enfin, limage rsultante est
vectorise pour crer les arcs correspondants aux zones de la nouvelle relation.
void XQuestJoindreGeoEqui(CCadre* pCadre)

Structures et mthodes : implmentation 469


{
HCURSOR hcurSave = ::SetCursor(LoadCursor(NULL, IDC_WAIT));
//--- equijointure gomtrique
CSchema* pSchema=pCadre->GetSchema();
CWind* pWind=pCadre->GetWind();
int iNoth1,iNoth2,iIntersection;
char chNomRelation[_MAX_PATH];
//--- lecture des paramtres
FILE* FileMenu=fopen(base.m_chNomFtmp,"rb");
fscanf(FileMenu,"%d%*c",&iNoth1);
fscanf(FileMenu,"%d%*c",&iNoth2);
fscanf(FileMenu,"%d%*c",&iIntersection);
fgets(chNomRelation,_MAX_PATH,FileMenu);
fclose(FileMenu);
chNomRelation[strlen(chNomRelation)-1]='\0';
//--- rasterisation si ncessaire
int iTypeRelation=pSchema->m_pRelations[iNoth1]->m_iType;
if(iTypeRelation == 4 || iTypeRelation == 14)
{
CYX cyx(pCadre);
cyx.Rasteriser(iNoth1);
}
iTypeRelation=pSchema->m_pRelations[iNoth2]->m_iType;
if(iTypeRelation == 4 || iTypeRelation == 14)
{
CYX cyx(pCadre);
cyx.Rasteriser(iNoth2);
}
int i,iNo,iNbarc,iPtrarc,nz,iNzNew,iNbpt;
int iNba1,iNba2;
int iNbObjets1,iNbObjets2;
int iCode,iCode1,iCode2;
int iX,iY;
long adresse;
float xc,yc,xb,yb,xh,yh,v1[NB_MAX_ATTRIBUTS],v2[NB_MAX_ATTRIBUTS];
float xcNew,ycNew,xbNew,ybNew,xhNew,yhNew;
float vInconnu1[NB_MAX_ATTRIBUTS],vInconnu2[NB_MAX_ATTRIBUTS];
FILE *FileDescriptif1,*FileDescriptif2,*FileDescriptif3;
FILE *FileImage1,*FileImage2,*FileImage3;
long *ltabObjets1,*ltabObjets2;
//--- indexation des objets de la relation 1
iNbObjets1=pSchema->m_pRelations[iNoth1]->m_iNbObjets;
if(iNbObjets1 == -1)iNbObjets1=pSchema->NombreObjets(iNoth1);
ltabObjets1=(long *) malloc((iNbObjets1+1)*sizeof(long));
if(ltabObjets1 == NULL)
{
::SetCursor(hcurSave);
::ErreurDeMemoire();
return;
}
iNba1=pSchema->m_pRelations[iNoth1]->m_iNba;
iCode=0;
Clecture lecture1;
if(lecture1.Open(iNoth1))
{
int i=lecture1.Lire(v);
while(i != -1)
{
if(i == 1)
{
iCode++;
ltabObjets1[iCode]=lecture1.GetPointeurTuple();
}
i=lecture1.Lire(v);
}
lecture1.Close();
}
//--- indexation des objets de la relation 2
iNbObjets2=pSchema->m_pRelations[iNoth2]->m_iNbObjets;
if(iNbObjets2 == -1)iNbObjets2=pSchema->NombreObjets(iNoth2);
ltabObjets2=(long *) malloc((iNbObjets2+1)*sizeof(long));

470

Annexe

if(ltabObjets2 == NULL)
{
::SetCursor(hcurSave);
::ErreurDeMemoire();
free(ltabObjets1);
return;
}
iNba2=pSchema->m_pRelations[iNoth2]->m_iNba;
iCode=0;
Clecture lecture2;
if(lecture2.Open(iNoth2))
{
int i=lecture2.Lire(v);
while(i != -1)
{
if(i == 1)
{
iCode++;
ltabObjets2[iCode]=lecture2.GetPointeurTuple();
}
i=lecture2.Lire(v);
}
lecture2.Close();
}
//--- remplissage des inconnus
int iTypeAttr;
for(i=1; i <= iNba1;i++)
{
iTypeAttr=pSchema->m_pRelations[iNoth1]->m_pAttributs[i]->m_iType;
switch(iTypeAttr)
{
case 1:
case 5:
case 6:
vInconnu1[i]=(float) CINCONNU;
break;
case 2:
case 3:
case 4:
default:
vInconnu1[i]=FINCONNU;
break;
}
}
for(i=1; i <= iNba2;i++)
{
iTypeAttr=pSchema->m_pRelations[iNoth2]->m_pAttributs[i]->m_iType;
switch(iTypeAttr)
{
case 1:
case 5:
case 6:
vInconnu2[i]=(float) CINCONNU;
break;
case 2:
case 3:
case 4:
default:
vInconnu2[i]=FINCONNU;
break;
}
}
//--- pour la nouvelle relation
int iNoFichierDescriptif=pSchema->FchoixDescriptif();
if(iNoFichierDescriptif == -1)
{
free(ltabObjets1);
free(ltabObjets2);
return;
}
int iNoFichierImage=pSchema->FchoixImage();
if(iNoFichierImage == -1)
{
free(ltabObjets1);
free(ltabObjets2);

Structures et mthodes : implmentation 471


return;
}
int *itabImage1=(int *) malloc(config.m_iDefX*(sizeof(int)));
int *itabImage2=(int *) malloc(config.m_iDefX*(sizeof(int)));
if(itabImage1 == NULL || itabImage2 == NULL)
{
::ErreurDeMemoire();
free(ltabObjets1);
free(ltabObjets2);
if(itabImage1 != NULL)free(itabImage1);
if(itabImage2 != NULL)free(itabImage2);
return;
}
int iNo1=pSchema->m_pRelations[iNoth1]->m_iNoFichImage;
int iNo2=pSchema->m_pRelations[iNoth2]->m_iNoFichImage;
FileImage1=fopen(pSchema->m_chFprovImage[iNo1],"rb");
FileImage2=fopen(pSchema->m_chFprovImage[iNo2],"rb");
FileImage3=fopen(pSchema->m_chFprovImage[iNoFichierImage],"wb");
if(FileImage1 == NULL || FileImage2 == NULL || FileImage3 == NULL)
{
free(itabImage1);
free(itabImage2);
free(ltabObjets1);
free(ltabObjets2);
if(FileImage1 != NULL)fclose(FileImage1);
if(FileImage2 != NULL)fclose(FileImage2);
if(FileImage3 != NULL)fclose(FileImage3);
return;
}
CTableauCode* pTableauCode=new CTableauCode();
iY=0;
while(iY < config.m_iDefY)
{
iX=0;
while(iX < config.m_iDefX)
{
fscanf(FileImage1,"%d %d%*c",&iCode1,&iNbpt);
for(i=0;i < iNbpt;i++){itabImage1[iX]=iCode1;iX++;}
}
iX=0;
while(iX < config.m_iDefX)
{
fscanf(FileImage2,"%d %d%*c",&iCode2,&iNbpt);
for(i=0;i < iNbpt;i++){itabImage2[iX]=iCode2;iX++;}
}
//--- croisement des images
iCode1=itabImage1[0];
iCode2=itabImage2[0];
iNbpt=1;
iX=1;
while(iX < config.m_iDefX)
{
while(iX < config.m_iDefX)
{
if(itabImage1[iX] != iCode1 || itabImage2[iX] != iCode2)break;
iX++;
iNbpt++;
}
//--- traiter le segment
if((iIntersection == TRUE && (iCode1 == 0 || iCode2 == 0)) || (iIntersection == FALSE
&& iCode1 == 0 && iCode2 == 0))iCode=0;
else iCode=pTableauCode->AjouterCellule(iCode1,iCode2);
fprintf(FileImage3,"%d %d\n",iCode,iNbpt);
//--- segment suivant
iNbpt=0;
if(iX < config.m_iDefX)
{
iCode1=itabImage1[iX];
iCode2=itabImage2[iX];
iX++;
iNbpt=1;
}
}
if(iNbpt > 0)fprintf(FileImage3,"%d %d\n",iCode,iNbpt);

472

Annexe

iY++;
}
fclose(FileImage1);
fclose(FileImage2);
fclose(FileImage3);
//--- fichier descriptif
iNo=pSchema->m_pRelations[iNoth1]->m_iNoFichDescriptif;
FileDescriptif1=fopen(pSchema->m_chFprovDescriptif[iNo],"rb");
iNo=pSchema->m_pRelations[iNoth2]->m_iNoFichDescriptif;
FileDescriptif2=fopen(pSchema->m_chFprovDescriptif[iNo],"rb");
FileDescriptif3=fopen(pSchema->m_chFprovDescriptif[iNoFichierDescriptif],"wb");
iNbarc=1;
iPtrarc=1;
fwrite(&iNbarc,SIZEINT,1,FileDescriptif3);
fwrite(&iPtrarc,SIZEINT,1,FileDescriptif3);
iNzNew=20;
xcNew=(pWind->m_fFx1+pWind->m_fFx2)/2.F;
ycNew=(pWind->m_fFy1+pWind->m_fFy2)/2.F;
xbNew=pWind->m_fFx1;
ybNew=pWind->m_fFy1;
xhNew=pWind->m_fFx2;
yhNew=pWind->m_fFy2;
CCelluleCode* ptrCellule=pTableauCode->GetTete();
while(ptrCellule != NULL)
{
ptrCellule=pTableauCode->LireCellule(ptrCellule,iCode1,iCode2);
if(iCode1 > 0)
{
fseek(FileDescriptif1,ltabObjets1[iCode1],SEEK_SET);
for(i=1;i <= iNba1;i++)fread(&v1[i],SIZEVAL,1,FileDescriptif1);
}
else
{
for(i=1;i <= iNba1;i++)v1[i]=vInconnu1[i];
}
if(iCode2 > 0)
{
fseek(FileDescriptif2,ltabObjets2[iCode2],SEEK_SET);
for(i=1;i <= iNba2;i++)fread(&v2[i],SIZEVAL,1,FileDescriptif2);
}
else
{
for(i=1;i <= iNba2;i++)v2[i]=vInconnu2[i];
}
fwrite(&iNzNew,SIZEINT,1,FileDescriptif3);
fwrite(&xcNew,SIZECOOR,1,FileDescriptif3);
fwrite(&ycNew,SIZECOOR,1,FileDescriptif3);
fwrite(&xbNew,SIZECOOR,1,FileDescriptif3);
fwrite(&ybNew,SIZECOOR,1,FileDescriptif3);
fwrite(&xhNew,SIZECOOR,1,FileDescriptif3);
fwrite(&yhNew,SIZECOOR,1,FileDescriptif3);
for(i=1;i <= iNba1;i++)fwrite(&v1[i],SIZEVAL,1,FileDescriptif3);
for(i=1;i <= iNba2;i++)fwrite(&v2[i],SIZEVAL,1,FileDescriptif3);
iNzNew++;
}
iNzNew=0;
fwrite(&iNzNew,SIZEINT,1,FileDescriptif3);
fwrite(&xcNew,SIZECOOR,1,FileDescriptif3);
fwrite(&ycNew,SIZECOOR,1,FileDescriptif3);
fwrite(&xbNew,SIZECOOR,1,FileDescriptif3);
fwrite(&ybNew,SIZECOOR,1,FileDescriptif3);
fwrite(&xhNew,SIZECOOR,1,FileDescriptif3);
fwrite(&yhNew,SIZECOOR,1,FileDescriptif3);
for(i=1;i <= iNba1;i++)fwrite(&vInconnu1[i],SIZEVAL,1,FileDescriptif3);
for(i=1;i <= iNba2;i++)fwrite(&vInconnu2[i],SIZEVAL,1,FileDescriptif3);
iNbarc=0;
iPtrarc=0;
fwrite(&iNbarc,SIZEINT,1,FileDescriptif3);
fwrite(&iPtrarc,SIZEINT,1,FileDescriptif3);
fclose(FileDescriptif1);

Structures et mthodes : implmentation 473


fclose(FileDescriptif2);
fclose(FileDescriptif3);
delete pTableauCode;
free(itabImage1);
free(itabImage2);
free(ltabObjets1);
free(ltabObjets2);
//--- cration du schma
int iNoFichierFeuille=-1;
int iNoFichierArc=-1;
int iNoth3=pSchema>NouvelleRelation(4,chNomRelation,iNoFichierFeuille,iNoFichierDescriptif,iNoFichierArc);
if(iNoth3 > 0)
{
pSchema->m_pRelations[iNoth3]->m_iNoFichImage=iNoFichierImage;
if(iNoFichierImage >= 0)pSchema->m_iFdisImage[iNoFichierImage]=1;
pSchema->m_pRelations[iNoth3]->m_iType=24;
//--- attributs
int iType,iNbcar,iNbvalb,iPtrval;
char chNomAttribut[20];
char chDescription[128];
strcpy(chDescription,"");
for(i=1;i <= iNba1; i++)
{
strcpy(chNomAttribut,pSchema->m_pRelations[iNoth1]->m_pAttributs[i]->m_chNom);
iNbcar=pSchema->m_pRelations[iNoth1]->m_pAttributs[i]->m_iNbcar;
iNbvalb=pSchema->m_pRelations[iNoth1]->m_pAttributs[i]->m_iNbvalb;
iPtrval=pSchema->m_pRelations[iNoth1]->m_pAttributs[i]->m_iPtrval;
iType=pSchema->m_pRelations[iNoth1]->m_pAttributs[i]->m_iType;
pSchema>NouvelAttribut(iNoth3,iType,iNbcar,iNbvalb,iPtrval,chNomAttribut,chDescription);
}
for(i=1;i <= iNba2; i++)
{
strcpy(chNomAttribut,pSchema->m_pRelations[iNoth2]->m_pAttributs[i]->m_chNom);
iNbcar=pSchema->m_pRelations[iNoth2]->m_pAttributs[i]->m_iNbcar;
iNbvalb=pSchema->m_pRelations[iNoth2]->m_pAttributs[i]->m_iNbvalb;
iPtrval=pSchema->m_pRelations[iNoth2]->m_pAttributs[i]->m_iPtrval;
iType=pSchema->m_pRelations[iNoth2]->m_pAttributs[i]->m_iType;
pSchema>NouvelAttribut(iNoth3,iType,iNbcar,iNbvalb,iPtrval,chNomAttribut,chDescription);
}
//--- vectorisation et recupration du nombre d'arcs
CVectoriser vectoriser(pCadre,TRUE);
vectoriser.Relation(iNoth3);
iNbarc=vectoriser.GetNbarc();
FileDescriptif3=fopen(pSchema->m_chFprovDescriptif[iNoFichierDescriptif],"rb+");
if(FileDescriptif3 != NULL)
{
fwrite(&iNbarc,SIZEINT,1,FileDescriptif3);
fclose(FileDescriptif3);
}
//--- calcul des centrodes et fentres de zones
pSchema->m_pRelations[iNoth3]->CalculDesCentroides();
}
::SetCursor(hcurSave);
}

A.2.5.3. XCrisCalcul()
Le code prsent ici est une partie de limplmentation de la procdure gnrale
de cration dun attribut par calcul. Il sagit dune opration interne une relation,
comme toutes les oprations du menu CRIS. Le code montre les tapes importantes
de cette procdures : cration du tableau dindirection schma interne-schma
externe, lecture des objets (avec la classe CLecture) et utilisation de la classe
CCalculateur pour dterminer la valeur du nouvel attribut partir des attributs de
lobjet, mise jour du schma de la relation avec cration dun nouvel attribut.

474

Annexe

//--- tableau dindirection schma interne-schma externe


int tabp[NB_MAX_ATTRIBUTS];
int iNba=pSchema->m_pRelations[iNoth]->m_iNba;
for(i=1;i <= iNba;i++)tabp[i]=pSchema->m_pRelations[iNoth]->m_pAttributs[i]->m_iNumero;
int iNoFichier=pSchema->FchoixDescriptif();
if(iNoFichier == -1)return;
CLecture lecture;
if(lecture.Open(pCadre,iNoth,iNoFichier,1))
{
//--- lecture des objets
double v[NB_MAX_ATTRIBUTS],fResultat;
double vprim[NB_MAX_ATTRIBUTS];
i=lecture.Lire(v);
while(i != -1)
{
if(i == 1)
{
dResultat=calculateur.Calcul(chFormule,v);
iNbObjets++;
if(pSchema->m_pRelations[iNoth]->m_iType < 10)
{
for(i=1;i <= iNba;i++)vprim[i]=v[tabp[i]];
vprim[iNba+1]=fResultat;
lecture.Ecrire(vprim);
}
else
{
v[iNba+1]=fResultat;
lecture.Ecrire(v);
}
}
i=lecture.Lire(v);
}
lecture.Close();
//--- mise a jour de la relation
if(pSchema->m_pRelations[iNoth]->m_iType < 10)
{
pSchema->m_pRelations[iNoth]->m_iType+=10;
pSchema->m_pRelations[iNoth]->m_iNoFichDescriptif=iNoFichier;
pSchema->m_iFdisDescriptif[iNoFichier]=1;
for(i=1;i <= pSchema->m_pRelations[iNoth]->m_iNba;i++)pSchema->m_pRelations[iNoth]>m_pAttributs[i]->m_iNumero=i;
}
else
{
int iNo=pSchema->m_pRelations[iNoth]->m_iNoFichDescriptif;
unlink(pSchema->m_chFprovDescriptif[iNo]);
pSchema->m_pRelations[iNoth]->m_iNoFichDescriptif=iNoFichier;
pSchema->m_iFdisDescriptif[iNoFichier]=1;
pSchema->m_iFdisDescriptif[iNo]=0;
}
//--- creation du nouvel attribut dans le schema
pSchema->NouvelAttribut(iNoth,4,0,0,0,chNomAttribut,chDescription);
iOperationOk=1;
}

A.2.5.4. XTri()
La procdure Xtri() est utilise plusieurs reprises dans SAVANE pour trier les
valeurs dun attribut dune relation (par exemple, dans la procdure XCrisTri(),
dans la procdure de dtermination de quantiles, dans le calcul de la mdiane, etc.).
Elle utilise la classe CLecture pour lire la valeur des objets de la relation, et la
procdure qsort() de la librairie standard C++ pour trier les valeurs.
void XTri(CCadre* pCadre,int iNoth, int iNoatt,float *fTableau)
{
//--- tri des valeurs d'un attribut, relations non image

Structures et mthodes : implmentation 475


CSchema* pSchema=pCadre->GetSchema();
if(pSchema->m_pRelations[iNoth]->m_iType != 5 && pSchema->m_pRelations[iNoth]->m_iType != 15
&& pSchema->m_pRelations[iNoth]->m_iType != 25)
{
//--- initialisation de la lecture
float v[NB_MAX_ATTRIBUTS];
int i;
int iNovar=pSchema->m_pRelations[iNoth]->m_pAttributs[iNoatt]->m_iNumero;
CLecture lecture;
if(lecture.Open(pCadre,iNoth))
{
int iNbObjets=0;
i=lecture.Lire(v);
while(i != -1)
{
if(i == 1)
{
if(v[iNovar] > FINCONNU)
{
fTableau[iNbObjets]=v[iNovar];
iNbObjets++;
}
}
i=lecture.Lire(v);
}
lecture.Close();

qsort(fTableau,iNbObjets,sizeof(float),comparnum);
}

int comparnum(const void *arg1,const void *arg2)


{
if(*((float *) arg1) < *((float *) arg2))return -1;
if(*((float *) arg1) > *((float *) arg2))return 1;
return 0;
}

A.3. Savamer
A.3.1. La classe CAmers
La classe CAmers de SAVAMER gre les couples de points saisis entre image
redresser et espace gographique. Elle est utilise dans de nombreuses autres classes
du programme. On peut saisir jusqu 10 000 amers pour une image.
class CAmers
{
friend class
friend class
friend class
friend class
friend class

CTranslation;
CSimilitude;
CSysteme1;
CSysteme3;
CTessel;

private:
double m_dtabXDiff[NB_MAX_AMER];
double m_dtabYDiff[NB_MAX_AMER];
//--- coordonnes dans la vue de la base
int m_itabXVue[NB_MAX_AMER];
int m_itabYVue[NB_MAX_AMER];
//--- coordonnes dans la base savane
double m_dtabXSav[NB_MAX_AMER];
double m_dtabYSav[NB_MAX_AMER];
//--- coordonnes image
int m_itabXImage[NB_MAX_AMER];
int m_itabYImage[NB_MAX_AMER];
int m_iNbpt;

476

Annexe
int m_iSelection;
BOOL m_bASauver;
char m_chNomFichier[_MAX_PATH];

public:
CAmers();
void
BOOL
void
BOOL

Init();
Lire(char *chNomFichierAmers);
Ecrire();
Fermer();

void SavToVue();
void Tracer(int iTarget,CDC* pDc);
void TracerLesLiens(int iTarget,CDC* pDc);
void TracerUnPoint(int iTarget,CDC* pDc,int iNo,COLORREF couleur);
void Supprimer(int iNo);
void AjouterSavane(double dXSav,double dYSav,int iXImage,int iYImage);
void AjouterProjection(double dXProj,double dYProj,int iXImage,int iYImage);
int Selectionner(int iTarget,CPoint point);
int SelectionnerParNumero(int iNo);
int GetSelection() {return m_iSelection;};
void SetPointVue(int iNo,int iXVue,int iYVue,int iXImage,int iYImage);
void SetPointProjection(int iNo,double dXProj,double dYProj,int iXImage,int iYImage);
void GetPointVue(int iNo,int &iXVue,int &iYVue,int &iXImage,int &iYImage);
void GetPointSavane(int iNo,double &dXSav,double &dYSav,int &iXImage,int &iYImage);
void GetPointProjection(int iNo,double &dXProj,double &dYproj,int &iXImage,int &iYImage);
int GetNbpt() {return m_iNbpt;};
void ASauver() {m_bASauver=TRUE;};
BOOL IsASauver() {return m_bASauver;};
void Echanger(int,int);
};

BOOL Fenetre(double &dXMin,double &dYMin,double &dXMax,double &dYMax);

A.3.2. La classe CSysteme1


La classe Csystme1 permet deffectuer un redressement polynomial avec trois
points damers.
class CSysteme1
{
private:
double m_dResolution;
CAmers* m_pAmers;
CImage* m_pImage;
double
double
double
double
double
double

m_aPToI;
m_bPToI;
m_cPToI;
m_aprimPToI;
m_bprimPToI;
m_cprimPToI;

double
double
double
double
double
double

m_aIToP;
m_bIToP;
m_cIToP;
m_aprimIToP;
m_bprimIToP;
m_cprimIToP;

//--- fenetre d'arrivee, en projection


double m_dFx1;
double m_dFy1;
double m_dFx2;
double m_dFy2;
int m_iNbligDestination;
int m_iNbcolDestination;
public:
CSysteme1(CAmers* pAmers,CImage* pImage,double dResolution);
BOOL Equations();
void ImageToProjection(int iX,int iY,double &dX,double &dY);

Structures et mthodes : implmentation 477


void
void
void
void
void

ProjectionToImage(double dX,double dY, int &iX,int &iY);


ProjectionToImage(double dX,double dY,double &dXImage,double &dYImage);
FenetreDestination();
Recalage(int iModeRecalage);
RecalageAmers();

double GetResolution() {return m_dResolution;};


void GetFenetreDestination(double &dXb,double &dYb,double &dXh,double &dYh,int
&iNbcol,int &iNblig);
};

La mthode Equations() de la classe calcule, partir des trois premiers points


damers, les coefficients des formules de calculs. Les mthodes
ProjectionToImage() et ImageToProjection() effectuent les calculs de
changement de repre :
BOOL CSysteme1::Equations()
{
double dX,dY,dX0,dY0;
double
double
double
double
double
double

dXi0=(double)
dYi0=(double)
dXi1=(double)
dYi1=(double)
dXi2=(double)
dYi2=(double)

m_pAmers->m_itabXImage[0];
m_pAmers->m_itabYImage[0];
m_pAmers->m_itabXImage[1];
m_pAmers->m_itabYImage[1];
m_pAmers->m_itabXImage[2];
m_pAmers->m_itabYImage[2];

::SavToProj(m_pAmers->m_dtabXSav[0],m_pAmers->m_dtabYSav[0],dX0,dY0);
::SavToProj(m_pAmers->m_dtabXSav[0],m_pAmers->m_dtabYSav[0],dX,dY);
double dXp0=dX-dX0;
double dYp0=dY-dY0;
::SavToProj(m_pAmers->m_dtabXSav[1],m_pAmers->m_dtabYSav[1],dX,dY);
double dXp1=dX-dX0;
double dYp1=dY-dY0;
::SavToProj(m_pAmers->m_dtabXSav[2],m_pAmers->m_dtabYSav[2],dX,dY);
double dXp2=dX-dX0;
double dYp2=dY-dY0;
double dDelta=(dXi1-dXi0)*(dYi2-dYi0)-(dXi2-dXi0)*(dYi1-dYi0);
if(dDelta == 0)return FALSE;
m_aIToP=((dXp1-dXp0)*(dYi2-dYi0)-(dXp2-dXp0)*(dYi1-dYi0))/dDelta;
m_bIToP=((dXp2-dXp0)*(dXi1-dXi0)-(dXp1-dXp0)*(dXi2-dXi0))/dDelta;
m_cIToP=dXp0-m_aIToP*dXi0-m_bIToP*dYi0;
m_aprimIToP=((dYp1-dYp0)*(dYi2-dYi0)-(dYp2-dYp0)*(dYi1-dYi0))/dDelta;
m_bprimIToP=((dYp2-dYp0)*(dXi1-dXi0)-(dYp1-dYp0)*(dXi2-dXi0))/dDelta;
m_cprimIToP=dYp0-m_aprimIToP*dXi0-m_bprimIToP*dYi0;
dDelta=(dXp1-dXp0)*(dYp2-dYp0)-(dXp2-dXp0)*(dYp1-dYp0);
if(dDelta == 0)return FALSE;
m_aPToI=((dXi1-dXi0)*(dYp2-dYp0)-(dXi2-dXi0)*(dYp1-dYp0))/dDelta;
m_bPToI=((dXi2-dXi0)*(dXp1-dXp0)-(dXi1-dXi0)*(dXp2-dXp0))/dDelta;
m_cPToI=dXi0-m_aPToI*dXp0-m_bPToI*dYp0;
m_aprimPToI=((dYi1-dYi0)*(dYp2-dYp0)-(dYi2-dYi0)*(dYp1-dYp0))/dDelta;
m_bprimPToI=((dYi2-dYi0)*(dXp1-dXp0)-(dYi1-dYi0)*(dXp2-dXp0))/dDelta;
m_cprimPToI=dYi0-m_aprimPToI*dXp0-m_bprimPToI*dYp0;
return TRUE;
}
void CSysteme1::ImageToProjection(int iX,int iY,double &dXProj,double &dYProj)
{
dXProj=m_aIToP*((double) iX) + m_bIToP*((double) iY) + m_cIToP;
dYProj=m_aprimIToP*((double) iX) + m_bprimIToP*((double) iY) + m_cprimIToP;
}
void CSysteme1::ProjectionToImage(double dXProj,double dYProj,int &iX,int &iY)
{
iX=(int) (m_aPToI*dXProj + m_bPToI*dYProj + m_cPToI);

478

Annexe

iY=(int) (m_aprimPToI*dXProj + m_bprimPToI*dYProj + m_cprimPToI);


}

Le calcul de la fentre de redressement est effectu par la fonction


FenetreDestination() :
void CSysteme1::FenetreDestination()
{
double dX,dY;
ImageToProjection(0,0,m_dFx1,m_dFy1);
m_dFx2=m_dFx1;
m_dFy2=m_dFy1;
ImageToProjection(m_pImage->m_iNbcol,0,dX,dY);
if(dX < m_dFx1)m_dFx1=dX;
if(dY < m_dFy1)m_dFy1=dY;
if(dX > m_dFx2)m_dFx2=dX;
if(dY > m_dFy2)m_dFy2=dY;
ImageToProjection(m_pImage->m_iNbcol,m_pImage->m_iNblig,dX,dY);
if(dX < m_dFx1)m_dFx1=dX;
if(dY < m_dFy1)m_dFy1=dY;
if(dX > m_dFx2)m_dFx2=dX;
if(dY > m_dFy2)m_dFy2=dY;
ImageToProjection(0,m_pImage->m_iNblig,dX,dY);
if(dX < m_dFx1)m_dFx1=dX;
if(dY < m_dFy1)m_dFy1=dY;
if(dX > m_dFx2)m_dFx2=dX;
if(dY > m_dFy2)m_dFy2=dY;
double dXProj1,dYProj1,dXProj2,dYProj2;
m_pAmers->Fenetre(dXProj1,dYProj1,dXProj2,dYProj2);
if(dXProj1 < m_dFx1)m_dFx1=dXProj1;
if(dYProj1 < m_dFy1)m_dFy1=dYProj1;
if(dXProj2 > m_dFx2)m_dFx2=dXProj2;
if(dYProj2 > m_dFy2)m_dFy2=dYProj2;
//--- aligner la fentre de recalage sur la rsolution des pixels
double dXProj0,dYProj0;
::SavToProj(m_pAmers->m_dtabXSav[0],m_pAmers->m_dtabYSav[0],dXProj0,dYProj0);
double
double
double
double

dXb=m_dFx1+dXProj0;
dYb=m_dFy1+dYProj0;
dXh=m_dFx2+dXProj0;
dYh=m_dFy2+dYProj0;

dXb=((long)
dYb=((long)
dXh=((long)
dYh=((long)

(dXb/m_dResolution))*m_dResolution;
(dYb/m_dResolution))*m_dResolution;
(dXh/m_dResolution)+1)*m_dResolution;
(dYh/m_dResolution)+1)*m_dResolution;

m_dFx1=dXb-dXProj0;
m_dFy1=dYb-dYProj0;
m_dFx2=dXh-dXProj0;
m_dFy2=dYh-dYProj0;
m_iNbligDestination=(int) ((m_dFy2-m_dFy1)/m_dResolution);
m_iNbcolDestination=(int) ((m_dFx2-m_dFx1)/m_dResolution);
int iReste=4-(m_iNbcolDestination % 4);
if(iReste != 4)m_iNbcolDestination+=iReste;
m_dFx2=m_dFx1 + m_iNbcolDestination*m_dResolution;
}

La mthode Recalage() effectue la fois le redressement et le rchantillonage. Par exemple, pour un r-chantillonnage par plus proche voisin, le
calcul est le suivant :
//--- recalage plus proche voisin
ilig=0;
dY=m_dFy1+(m_dResolution/2.);
while(ilig < m_iNbligDestination)
{
icol=0;
dX=m_dFx1+(m_dResolution/2.);
while(icol < m_iNbcolDestination)
{

Structures et mthodes : implmentation 479


ProjectionToImage(dX,dY,iX,iY);
if(iX >= 0 && iX < m_pImage->m_iNbcol && iY >= 0 && iY < m_pImage->m_iNblig)
buffer[icol]=m_pImage->m_bPixels[(iY*m_pImage->m_iNbcol)+iX];
else buffer[icol]=0;
dX+=m_dResolution;
icol++;
}
fwrite(buffer,1,m_iNbcolDestination,FileBmp);
dY+=m_dResolution;
ilig++;
}

ilig=0;
dY=m_dFy1+(m_dResolution/2.);
while(ilig < m_iNbligDestination)
{
icol=0;
dX=m_dFx1+(m_dResolution/2.);
while(icol < m_iNbcolDestination)
{
ProjectionToImage(dX,dY,dXImage,dYImage);
alfa0=dXImage-floor(dXImage);
alfa1=1.-alfa0;
beta0=dYImage-floor(dYImage);
beta1=1.-beta0;
iX=(int) dXImage;
iY=(int) dYImage;
if(iX >= 0 && iX < m_pImage->m_iNbcol-1 && iY >= 0 && iY < m_pImage->m_iNblig-1)
{
dVal00=(double) m_pImage->m_bPixels[(iY*m_pImage->m_iNbcol)+iX];
dVal01=(double) m_pImage->m_bPixels[(iY*m_pImage->m_iNbcol)+iX+1];
dVal10=(double) m_pImage->m_bPixels[((iY+1)*m_pImage->m_iNbcol)+iX];
dVal11=(double) m_pImage->m_bPixels[((iY+1)*m_pImage->m_iNbcol)+iX+1];
buffer[icol]=(int)
(beta0*alfa0*dVal00+beta0*alfa1*dVal01+beta1*alfa0*dVal10+beta1*alfa1*dVal11);
}
else buffer[icol]=0;
dX+=m_dResolution;
icol++;
}
fwrite(buffer,1,m_iNbcolDestination,FileBmp);
dY+=m_dResolution;
ilig++;
}

Le calcul bicubique calcule la valeur en fonction de la position du point sur une


fentre de 4*4 voisins :
ilig=0;
dY=m_dFy1+(m_dResolution/2.);
while(ilig < m_iNbligDestination)
{
icol=0;
dX=m_dFx1+(m_dResolution/2.);
while(icol < m_iNbcolDestination)
{
ProjectionToImage(dX,dY,dXImage,dYImage);
iX=(int) dXImage;
iY=(int) dYImage;
if(iX >= 1 && iX < m_pImage->m_iNbcol-2 && iY >= 1 && iY < m_pImage->m_iNblig-2)
{
alfa1=dXImage-floor(dXImage);
alfa0=1.+alfa1;
alfa2=1.-alfa1;
alfa3=2.-alfa1;
beta1=dYImage-floor(dYImage);
beta0=1.+beta1;
beta2=1.-beta1;

480

Annexe
beta3=2.-beta1;
CX0=alfa0*(-alfa0*alfa0 + 5.*alfa0 - 8.) + 4.;
CX1=alfa1*alfa1*(alfa1 - 2.) + 1.;
CX2=alfa2*alfa2*(alfa2 - 2.) + 1.;
CX3=alfa3*(-alfa3*alfa3 + 5*alfa3 - 8.) + 4.;
CY0=beta0*(-beta0*beta0 + 5*beta0 - 8.) + 4.;
CY1=beta1*beta1*(beta1 - 2.) + 1.;
CY2=beta2*beta2*(beta2 - 2.) + 1.;
CY3=beta3*(-beta3*beta3 + 5.*beta3 - 8.) + 4.;
iIndice=(iY-1)*m_pImage->m_iNbcol+iX;
dVal00=(double) m_pImage->m_bPixels[iIndice-1];
dVal01=(double) m_pImage->m_bPixels[iIndice];
dVal02=(double) m_pImage->m_bPixels[iIndice+1];
dVal03=(double) m_pImage->m_bPixels[iIndice+2];
iIndice=iY*m_pImage->m_iNbcol+iX;
dVal10=(double) m_pImage->m_bPixels[iIndice-1];
dVal11=(double) m_pImage->m_bPixels[iIndice];
dVal12=(double) m_pImage->m_bPixels[iIndice+1];
dVal13=(double) m_pImage->m_bPixels[iIndice+2];
iIndice=(iY+1)*m_pImage->m_iNbcol+iX;
dVal20=(double) m_pImage->m_bPixels[iIndice-1];
dVal21=(double) m_pImage->m_bPixels[iIndice];
dVal22=(double) m_pImage->m_bPixels[iIndice+1];
dVal23=(double) m_pImage->m_bPixels[iIndice+2];
iIndice=(iY+2)*m_pImage->m_iNbcol+iX;
dVal30=(double) m_pImage->m_bPixels[iIndice-1];
dVal31=(double) m_pImage->m_bPixels[iIndice];
dVal32=(double) m_pImage->m_bPixels[iIndice+1];
dVal33=(double) m_pImage->m_bPixels[iIndice+2];
dVal=CY0*(CX0*dVal00 + CX1*dVal01 + CX2*dVal02 + CX3*dVal03);
dVal+=CY1*(CX0*dVal10 + CX1*dVal11 + CX2*dVal12 + CX3*dVal13);
dVal+=CY2*(CX0*dVal20 + CX1*dVal21 + CX2*dVal22 + CX3*dVal23);
dVal+=CY3*(CX0*dVal30 + CX1*dVal31 + CX2*dVal32 + CX3*dVal33);
buffer[icol]=(int) dVal;
}
else buffer[icol]=0;

dX+=m_dResolution;
icol++;
}
fwrite(buffer,1,m_iNbcolDestination,FileBmp);
dY+=m_dResolution;
ilig++;
}

A.3.3. La classe CTessel


La classe CTessel permet deffectuer le calcul de la triangulation de Delaunay
partir des points damers, et le redressement polynomail de degr 1 dans chacun des
triangles. La triangulation de Delaunay est calcule par insertion successive des
points damer. Le redressement utilise une image rasterise de la triangulation pour
dterminer le triangle auquel appartient le point redresser, et dterminer ainsi les
coefficients du redressement de degr 1.
class CTessel
{
friend class CYX;
private:
double m_dResolution;
CAmers* m_pAmers;
CImage* m_pImage;

Structures et mthodes : implmentation 481


CSimilitude *m_pSimilitude;
CSysteme1 *m_pSysteme1;
int m_iRecalageInitial;
//--- fenetre d'arrivee, en projection
double m_dFx1;
double m_dFy1;
double m_dFx2;
double m_dFy2;
double m_dXProj0;
double m_dYProj0;
int m_iNbligDestination;
int m_iNbcolDestination;
//--- structures
NOEUD *m_TableNoeuds;
int m_iNombredeNoeuds;
int m_iNumeroTriangle;
//--- fonctions locales de tesselation
void GenerationTriangle(FILE *FileArc,FILE *FileDat,int ,int ,int );
void InitTriangulation(int *triangle,double flxb,double flyb,double flxh,double flyh);
int InsertionPoint(POINTR2 point,TRIANGLE *triangle );
void supprimerliste(LISTE *tete) ;
LISTE *init_liste();
void suppression(LISTE *tete, int indice);
int prede_succ(LISTE *tete, int indice, int *predecesseur, int *successeur) ;
int succ(LISTE *tete, int indice) ;
LISTE *insertion(LISTE *tete, LISTE *noeud, int indice);
void init_pile();
void supprimepile();
void empiler(int a, int b, int c, int d)
;
void depiler(int *a, int *b, int *c, int *d);
int pile_vide() ;
void insertion_liste_ordonnee(int a, int b, int c);
int chercher_le_triangle(int *a, int *b, int *c, POINTR2 point);
int cherche_point_oppose(int a, int b, int c);
int adjacent(int a, int b, int c);
int est_un_triangle(int a, int b, int c);
void creation_triangle(int a, int b, int c);
void del_triangle(int a, int b, int c);
int split_triangle(int a, int b, int c, POINTR2 point, TRIANGLE *triangle);
void split3_triangle(int a, int b, int c, int d, TRIANGLE *triangle);
void split4_triangle(int a, int b, int c, int d, int e, TRIANGLE *triangle);
int swap(int a, int b, int c, int d);
void split_quad(int a, int b, int c, int d, TRIANGLE *triangle);
int position_point_segment(POINTR2 p1, POINTR2 p2, POINTR2 p0s, POINTR2 p1s);
double pseudo_angle(POINTR2 p1, POINTR2 p2);
double angle_point(POINTR2 a, POINTR2 b, POINTR2 c);
int point_non_alignes(POINTR2 p1, POINTR2 p2, POINTR2 p3);
int quadrilatere_strictement_convexe(POINTR2 pa, POINTR2 pb, POINTR2 pc, POINTR2 pd);
int compare_point(POINTR2 p1, POINTR2 p2);
int modulo(int i, int j, int k);
void copier_point(POINTR2 p1, POINTR2 *p2);
public:
CTessel(CAmers* pAmers);
CTessel(CAmers* pAmers,CImage* pImage,CSimilitude* pSimilitude);
CTessel(CAmers* pAmers,CImage* pImage,CSysteme1* pSysteme1);
~CTessel();
int Tesselation();
int TesselationSansRecalage();
void Raster();
void Recalage(int iNbTriangles,int iModeRecalage);
};

Voici une partie du code de la procdure de redressement par triangulation :


void CTessel::Recalage(int iNbTriangle,int iModeRecalage)
{
char chNomFichierDat[_MAX_PATH];
strcpy(chNomFichierDat,schema.m_chDirUser);
strcat(chNomFichierDat,"\\ftdat");
char chNomFichierTriangle[_MAX_PATH];
strcpy(chNomFichierTriangle,schema.m_chDirUser);
strcat(chNomFichierTriangle,"\\ftImageTriangle");
char chNomFichier[_MAX_PATH];

482

Annexe

char chNomFichierDepl[_MAX_PATH];
FILE *FileBmp,*FileDepl;
strcpy(chNomFichier,m_pImage->m_chNomFichier);
strcat(chNomFichier,"R.bmp");
strcpy(chNomFichierDepl,m_pImage->m_chNomFichier);
strcat(chNomFichierDepl,"RDiff.bmp");
if((FileBmp=fopen(chNomFichier,"wb")) != NULL
NULL)
{
//--- fichier dplacement
BITMAPFILEHEADER BitmapFileHeaderDepl;
BITMAPINFOHEADER BitmapInfoHeaderDepl;
RGBQUAD PaletteEntriesDepl[256];

&& (FileDepl=fopen(chNomFichierDepl,"wb")) !=

//--- BITMAPFILEHEADER
char bm[3];
strcpy(bm,"BM");
memcpy(&BitmapFileHeaderDepl.bfType,bm,2);
int iSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(PaletteEntriesDepl);
iSize+=(m_iNbligDestination*m_iNbcolDestination);
BitmapFileHeaderDepl.bfSize=iSize;
BitmapFileHeaderDepl.bfReserved1=0;
BitmapFileHeaderDepl.bfReserved2=0;
BitmapFileHeaderDepl.bfOffBits=sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
sizeof(PaletteEntriesDepl);
//--- BITMAPINFOHEADER
BitmapInfoHeaderDepl.biSize=(DWORD) sizeof(BITMAPINFOHEADER);
BitmapInfoHeaderDepl.biWidth=m_iNbcolDestination;
BitmapInfoHeaderDepl.biHeight=m_iNbligDestination;
BitmapInfoHeaderDepl.biPlanes=(WORD) 1;
BitmapInfoHeaderDepl.biBitCount=(WORD) 8;
BitmapInfoHeaderDepl.biCompression=BI_RGB;
BitmapInfoHeaderDepl.biSizeImage=(DWORD) (m_iNbligDestination*m_iNbcolDestination);
BitmapInfoHeaderDepl.biXPelsPerMeter=(LONG) m_dResolution;
BitmapInfoHeaderDepl.biYPelsPerMeter=(LONG) m_dResolution;
BitmapInfoHeaderDepl.biClrUsed=(DWORD) 0;
BitmapInfoHeaderDepl.biClrImportant=(DWORD) 0;
for(int i=0;i < 128;i++)
{
PaletteEntriesDepl[i].rgbBlue= (BYTE) i*2;
PaletteEntriesDepl[i].rgbGreen= (BYTE) i*2;
PaletteEntriesDepl[i].rgbRed= (BYTE) i*2;
PaletteEntriesDepl[i].rgbReserved= (BYTE) 0;
}
for(i=128;i < 256;i++)
{
PaletteEntriesDepl[i].rgbBlue= (BYTE) 255;
PaletteEntriesDepl[i].rgbGreen= (BYTE) 255;
PaletteEntriesDepl[i].rgbRed= (BYTE) 255;
PaletteEntriesDepl[i].rgbReserved= (BYTE) 0;
}
fwrite(&BitmapFileHeaderDepl,sizeof(BITMAPFILEHEADER),1,FileDepl);
fwrite(&BitmapInfoHeaderDepl,sizeof(BITMAPINFOHEADER),1,FileDepl);
fwrite(&PaletteEntriesDepl,sizeof(PaletteEntriesDepl),1,FileDepl);
//--- creation du tableau des coefficients
int iCode;
double *alpha;
double *beta;
double *gamma;
double *alphaprim;
double *betaprim;
double *gammaprim;
unsigned char *bufferDiff;
int *itabImage;
alpha=(double *) malloc(iNbTriangle*sizeof(double));
beta=(double *) malloc(iNbTriangle*sizeof(double));
gamma=(double *) malloc(iNbTriangle*sizeof(double));
if(alpha == NULL || beta == NULL || gamma == NULL)
{
::ErreurDeMemoire();
if(alpha != NULL)free(alpha);

Structures et mthodes : implmentation 483


if(beta != NULL)free(beta);
if(gamma != NULL)free(gamma);
fclose(FileBmp);
fclose(FileDepl);
unlink(chNomFichier);
unlink(chNomFichierDepl);
unlink(chNomFichierTriangle);
unlink(chNomFichierDat);
return;
}
alphaprim=(double *) malloc(iNbTriangle*sizeof(double));
betaprim=(double *) malloc(iNbTriangle*sizeof(double));
gammaprim=(double *) malloc(iNbTriangle*sizeof(double));
if(alphaprim == NULL || betaprim == NULL || gammaprim == NULL)
{
::ErreurDeMemoire();
if(alphaprim != NULL)free(alphaprim);
if(betaprim != NULL)free(betaprim);
if(gammaprim != NULL)free(gammaprim);
free(alpha);
free(beta);
free(gamma);
fclose(FileBmp);
fclose(FileDepl);
unlink(chNomFichier);
unlink(chNomFichierDepl);
unlink(chNomFichierTriangle);
unlink(chNomFichierDat);
return;
}
bufferDiff=(unsigned char *) malloc(m_iNbcolDestination*sizeof(unsigned char));
itabImage=(int *) malloc(m_iNbcolDestination*sizeof(int));
if(bufferDiff == NULL || itabImage == NULL)
{
::ErreurDeMemoire();
if(bufferDiff != NULL)free(bufferDiff);
if(itabImage != NULL)free(itabImage);
free(alpha);
free(beta);
free(gamma);
free(alphaprim);
free(betaprim);
free(gammaprim);
fclose(FileBmp);
fclose(FileDepl);
unlink(chNomFichier);
unlink(chNomFichierDepl);
unlink(chNomFichierTriangle);
unlink(chNomFichierDat);
return;
}
FILE* FileDat=fopen(chNomFichierDat,"rb");
if(FileDat == NULL)
{
free(bufferDiff);
free(itabImage);
free(alpha);
free(beta);
free(gamma);
free(alphaprim);
free(betaprim);
free(gammaprim);
fclose(FileBmp);
fclose(FileDepl);
unlink(chNomFichier);
unlink(chNomFichierDepl);
unlink(chNomFichierTriangle);
}
fread(&iCode,sizeof(int),1,FileDat);
while(!feof(FileDat))
{
fread(&alpha[iCode],sizeof(double),1,FileDat);

484

Annexe
fread(&beta[iCode],sizeof(double),1,FileDat);
fread(&gamma[iCode],sizeof(double),1,FileDat);
fread(&alphaprim[iCode],sizeof(double),1,FileDat);
fread(&betaprim[iCode],sizeof(double),1,FileDat);
fread(&gammaprim[iCode],sizeof(double),1,FileDat);
fread(&iCode,sizeof(int),1,FileDat);
}
fclose(FileDat);
unlink(chNomFichierDat);
FILE* FileImage=fopen(chNomFichierTriangle,"rb");
if(FileImage == NULL)
{
::ErreurDeFichier(chNomFichierTriangle);
free(bufferDiff);
free(itabImage);
free(alpha);
free(beta);
free(gamma);
free(alphaprim);
free(betaprim);
free(gammaprim);
fclose(FileBmp);
fclose(FileDepl);
unlink(chNomFichier);
unlink(chNomFichierDepl);
unlink(chNomFichierTriangle);
return;
}
if(m_pImage->m_iType == 6)
{
//--- 8 bits
BITMAPFILEHEADER BitmapFileHeader;
BITMAPINFOHEADER BitmapInfoHeader;
//--- BITMAPFILEHEADER
char bm[3];
strcpy(bm,"BM");
memcpy(&BitmapFileHeader.bfType,bm,2);

int iSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(m_pImage>m_PaletteEntries);
iSize+=(m_iNbligDestination*m_iNbcolDestination);
BitmapFileHeader.bfSize=iSize;
BitmapFileHeader.bfReserved1=0;
BitmapFileHeader.bfReserved2=0;
BitmapFileHeader.bfOffBits=sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
sizeof(m_pImage->m_PaletteEntries);
//--- BITMAPINFOHEADER
BitmapInfoHeader.biSize=(DWORD) sizeof(BITMAPINFOHEADER);
BitmapInfoHeader.biWidth=m_iNbcolDestination;
BitmapInfoHeader.biHeight=m_iNbligDestination;
BitmapInfoHeader.biPlanes=(WORD) 1;
BitmapInfoHeader.biBitCount=(WORD) 8;
BitmapInfoHeader.biCompression=BI_RGB;
BitmapInfoHeader.biSizeImage=(DWORD) (m_iNbligDestination*m_iNbcolDestination);
BitmapInfoHeader.biXPelsPerMeter=(LONG) m_dResolution;
BitmapInfoHeader.biYPelsPerMeter=(LONG) m_dResolution;
BitmapInfoHeader.biClrUsed=(DWORD) 0;
BitmapInfoHeader.biClrImportant=(DWORD) 0;
fwrite(&BitmapFileHeader,sizeof(BITMAPFILEHEADER),1,FileBmp);
fwrite(&BitmapInfoHeader,sizeof(BITMAPINFOHEADER),1,FileBmp);
fwrite(&m_pImage->m_PaletteEntries,sizeof(m_pImage->m_PaletteEntries),1,FileBmp);
//--- calcul et criture des pixels
unsigned char *buffer;
buffer=(unsigned char *) malloc(m_iNbcolDestination*sizeof(unsigned char));
if(buffer == NULL)
{
::ErreurDeMemoire();
free(bufferDiff);
free(itabImage);
free(alpha);

Structures et mthodes : implmentation 485


free(beta);
free(gamma);
free(alphaprim);
free(betaprim);
free(gammaprim);
fclose(FileBmp);
fclose(FileDepl);
fclose(FileImage);
unlink(chNomFichier);
unlink(chNomFichierDepl);
unlink(chNomFichierTriangle);
return;
}
double dX,dY,dXProj,dYProj,dDistance;
int j,iX,iY,ilig,icol,iDiff;
int iNbpt;
//--- init du progressCtrl
char chTitreProgress[100];
switch(config.m_iLangage)
{
case FRANCAIS:
default:
strcpy(chTitreProgress," Recalage en cours :");
break;
case ESPAGNOL:
strcpy(chTitreProgress," Calculo en curso :");
break;
case ANGLAIS:
strcpy(chTitreProgress," Working :");
break;
}
pMainFrame->InitProgress(chTitreProgress);
int iStep,iCount;
iStep=m_iNbligDestination/10;
if(iStep == 0)iStep=1;
iCount=0;
if(iModeRecalage == 0)
{
//--- recalage deux points
ilig=0;
dY=m_dFy1+(m_dResolution/2.);
while(ilig < m_iNbligDestination)
{
//--- lire la ligne triangle
for(icol=0;icol < m_iNbcolDestination;icol++)itabImage[icol]=0;
icol=0;
while(icol < m_iNbcolDestination)
{
fscanf(FileImage,"%d %d%*c",&iCode,&iNbpt);
j=0;
while(j < iNbpt)
{
itabImage[icol]=iCode;
icol++;
j++;
}
}
icol=0;
dX=m_dFx1+(m_dResolution/2.);
while(icol < m_iNbcolDestination)
{
//--- recalage Voronoi
iCode=itabImage[icol];
if(iCode > 0)
{
dXProj=alpha[iCode]*dX + beta[iCode]*dY + gamma[iCode];
dYProj=alphaprim[iCode]*dX + betaprim[iCode]*dY + gammaprim[iCode];
//--- deplacement du au voronoi
dDistance=sqrt((dX-dXProj)*(dX-dXProj)+(dY-dYProj)*(dY-dYProj));
iDiff=(int) (dDistance/m_dResolution);
if(iDiff > 255)iDiff=255;
bufferDiff[icol]=iDiff;

486

Annexe

if(m_iRecalageInitial == SIMILITUDE)m_pSimilitude>ProjectionToImage(dXProj,dYProj,iX,iY);
else m_pSysteme1->ProjectionToImage(dXProj,dYProj,iX,iY);
if(iX >= 0 && iX < m_pImage->m_iNbcol && iY >= 0 && iY < m_pImage->m_iNblig)
buffer[icol]=m_pImage->m_bPixels[(iY*m_pImage->m_iNbcol)+iX];
else buffer[icol]=0;
}
else
{
buffer[icol]=0;
bufferDiff[icol]=255;
}
dX+=m_dResolution;
icol++;
}
fwrite(buffer,1,m_iNbcolDestination,FileBmp);
if(config.m_bImageDifference)fwrite(bufferDiff,1,m_iNbcolDestination,FileDepl);
dY+=m_dResolution;
ilig++;

iCount++;
if(iCount > iStep)
{
iCount=0;
pMainFrame->StepProgress();
}
}

else if(iModeRecalage == 1)
{
//--- recalage bilineaire
double dXImage,dYImage;
double alfa0,alfa1,beta0,beta1;
double dVal00,dVal01,dVal10,dVal11;
ilig=0;
dY=m_dFy1+(m_dResolution/2.);
while(ilig < m_iNbligDestination)
{
//--- lire la ligne triangle
for(icol=0;icol < m_iNbcolDestination;icol++)itabImage[icol]=0;
icol=0;
while(icol < m_iNbcolDestination)
{
fscanf(FileImage,"%d %d%*c",&iCode,&iNbpt);
j=0;
while(j < iNbpt)
{
itabImage[icol]=iCode;
icol++;
j++;
}
}
icol=0;
dX=m_dFx1+(m_dResolution/2.);
while(icol < m_iNbcolDestination)
{
//--- recalage Voronoi
iCode=itabImage[icol];
if(iCode > 0)
{
dXProj=alpha[iCode]*dX + beta[iCode]*dY + gamma[iCode];
dYProj=alphaprim[iCode]*dX + betaprim[iCode]*dY + gammaprim[iCode];
//--- deplacement du au voronoi
dDistance=sqrt((dX-dXProj)*(dX-dXProj)+(dY-dYProj)*(dY-dYProj));
iDiff=(int) (dDistance/m_dResolution);
if(iDiff > 255)iDiff=255;
bufferDiff[icol]=iDiff;
if(m_iRecalageInitial == SIMILITUDE)m_pSimilitude>ProjectionToImage(dXProj,dYProj,dXImage,dYImage);
else m_pSysteme1->ProjectionToImage(dXProj,dYProj,dXImage,dYImage);
alfa0=dXImage-floor(dXImage);
alfa1=1.-alfa0;
beta0=dYImage-floor(dYImage);

Structures et mthodes : implmentation 487


beta1=1.-beta0;
iX=(int) dXImage;
iY=(int) dYImage;
>m_iNblig-1)

if(iX >= 0 && iX < m_pImage->m_iNbcol-1 && iY >= 0 && iY < m_pImage{
dVal00=(double)
dVal01=(double)
dVal10=(double)
dVal11=(double)

m_pImage->m_bPixels[(iY*m_pImage->m_iNbcol)+iX];
m_pImage->m_bPixels[(iY*m_pImage->m_iNbcol)+iX+1];
m_pImage->m_bPixels[((iY+1)*m_pImage->m_iNbcol)+iX];
m_pImage->m_bPixels[((iY+1)*m_pImage->m_iNbcol)+iX+1];

buffer[icol]=(int)
(beta0*alfa0*dVal00+beta0*alfa1*dVal01+beta1*alfa0*dVal10+beta1*alfa1*dVal11);
}
else buffer[icol]=0;
}
else
{
buffer[icol]=0;
bufferDiff[icol]=255;
}
dX+=m_dResolution;
icol++;
}
fwrite(buffer,1,m_iNbcolDestination,FileBmp);
if(config.m_bImageDifference)fwrite(bufferDiff,1,m_iNbcolDestination,FileDepl);
dY+=m_dResolution;
ilig++;

iCount++;
if(iCount > iStep)
{
iCount=0;
pMainFrame->StepProgress();
}
}

else if(iModeRecalage == 2)
{
//--- recalage bicubique
int iIndice;
double dXImage,dYImage;
double alfa0,alfa1,alfa2,alfa3,beta0,beta1,beta2,beta3;
double CX0,CX1,CX2,CX3,CY0,CY1,CY2,CY3;
double dVal00,dVal01,dVal02,dVal03;
double dVal10,dVal11,dVal12,dVal13;
double dVal20,dVal21,dVal22,dVal23;
double dVal30,dVal31,dVal32,dVal33;
double dVal;
ilig=0;
dY=m_dFy1+(m_dResolution/2.);
while(ilig < m_iNbligDestination)
{
//--- lire la ligne triangle
for(icol=0;icol < m_iNbcolDestination;icol++)itabImage[icol]=0;
icol=0;
while(icol < m_iNbcolDestination)
{
fscanf(FileImage,"%d %d%*c",&iCode,&iNbpt);
j=0;
while(j < iNbpt)
{
itabImage[icol]=iCode;
icol++;
j++;
}
}
icol=0;
dX=m_dFx1+(m_dResolution/2.);
while(icol < m_iNbcolDestination)
{
//--- recalage Voronoi
iCode=itabImage[icol];
if(iCode > 0)

488

Annexe
{
dXProj=alpha[iCode]*dX + beta[iCode]*dY + gamma[iCode];
dYProj=alphaprim[iCode]*dX + betaprim[iCode]*dY + gammaprim[iCode];
//--- deplacement du au voronoi
dDistance=sqrt((dX-dXProj)*(dX-dXProj)+(dY-dYProj)*(dY-dYProj));
iDiff=(int) (dDistance/m_dResolution);
if(iDiff > 255)iDiff=255;
bufferDiff[icol]=iDiff;

if(m_iRecalageInitial == SIMILITUDE)m_pSimilitude>ProjectionToImage(dXProj,dYProj,dXImage,dYImage);
else m_pSysteme1->ProjectionToImage(dXProj,dYProj,dXImage,dYImage);
iX=(int) dXImage;
iY=(int) dYImage;
>m_iNblig-2)

if(iX >= 1 && iX < m_pImage->m_iNbcol-2 && iY >= 1 && iY < m_pImage{
alfa1=dXImage-floor(dXImage);
alfa0=1.+alfa1;
alfa2=1.-alfa1;
alfa3=2.-alfa1;
beta1=dYImage-floor(dYImage);
beta0=1.+beta1;
beta2=1.-beta1;
beta3=2.-beta1;
CX0=alfa0*(-alfa0*alfa0 + 5.*alfa0 - 8.) + 4.;
CX1=alfa1*alfa1*(alfa1 - 2.) + 1.;
CX2=alfa2*alfa2*(alfa2 - 2.) + 1.;
CX3=alfa3*(-alfa3*alfa3 + 5*alfa3 - 8.) + 4.;
CY0=beta0*(-beta0*beta0 + 5*beta0 - 8.) + 4.;
CY1=beta1*beta1*(beta1 - 2.) + 1.;
CY2=beta2*beta2*(beta2 - 2.) + 1.;
CY3=beta3*(-beta3*beta3 + 5.*beta3 - 8.) + 4.;
iIndice=(iY-1)*m_pImage->m_iNbcol+iX;
dVal00=(double) m_pImage->m_bPixels[iIndice-1];
dVal01=(double) m_pImage->m_bPixels[iIndice];
dVal02=(double) m_pImage->m_bPixels[iIndice+1];
dVal03=(double) m_pImage->m_bPixels[iIndice+2];
iIndice=iY*m_pImage->m_iNbcol+iX;
dVal10=(double) m_pImage->m_bPixels[iIndice-1];
dVal11=(double) m_pImage->m_bPixels[iIndice];
dVal12=(double) m_pImage->m_bPixels[iIndice+1];
dVal13=(double) m_pImage->m_bPixels[iIndice+2];
iIndice=(iY+1)*m_pImage->m_iNbcol+iX;
dVal20=(double) m_pImage->m_bPixels[iIndice-1];
dVal21=(double) m_pImage->m_bPixels[iIndice];
dVal22=(double) m_pImage->m_bPixels[iIndice+1];
dVal23=(double) m_pImage->m_bPixels[iIndice+2];
iIndice=(iY+2)*m_pImage->m_iNbcol+iX;
dVal30=(double) m_pImage->m_bPixels[iIndice-1];
dVal31=(double) m_pImage->m_bPixels[iIndice];
dVal32=(double) m_pImage->m_bPixels[iIndice+1];
dVal33=(double) m_pImage->m_bPixels[iIndice+2];
dVal=CY0*(CX0*dVal00 + CX1*dVal01 + CX2*dVal02 + CX3*dVal03);
dVal+=CY1*(CX0*dVal10 + CX1*dVal11 + CX2*dVal12 + CX3*dVal13);
dVal+=CY2*(CX0*dVal20 + CX1*dVal21 + CX2*dVal22 + CX3*dVal23);
dVal+=CY3*(CX0*dVal30 + CX1*dVal31 + CX2*dVal32 + CX3*dVal33);
buffer[icol]=(int) dVal;
}
else buffer[icol]=0;
}
else
{
buffer[icol]=0;
bufferDiff[icol]=255;
}

dX+=m_dResolution;
icol++;
}
fwrite(buffer,1,m_iNbcolDestination,FileBmp);

Structures et mthodes : implmentation 489


if(config.m_bImageDifference)fwrite(bufferDiff,1,m_iNbcolDestination,FileDepl);
dY+=m_dResolution;
ilig++;

iCount++;
if(iCount > iStep)
{
iCount=0;
pMainFrame->StepProgress();
}
}

pMainFrame->CloseProgress();
free(buffer);
}
else if(m_pImage->m_iType == 8)
{
//--- 24 bits, 3 octets par pixel, processus identique
.
}
free(bufferDiff);
free(itabImage);
free(alpha);
free(beta);
free(gamma);
free(alphaprim);
free(betaprim);
free(gammaprim);
fclose(FileImage);
fclose(FileBmp);
fclose(FileDepl);
if(config.m_bImageDifference == FALSE)unlink(chNomFichierDepl);
unlink(chNomFichierTriangle);
}
//--- fichier .car
double dProj[20];
projection.GetProjection(dProj);
double dXProj0,dYProj0;
::SavToProj(m_pAmers->m_dtabXSav[0],m_pAmers->m_dtabYSav[0],dXProj0,dYProj0);
char chNomImage[_MAX_PATH];
strcpy(chNomImage,m_pImage->m_chNomFichier);
strcat(chNomImage,"R");
double dXb=m_dFx1+dXProj0;
double dYb=m_dFy1+dYProj0;
::CreationFichierCar(chNomImage,m_dResolution,1,dXb,dYb,m_iNbcolDestination,m_iNbligDestinat
ion,m_pImage->GetType(),dProj);
if(config.m_bImageDifference)
{
strcpy(chNomImage,m_pImage->m_chNomFichier);
strcat(chNomImage,"RDiff");
dXb=m_dFx1+dXProj0;
dYb=m_dFy1+dYProj0;
::CreationFichierCar(chNomImage,m_dResolution,1,dXb,dYb,m_iNbcolDestination,m_iNbligDestinat
ion,m_pImage->GetType(),dProj);
}
}

A.4. Savedit
A.4.1. La classe CArc
La classe CArc de SAVEDIT est plus complte que la classe CArc de SAVANE.
Elle comprend en particulier des variables membres conservant ltat de larc

490

Annexe

(simplicit, extra-simplicit) et permettant de dessiner ces arcs avec une couleur


dpendant de leur tat de validit. Lallocation mmoire pour les points (tableau
m_ArrayPoint) est dynamique. Elle utilise les fonctionnalits de la classe CArray
de la MFC.
class CArc
{
private:
int m_iNbpt; //--- nombre de points de larc
int m_iNz1; //--- numro de zone adjacente dans le cas dun document de type zone
int m_iNz2; //--- numro de zone adjacente dans le cas dun document de type zone
int m_iSens; //--- sens de larc
int m_iSelection; //--- point slectionn dans l'arc
double m_dXminSav,m_dYminSav,m_dXmaxSav,m_dYmaxSav; //--- fentre de larc
public:
CArray<CPoint,CPoint> m_ArrayPoint; / :--- tableau des points
int m_iSimplicite; //--- indicateur de simplifict
int m_iExtraSimplicite; //--- indicateur dextra-simplifict
int m_iTestAngleFerme; //--- indicateur dangle entre deux points
public:
CArc();
CArc(int iNbpt);
~CArc();
int GetNbpt() {return m_iNbpt;}
int GetSens() {return m_iSens;}
int GetNoZone1() {return m_iNz1;};
int GetNoZone2() {return m_iNz2;};
void SetNbpt(int iNbpt) {m_iNbpt=iNbpt;};
void SetSens(int iSens) {m_iSens=iSens;};
void SetNoZone1(int iNo) {m_iNz1=iNo;};
void SetNoZone2(int iNo) {m_iNz2=iNo;};
void GetPoint(int i,double &dX,double &dY)
{
dX=m_ArrayPoint[i].m_dX;
dY=m_ArrayPoint[i].m_dY;
};
void SetPoint(int i,double &dX,double &dY)
{
m_ArrayPoint[i].m_dX=dX;
m_ArrayPoint[i].m_dY=dY;
};
void AddPoint(CPoint point) {m_ArrayPoint.Add(point);};
void AddPoint(double dX,double dY)
{
CPoint point(dX,dY);
m_ArrayPoint.Add(point);
};
void SetPointGrow(int i,CPoint point) {m_ArrayPoint.SetAtGrow(i,point);}
void SetPointGrow(int i,double dX,double dY)
{
CPointMygale point(dX,dY);
m_ArrayPoint.SetAtGrow(i,point);
}
int GetSelection() {return m_iSelection;}
void SetSelection(int iNo) {if(iNo >= 0 && iNo < m_iNbpt)m_iSelection=iNo; else
m_iSelection=-1;}
int SelectionnerUnPoint(double dXGeo,double dYGeo);
void SupprimerUnPoint(int iNoPoint);
void GetFenetreSav(double &dXmin,double &dYmin,double &dXmax,double &dYmax)
{
dXmin=m_dXminSav;
dYmin=m_dYminSav;
dXmax=m_dXmaxSav;
dYmax=m_dYmaxSav;
}
BOOL Intersect(double dX1,double dY1,double dX2,double dY2);
BOOL TestSimplicite(double& dXRes,double& dYRes);
BOOL TestExtraSimplicite(CArc* pArc,double& dXRes,double& dYRes,int& iNoPointArc1,int&
iNoPointArc2);
BOOL TestAngleEntreSegments(double dAngleMinimum,double& dXRes,double& dYRes);
BOOL TestIntersection(double dLong1,double dColat1,double dLong2,double dColat2,double&
dXRes,double& dYRes);
void CalculFenetreSav();
void CalculCentroide(double &dX,double &dY);

Structures et mthodes : implmentation 491


void GetCentroide(double &dXGeo,double &dYGeo);
double DistanceAUnPoint(double dXGeo,double dYGeo);
int DistanceAUnPoint(int iXVue,int iYVue);
int InsererUnPoint(double dXGeo,double dYGeo);
BOOL InsererUnPoint(double dXGeo,double dYGeo,int iNoPoint);
int PointLePlusProche(double dXGeo,double dYGeo,double dDistanceRecherche,double
dDistanceJointure,double& dXGeoRes,double& dYGeoRes,double &dDistance,int& iNoPoint);
void Filtrer(double dSurfaceMinimum);
void FiltrerMetre(double dSurfaceMinimum);
void Nettoyer();
void Arrondir(int iPrecision);
void Molodensky(CMolodensky* pMolodensky);
void Translation(double dXProj,double dYProj);
void Tracer(CDC* pDc);
void TracerAvecTranslation(CDC* pDc,int iTranslationX,int iTranslationY);
void Tracer(CDC* pDc,COLORREF Couleur);
void TracerAvecLesPoints(CDC* pDC);
void TracerAvecLesPoints(CDC* pDC,COLORREF Couleur);
void EffacerLesPoints(CDC* pDC);
void TracerUnPoint(CDC* pDC,int iNoPoint,COLORREF Couleur);
void Recopier(CArcMygale* pArc);
void ChangerLeSens();
void Chainer(BOOL bSens,int iTypeCoordonnees,int& iIndex,int& iNbptPolygon,double
*dtabPoints);
};

La mthode TestSimplicite() permet de tester la simplicit dun arc. Elle


utilise la procdure SegmentIntersection() qui contrle lintersection de deux
segments de droite :
BOOL CArc::TestSimplicite(double& dXRes,double& dYRes)
{
dXRes=0.;
dYRes=0.;
m_iSimplicite=0;
if(m_iNbpt < 3)return TRUE;
double dX1,dY1,dX2,dY2,dX3,dY3,dX4,dY4;
int j,k;
for(j=1;j < m_iNbpt;j++)
{
GetPoint(j-1,dX1,dY1);
GetPoint(j,dX2,dY2);
for(k=j+1;k < m_iNbpt;k++)
{
GetPoint(k-1,dX3,dY3);
GetPoint(k,dX4,dY4);
if(SegmentIntersection(dX1,dY1,dX2,dY2,dX3,dY3,dX4,dY4,dXRes,dYRes))
{
m_iSimplicite=1;
return FALSE;
}
}
}
return TRUE;
}

La mthode TestExtraSimplicite() permet de tester lintersection dun arc


avec un autre. Elle utilise galement la procdure SegmentIntersection() qui
contrle lintersection de deux segments de droite, aprs avoir test lintersection
possible des arcs en utilisant les BoundingBox des deux arcs (mthode
Intersect() de CArc).
BOOL CArc::TestExtraSimplicite(CArc* pArc,double& dXRes,double& dYRes,int& iNoPointArc1,int&
iNoPointArc2)
{
dXRes=0.;
dYRes=0.;
iNoPointArc1=0;
iNoPointArc2=0;
if(pArc == NULL)return TRUE;
if(pArc == this)return TRUE;

492

Annexe

//--- tester l'intersection des fentre des arcs


double dXMin,dYMin,dXMax,dYMax;
pArc->GetFenetreSav(dXMin,dYMin,dXMax,dYMax);
if(Intersect(dXMin,dYMin,dXMax,dYMax) == FALSE)return TRUE;
double dX1,dY1,dX2,dY2,dX3,dY3,dX4,dY4;
int j,k;
int iNbpt=pArc->GetNbpt();
for(j=1;j < m_iNbpt;j++)
{
GetPoint(j-1,dX1,dY1);
GetPoint(j,dX2,dY2);
for(k=1;k < iNbpt;k++)
{
pArc->GetPoint(k-1,dX3,dY3);
pArc->GetPoint(k,dX4,dY4);
if(SegmentIntersection(dX1,dY1,dX2,dY2,dX3,dY3,dX4,dY4,dXRes,dYRes))
{
iNoPointArc1=j-1;
iNoPointArc2=k-1;
return FALSE;
}
}
}
return TRUE;
}

La mthode PointLePlusProche() permet de dterminer les coordonnes du


point de larc le plus proche dun point donn :
int CArc::PointLePlusProche(double dXGeo,double dYGeo,double dDistanceRecherche,double
dDistanceJointure,double& dXGeoRes,double& dYGeoRes,double &dDistance,int& iNoPoint)
{
//--- dDistanceRecherche en minutes
//--- retourne le type, la distance avec l'arc, le point rsultat, le numro du point dans
l'arc
//--- type : -1 echec, 0 nouveau point, 1 premier noeud, 2 dernier noeud, 3 point de l'arc
int i;
iNoPoint=-1;
dXGeoRes=0.;
dYGeoRes=0.;
dDistance=-DINCONNU;
if(m_iNbpt < 2)return -1;
double dX1,dY1,dX2,dY2,dXSav,dYSav;
dX1=m_dXminSav - dDistanceRecherche;
dX2=m_dXmaxSav + dDistanceRecherche;
dY1=m_dYminSav - dDistanceRecherche;
dY2=m_dYmaxSav + dDistanceRecherche;
wind.GeoToSav(dXGeo,dYGeo,dXSav,dYSav);
if(dXSav < dX1 || dXSav > dX2 || dYSav < dY1 || dYSav > dY2)return -1;
//--- premier passage : test sur les points de l'arc
double dP1P2;
int iType=-1;
iNoPoint=-1;
double dDistanceAuCarre=dDistanceRecherche*dDistanceRecherche;
for(i=0;i < m_iNbpt;i++)
{
GetPoint(i,dX1,dY1);
dP1P2=((dXGeo-dX1)*(dXGeo-dX1))+((dYGeo-dY1)*(dYGeo-dY1));
if(dP1P2 < dDistanceAuCarre)
{
iNoPoint=i;
dXGeoRes=dX1;
dYGeoRes=dY1;
dDistanceAuCarre=dP1P2;
}
}
if(iNoPoint == 0)iType=1; //--- premier point
else if(iNoPoint == m_iNbpt-1)iType=2; //--- dernier point
else if(iNoPoint > 0)iType=3; //--- un point de l'arc

Structures et mthodes : implmentation 493


dDistance=sqrt(dDistanceAuCarre);
if(dDistance < dDistanceJointure)
{
//--- le point de l'arc rpond la question, on sort
return iType;
}
//--- deuxime passage : test sur les segments de l'arc
double d,dX,dY,cosTeta,sinTeta,dXPrim,dYPrim;
GetPoint(0,dX1,dY1);
for(i=1;i < m_iNbpt;i++)
{
GetPoint(i,dX2,dY2);
dP1P2=((dX2-dX1)*(dX2-dX1))+((dY2-dY1)*(dY2-dY1));
if(dP1P2 > 0.)
{
dP1P2=sqrt(dP1P2);
//--- changement de repere pour les calculs
cosTeta=(dX2-dX1)/dP1P2;
sinTeta=(dY2-dY1)/dP1P2;
dX=dXGeo-dX1;
dY=dYGeo-dY1;
dXPrim=dX*cosTeta+dY*sinTeta;
dYPrim=dY*cosTeta-dX*sinTeta;
if(dXPrim >= 0. && dXPrim <= dP1P2)
{
d=fabs(dYPrim);
if(d < dDistance)
{
dDistance=d;
iNoPoint=i-1;
iType=0; //--- nouveau point crer
//--- rechangement de repre pour avoir le point d'intersection sur le segment
(dYPrim = 0)
dXGeoRes=dXPrim*cosTeta + dX1;
dYGeoRes=dXPrim*sinTeta + dY1;
}
}
}
dX1=dX2;
dY1=dY2;
}
if(iNoPoint >= 0)
{
return iType;
}
return -1;
}

A.4.2. La classe CSaveditDocument


Toutes les variables et procdures lie document de saisie sont regroupes dans
une classe nomme CSaveditDocument. On notera en particulier les variables qui
conservent les coordonnes des lments graphiques et la valeur ou la cl des objets
(CArc* m_ptabArc; double* m_dtabPoint; double* m_dtabValeur;
char* m_ctabCle). Lallocation mmoire de ces variables est effectue dans les
mthodes Nouveau() ou Ouvrir() de lobjet CSaveditDocument, en fonction
du type des objets.
class CSaveditDocument
{
private:
BOOL m_bOuvert;
BOOL m_bASauver;
BOOL m_bARasteriser;
char m_chNomFichier[_MAX_PATH];
//--- paramtres du .car
int m_iVersion;

494

Annexe
int m_iTypeObjet;
int m_iTypeSaisie;
char m_chNomDocument[100];
int m_iEchelle;
char m_chOperateur[100];
char m_chDatum[100];
char m_chDate[100];
char m_chCreation[100];
double m_dX1,m_dY1,m_dX2,m_dY2;
int m_iNbcharCle;
//--- objets graphiques, mmoire alloue en fonction du type
int m_iNoZoneLibre;
int m_iNbObjet;
int m_iNbArc;
CArc* m_ptabArc[NB_MAX_ARC];
int m_itabNoZone[NB_MAX_OBJET];
double* m_dtabPoint;
double* m_dtabValeur;
char* m_ctabCle;
//--- dition et slection
int m_iNbObjetSelection;
int m_iObjetSelection;
int m_itabObjetSelection[NB_MAX_SELECTION];
int m_iNbArcSelection;
int m_iArcSelection;
int m_itabArcSelection[NB_MAX_SELECTION];

//--- pour le undo


public:
CArcMygale* m_ptabArcModifie[NB_MAX_UNDO];
CArcMygale* m_ptabArcSauvegarde[NB_MAX_UNDO];
int m_itabTypeUndo[NB_MAX_UNDO + 1];
//--- tracer
public:
BOOL m_bDegrade;
double m_dIntervalleDegrade;
//--- pour l'initialisation des cls nominales
public:
int m_iCleValeurInitiale;
int m_iCleIncrement;
int m_iCleNbChiffres;
CString m_strClePrefixe;
CString m_strCleSuffixe;
private:
BOOL Sauver();
public:
CMygaleDocument();
~CMygaleDocument();
//--- procdures de gestion des fichiers
void Init();
BOOL Nouveau(const char* chNom,int iEchelle,const char* chOperateur,int iType,int
iSaisie,int iNbcharCle);
BOOL Ouvrir(const char* chNomFichier);
BOOL Ajouter(const char* chNomFichier);
BOOL ImporterShapefile(const char* chNomFichier,int iNoattCle,const char* strPrefixe,BOOL
bCleToujoursNominal,CProjection* pProjection,int iHemisphere,BOOL bTypeShape,int iTypeMygale);
BOOL ImporterMygale(const char* chNomFichier,CProjection* pProjection);
BOOL ImporterPoint(const char* chNomFichier,CDecodage* pDecodage,const char* chPrefixe,
const char* chNom,const char* chOperateur,int iEchelle,int iCleMygale,int iNbcharCle);
BOOL ImporterDxf(const char* chNomFichier,CProjection* pProjection,int iHemisphere,
int iTousLesLayers,bool* btabLayer,
const char* chNom,const char* chOperateur,int iEchelle,int iTypeObjet,int
iTypeSaisie,int iNbcharCle);
BOOL ImporterLignes(const char* chNomFichier,CProjection* pProjection,int iHemisphere,
const char* chPrefixe,const char* chNom,const char* chOperateur,int iEchelle,int
iTypeSaisie,int iNbcharCle);
BOOL Enregistrer();
BOOL EnregistrerCar();
BOOL EnregistrerSous();
BOOL ExporterEnShapefile(const char* chNomFichier,int iTypeShapefile,int
iTypeCoordonnees);
BOOL Fermer();

Structures et mthodes : implmentation 495

void SupprimerToutesLesZones();
int SupprimerLesZonesSansArcs();
int SupprimerLesArcsLibres();
int SupprimerLesArcsEnDouble();
int NettoyerTousLesArcs();
void Precision(int iPrecision);
//--- changement de datum par Molodensky
void Molodensky(CMolodensky* pMolodensky);
BOOL IsTypeZone() {if(m_iTypeObjet == TYPE_ZONE_MYGALE)return TRUE; else return FALSE;};
BOOL IsTypeLigne() {if(m_iTypeObjet == TYPE_LIGNE_MYGALE)return TRUE; else return
FALSE;};
BOOL IsTypePoint() {if(m_iTypeObjet == TYPE_POINT_MYGALE)return TRUE; else return
FALSE;};
int GetTypeObjet() {return m_iTypeObjet;};
int GetTypeSaisie() {return m_iTypeSaisie;};
void GetNomFichier(char* chNom) {strcpy(chNom,m_chNomFichier);};
void GetNomDocument(char* chNom) {strcpy(chNom,m_chNomDocument);};
void SetNomDocument(const char* chNom) {strcpy(m_chNomDocument,chNom);};
void GetOperateur(char* chNom) {strcpy(chNom,m_chOperateur);};
void SetOperateur(const char* chNom) {strcpy(m_chOperateur,chNom);};
void GetDatum(char* chNom) {strcpy(chNom,m_chDatum);};
void SetDatum(const char* chNom) {strcpy(m_chDatum,chNom);m_bASauver=TRUE;};
int GetEchelle() {return m_iEchelle;};
void SetEchelle(int iEchelle) {m_iEchelle=iEchelle;};
void GetDate(char* chNom) {strcpy(chNom,m_chDate);};
void GetCreation(char* chNom) {strcpy(chNom,m_chCreation);};
BOOL IsOuvert() {return m_bOuvert;};
BOOL IsASauver() {return m_bASauver;};
void ASauver() {m_bASauver=TRUE;m_bARasteriser=TRUE;};
void ARasteriser() {m_bARasteriser=TRUE;};
BOOL FenetreSav(double &dFx1,double &dFy1,double &dFx2,double &dFy2);
//--- procdures sur les objets
void GetValue(int iNoObjet,char* chCle,double &dValeur);
void GetValuePourDBIII(int iNoObjet,char *chCle,double &dValeur);
CArc* GetPtrArc(int iNoArc) {if(iNoArc >= 0 && iNoArc < m_iNbArc)return
m_ptabArc[iNoArc]; else return NULL;};
int GetNoZone(int iObjet) {if(iObjet >= 0 && iObjet < m_iNbObjet)return
m_itabNoZone[iObjet]; else return -1;};
int GetNbObjet() {return m_iNbObjet;};
int GetNbArc() {return m_iNbArc;};
int GetNbPoints();
void Translation(double dXProj,double dYProj);
//--- procdures de slection
int SelectionnerUnObjet(double dX,double dY,double& dDistance);
int SelectionnerUnArc(double dX,double dY,double& dDistance);
int GetObjetSelection() {return m_iObjetSelection;};
int GetObjetSelection(int i) {if(i >= 0 && i < m_iNbObjetSelection)return
m_itabObjetSelection[i]; else return -1;};
int GetNbObjetSelection() {return m_iNbObjetSelection;};
void SetObjetSelection(int iNo,int iModeSelection);
void InitObjetSelection() {m_iObjetSelection=-1;m_iNbObjetSelection=0;};
int GetArcSelection() {return m_iArcSelection;};
int GetArcSelection(int i) {if(i >= 0 && i < m_iNbArcSelection)return
m_itabArcSelection[i]; else return -1;};
int GetNbArcSelection() {return m_iNbArcSelection;};
void SetArcSelection(int iNo,int iModeSelection);
void InitArcSelection();
BOOL IsSelectionFermee();
BOOL IsSelectionFermee(CDC* pDC);
void SetArcSelectionZone(int iNoObjet,int iMode);
void SelectionnerTousLesArcs();
void SelectionnerTousLesObjets();
void SelectionSurLaValeur(const char* chCle,double dValeurSelection);
//--- procdures sur le undo
void InitUndo() {m_itabTypeUndo[0]=UNDO_RIEN;m_ptabArcModifie[0]=NULL;}
void RestaurerUnArc(int i);
int AjouterUnObjet(double dXGeo,double dYGeo,const char* chCle,double dValeur);
void ModifierUnObjet(int iNoObjet,const char* chCle,double dValeur);

496

Annexe
void SupprimerUnObjet(int iNoObjet,BOOL bSupprimerLesArcs);
void
void
void
void
void

GetPosVue(int iNoObjet,int &iXVue,int &iYVue);


SetPosVue(int iNoObjet,int iXVue,int iYVue);
GetCentreZoneVue(int iNoZone,int &iXVue,int &iYVue);
GetPosGeo(int iNoObjet,double &dXGeo,double &dYGeo);
SetPosGeo(int iNoObjet,double dXGeo,double dYGeo);

//--- pour le type ligne ou zone, fonctions sur les arcs


int AjouterUnArc(int iNz1,int iNz2);
void SupprimerUnArc(int iNoArc);
BOOL FermerUnArc(int iNoArc);
BOOL JoindreDeuxArcs(int iNoArcReference,int iNoArcAModifier);
BOOL ReunirDeuxArcs(int iNoArc1,int iNoArc2);
BOOL FusionnerDeuxArcs(int iNoArcReference,int iNoArcAModifier);
int DiviserUnArc(int iNoArc,double dXGeo,double dYGeo);
int CouperUnArc(int iNoArc,double dXGeo,double dYGeo,int iNoPoint);
int CouperUnArc(int iNoArc,int iNoPoint);
BOOL UnirUnArc(int iNoArc);
void DeplacerLaSelection(int iTranslationX,int iTranslationY);
void DupliquerLaSelection(int iTranslationX,int iTranslationY);
void ExclureTousLesArcs();
void FiltrerTousLesArcs(double dSurfaceMinimum);
int JoindreTousLesArcsValeur(double dDistanceEnMetre,int iNbIterations);
int JoindreTousLesArcs(double dDistanceEnMetre,int iNbIterations);
int ReunirTousLesArcs();
int DiviserEtJoindreParIntersection();
int DiviserEtJoindreParExtremite(double dDistanceEnMetre);
void CalculFenetreDesArcs();
void ModifierParIntersection(BOOL bValeurInitiale,double dValeurMinimum,double
dIntervalle,double dLong1,double dColat1,double dLong2,double dColat2);
void BougerLesNoeuds(double dXGeoOld,double dYGeoOld,double dXGeo,double dYGeo);
//--- procdures de test
void TestValeur(double dIntervalleMaximum,double dIntervalleMinimum);
void TestLigneValeur(CDC* pDC,int iNoArc,double dIntervalleMaximum,double
dIntervalleMinimum);
void TestSimplicite();
void TestExtraSimplicite();
void Rasteriser(const char* chNomFichierImage);
BOOL IsZoneFermee(int iNoZone);

};

//--- procdures de trac des documents


void Tracer(CDC* pDC);
void TracerUnObjet(CDC* pDC,int iNoObjet,COLORREF Couleur);
void TracerUnArc(CDC* pDC,int iNoArc);
void TracerUnArc(CDC* pDC,int iNoArc,COLORREF Couleur);
void TracerLaSelection(CDC* pDC,int iTranslationX,int iTranslationY);
void TracerFermeture(CDC* pDC);

De nombreuses mthodes de cette classe sont lies la vrification de


contraintes dintgrit spatiale ou au netoyage de documents imports partir
dautres systmes. Par exemple, la mthode SupprimerLesArcsEnDouble()
permet dliminer les arcs qui apparaissent deux fois dans le document, comme cest
la cas de tous les arcs directement imports dun document au format ShapeFile.
int CSaveditDocument::SupprimerLesArcsEnDouble()
{
if(IsOuvert() == FALSE)return -1;
if(IsTypeZone() == FALSE)return -1;
int iNbArcSupprimes=0;
CArcMygale *pArc1,*pArc2;
bool bOui;
int iNoZone1,iNoZone2,iNoZone3,iNoZone4;
int iArc1,iArc2,iNbpt1,iNbpt2,iPointDebut1,iPointDebut2,iPointFin1,iPointFin2,iNbCommuns;
int i,j,iSens;
double dX,dY,dX1,dY1,dX2,dY2;
double dXMinArc1,dYMinArc1,dXMaxArc1,dYMaxArc1;
double dXMinArc2,dYMinArc2,dXMaxArc2,dYMaxArc2;
CPointMygale point;
iArc1=0;

Structures et mthodes : implmentation 497


while(iArc1 < m_iNbArc)
{
pArc1=m_ptabArc[iArc1];
if(pArc1 != NULL)
{
iNoZone1=pArc1->GetNoZone1();
iNoZone2=pArc1->GetNoZone2();
if(iNoZone1 < 20 || iNoZone2 < 20)
{
//--- l'arc 1 est candidat
pArc1->GetFenetreSav(dXMinArc1,dYMinArc1,dXMaxArc1,dYMaxArc1);
iArc2=iArc1+1;
while(iArc2 < m_iNbArc)
{
pArc2=m_ptabArc[iArc2];
if(pArc2 != NULL)
{
iNoZone3=pArc2->GetNoZone1();
iNoZone4=pArc2->GetNoZone2();
if(iNoZone3 < 20 || iNoZone4 < 20)
{
//--- intersection des fentres ?
pArc2->GetFenetreSav(dXMinArc2,dYMinArc2,dXMaxArc2,dYMaxArc2);
if(dXMaxArc2 >= dXMinArc1 && dXMinArc2 <= dXMaxArc1 && dYMaxArc2 >= dYMinArc1
&& dYMinArc2 <= dYMaxArc1)
{
//--- recherche d'une squence commune entre arc 1 et arc 2
iNbpt1=pArc1->GetNbpt();
iNbpt2=pArc2->GetNbpt();
iPointDebut1=0;
while(iPointDebut1 < iNbpt1)
{
pArc1->GetPoint(iPointDebut1,dX1,dY1);
iPointDebut2=0;
while(iPointDebut2 < iNbpt2)
{
pArc2->GetPoint(iPointDebut2,dX2,dY2);
if(dX1 == dX2 && dY1 == dY2)
{
//--- un point identique, on cherche les suivants dans un sens
iNbCommuns=1;
iPointFin1=iPointDebut1;
iPointFin2=iPointDebut2;
bOui=TRUE;
while(iPointFin1 < iNbpt1-1 && iPointFin2 < iNbpt2-1 && bOui)
{
pArc1->GetPoint(iPointFin1+1,dX1,dY1);
pArc2->GetPoint(iPointFin2+1,dX2,dY2);
if(dX1 == dX2 && dY1 == dY2)
{
iNbCommuns++;
iPointFin1++;
iPointFin2++;
}
else bOui=FALSE;
}
if(iNbCommuns == 1)
{
//--- on essaye dans l'autre sens
iPointFin1=iPointDebut1;
iPointFin2=iPointDebut2;
bOui=TRUE;
while(iPointFin1 < iNbpt1-1 && iPointFin2 > 0 && bOui)
{
pArc1->GetPoint(iPointFin1+1,dX1,dY1);
pArc2->GetPoint(iPointFin2-1,dX2,dY2);
if(dX1 == dX2 && dY1 == dY2)
{
iNbCommuns++;
iPointFin1++;
iPointFin2--;
}
else bOui=FALSE;
}
}
if(iNbCommuns > 1)
{
//--- des points en commun, arc 1 dcouper
iSens=pArc1->GetSens();
if(iPointFin1 < iNbpt1-1)

498

Annexe
{
//--- bout final
if(m_iNbArc >= NB_MAX_ARC)return iNbArcSupprimes;
m_ptabArc[m_iNbArc]=new CArcMygale(iNbpt1-iPointFin1+1);
if(m_ptabArc[m_iNbArc] == NULL)return iNbArcSupprimes;
j=0;
for(i=iPointFin1;i < iNbpt1;i++)
{
pArc1->GetPoint(i,dX,dY);
point.Set(dX,dY);
m_ptabArc[m_iNbArc]->SetPointGrow(j,point);
j++;
}
m_ptabArc[m_iNbArc]->SetSens(iSens);
m_ptabArc[m_iNbArc]->SetNbpt(j);
m_ptabArc[m_iNbArc]->SetNoZone1(iNoZone1);
m_ptabArc[m_iNbArc]->SetNoZone2(iNoZone2);
m_ptabArc[m_iNbArc]->CalculFenetreSav();
m_iNbArc++;
}
if(iPointDebut1 > 0)
{
//--- bout initial
if(m_iNbArc >= NB_MAX_ARC)return iNbArcSupprimes;
m_ptabArc[m_iNbArc]=new CArcMygale(iPointDebut1+1);
if(m_ptabArc[m_iNbArc] == NULL)return iNbArcSupprimes;
j=0;
for(i=0;i <= iPointDebut1;i++)
{
pArc1->GetPoint(i,dX,dY);
point.Set(dX,dY);
m_ptabArc[m_iNbArc]->SetPointGrow(j,point);
j++;
}
m_ptabArc[m_iNbArc]->SetSens(iSens);
m_ptabArc[m_iNbArc]->SetNbpt(j);
m_ptabArc[m_iNbArc]->SetNoZone1(iNoZone1);
m_ptabArc[m_iNbArc]->SetNoZone2(iNoZone2);
m_ptabArc[m_iNbArc]->CalculFenetreSav();
m_iNbArc++;
}
if(iNoZone1 == iNoZone3 && iNoZone1 >= 20)
{
//--- suppression de l'arc qui reste, car mme zone adjacente
SupprimerUnArc(iArc1);
iNbArcSupprimes++;
}
else
{
//--- arranger l'arc iArc1 avec les points communs
j=0;
for(i=iPointDebut1;i <= iPointFin1;i++)
{
pArc1->GetPoint(i,dX,dY);
pArc1->SetPoint(j,dX,dY);
j++;
}
pArc1->SetNbpt(j);
if(iNoZone1 < 20)
{
if(iNoZone3 >= 20)
{
pArc1->SetNoZone1(iNoZone3);
pArc1->SetNoZone2(2);
}
else
{
pArc1->SetNoZone1(0);
pArc1->SetNoZone2(0);
}
}
else
{
if(iNoZone1 < iNoZone3)
{
pArc1->SetNoZone1(iNoZone1);
pArc1->SetNoZone2(iNoZone3);
}

Structures et mthodes : implmentation 499


else

{
if(iNoZone3 >= 20)
{
pArc1->SetNoZone1(iNoZone3);
pArc1->SetNoZone2(iNoZone1);
}
else
{
pArc1->SetNoZone1(iNoZone1);
pArc1->SetNoZone2(2);
}
}

}
}
//--- arc 2
Ordonner(iPointDebut2,iPointFin2);
iSens=pArc2->GetSens();
if(iPointFin2 < iNbpt2-1)
{
//--- bout final
if(m_iNbArc >= NB_MAX_ARC)return iNbArcSupprimes;
m_ptabArc[m_iNbArc]=new CArcMygale(iNbpt2-iPointFin2+1);
if(m_ptabArc[m_iNbArc] == NULL)return iNbArcSupprimes;
j=0;
for(i=iPointFin2;i < iNbpt2;i++)
{
pArc2->GetPoint(i,dX,dY);
point.Set(dX,dY);
m_ptabArc[m_iNbArc]->SetPointGrow(j,point);
j++;
}
m_ptabArc[m_iNbArc]->SetSens(iSens);
m_ptabArc[m_iNbArc]->SetNbpt(j);
m_ptabArc[m_iNbArc]->SetNoZone1(iNoZone3);
m_ptabArc[m_iNbArc]->SetNoZone2(iNoZone4);
m_ptabArc[m_iNbArc]->CalculFenetreSav();
m_iNbArc++;
}
if(iPointDebut2 > 0)
{
//--- bout initial
if(m_iNbArc >= NB_MAX_ARC)return iNbArcSupprimes;
m_ptabArc[m_iNbArc]=new CArcMygale(iPointDebut2+1);
if(m_ptabArc[m_iNbArc] == NULL)return iNbArcSupprimes;
j=0;
for(i=0;i <= iPointDebut2;i++)
{
pArc2->GetPoint(i,dX,dY);
point.Set(dX,dY);
m_ptabArc[m_iNbArc]->SetPointGrow(j,point);
j++;
}
m_ptabArc[m_iNbArc]->SetSens(iSens);
m_ptabArc[m_iNbArc]->SetNbpt(j);
m_ptabArc[m_iNbArc]->SetNoZone1(iNoZone3);
m_ptabArc[m_iNbArc]->SetNoZone2(iNoZone4);
m_ptabArc[m_iNbArc]->CalculFenetreSav();
m_iNbArc++;
}
SupprimerUnArc(iArc2);
iNbArcSupprimes++;
pArc1=NULL;
pArc2=NULL;
//--- on recommence
InitUndo();
ASauver();

}
}
}
iArc2++;

goto SUITE;
}
}
iPointDebut2++;
}
iPointDebut1++;
}

500

Annexe

}
}
}
iArc1++;
SUITE: i=0;
}
return iNbArcSupprimes;
}

La mthode IsZoneFermee() teste la fermeture dune zone, en calculant


loccurrence des extremits des arcs de la zone :
BOOL CSaveditDocument::IsZoneFermee(int iNoZone)
{
int i,j,iNoZone1,iNoZone2,iNbpt,iNbBout,itabNb[NB_MAX_SELECTION];
BOOL bTrouve;
double dXGeo,dYGeo,dtabX[NB_MAX_SELECTION],dtabY[NB_MAX_SELECTION];
if(iNoZone < 20 || iNoZone > m_iNoZoneLibre)return FALSE;
iNbBout=0;
for(i=0;i < m_iNbArc;i++)
{
iNoZone1=m_ptabArc[i]->GetNoZone1();
iNoZone2=m_ptabArc[i]->GetNoZone2();
if(iNoZone1 == iNoZone || iNoZone2 == iNoZone)
{
iNbpt=m_ptabArc[i]->GetNbpt();
m_ptabArc[i]->GetPoint(0,dXGeo,dYGeo);
bTrouve=FALSE;
for(j=0;j < iNbBout;j++)
{
if(dtabX[j] == dXGeo && dtabY[j] == dYGeo)
{
itabNb[j]=1-itabNb[j];
bTrouve=TRUE;
break;
}
}
if(bTrouve == FALSE)
{
dtabX[iNbBout]=dXGeo;
dtabY[iNbBout]=dYGeo;
itabNb[iNbBout]=1;
iNbBout++;
}
m_ptabArc[i]->GetPoint(iNbpt-1,dXGeo,dYGeo);
bTrouve=FALSE;
for(j=0;j < iNbBout;j++)
{
if(dtabX[j] == dXGeo && dtabY[j] == dYGeo)
{
itabNb[j]=1-itabNb[j];
bTrouve=TRUE;
break;
}
}
if(bTrouve == FALSE)
{
dtabX[iNbBout]=dXGeo;
dtabY[iNbBout]=dYGeo;
itabNb[iNbBout]=1;
iNbBout++;
}
}
}
for(j=0;j < iNbBout;j++)
{
if(itabNb[j] != 0)return FALSE;
}
return TRUE;
}

Structures et mthodes : implmentation 501


La mthode TestValeur() permet de mettre en vidence les erreurs de valeur
numrique pour des courbes de niveaux (document de type Ligne, saisie par valeur
numrique). On calcule pour cela les intersections de toutes les lignes saisies avec
des lignes horizontales (y=constante), en testant ensuite les diffrences de valeur
entre deux points dintersection conscutifs.
void CSaveditDocument::TestValeur(double dIntervalleMaximum,double dIntervalleMinimum)
{
if(IsOuvert() == FALSE)return;
if(m_iTypeObjet != TYPE_LIGNE_MYGALE)return;
if(m_iTypeSaisie != SAISIE_VALEUR && m_iTypeSaisie != SAISIE_CLEVALEUR)return;
if(m_iNbObjet == 0)return;
int i,j,iNbpt,iNoObjet1,iNoObjet2;
double dValeur1,dValeur2,dDifference;
double dFx1,dFy1,dFx2,dFy2;
double dXMin,dYMin,dXMax,dYMax;
double dX0,dY0,dX1,dY1,dXGeo,dYGeo;
double dX,dY,dXa,dYa,dXb,dYb,dIntervalleLigne;
for(i=0;i < NB_MAX_OBJET;i++)m_itabNoZone[i]=0;
//-- calcul de la fentre du document, en coordonnes savane
int iNbLignesRaster=500 ;
FenetreSav(dFx1,dFy1,dFx2,dFy2);
dIntervalleLigne=(dFy2-dFy1)/iNbLignesRaster;
double dMarge=(dFy2-dFy1)/20.;
dY=dFy1 + dMarge;
while(dY <= dFy2 - dMarge)
{
//--- Pour chaque ligne raster, calcul des intersections
CChaine chaine;
for(i=0;i < NB_MAX_ARC;i++)
{
//--- intersections de l'arc avec la ligne
if(m_ptabArc[i] != NULL)
{
m_ptabArc[i]->GetFenetreSav(dXMin,dYMin,dXMax,dYMax);
if(dY >= dYMin && dY <= dYMax)
{
iNbpt=m_ptabArc[i]->GetNbpt();
m_ptabArc[i]->GetPoint(0,dXGeo,dYGeo);
wind.GeoToSav(dXGeo,dYGeo,dX0,dY0);
for(j=1;j < iNbpt;j++)
{
m_ptabArc[i]->GetPoint(j,dXGeo,dYGeo);
wind.GeoToSav(dXGeo,dYGeo,dX1,dY1);
//--- ordre sur Y
if(dY1 > dY0)
{
dXa=dX0;
dYa=dY0;
dXb=dX1;
dYb=dY1;
}
else
{
dXa=dX1;
dYa=dY1;
dXb=dX0;
dYb=dY0;
}
//--- intersection
if(dY >= dYa && dY <= dYb)
{
if(dYa == dYb)dX=dXa;
else dX=((dXb-dXa)*(dY-dYa)/(dYb-dYa)) + dXa;
chaine.InsererCellule(dX,i);
}
dX0=dX1;
dY0=dY1;
}

502

Annexe
}
}
}
//--- test des diffrences
CCellule* pCellule=chaine.m_ptrDebut;
while(pCellule != NULL)
{
iNoObjet1=pCellule->m_iNoObjet;
dValeur1=m_dtabValeur[iNoObjet1];
pCellule=pCellule->m_ptrSuivant;
if(pCellule != NULL)
{
iNoObjet2=pCellule->m_iNoObjet;
dValeur2=m_dtabValeur[iNoObjet2];
//--- tests
if(dIntervalleMaximum > 0.)
{
dDifference=fabs(dValeur2-dValeur1);
if(dDifference > dIntervalleMaximum)
{
m_itabNoZone[iNoObjet1]=1;
m_itabNoZone[iNoObjet2]=1;
}
}
if(dIntervalleMinimum > 0.)
{
dDifference=fabs(dValeur2-dValeur1);
if(dDifference < dIntervalleMinimum)
{
m_itabNoZone[iNoObjet1]=1;
m_itabNoZone[iNoObjet2]=1;
}
}
}
}

dY+=dIntervalleLigne;
}

Nous prsentons enfin des extraits des mthodes de lecture des documents
SAVEDIT pour chaque type de document (point, ligne, zone), ce qui nous permet
de montrer le format de stockage de ces documents.
Format des documents de type point :
m_iNbObjet=0;
while(fread(buffer,iTailleBuffer,1,FileObjets) == 1)
{
memcpy(&dLong,&buffer[0],8);
memcpy(&dColat,&buffer[8],8);
m_dtabPoint[iIndice]=dLong;
iIndice++;
m_dtabPoint[iIndice]=dColat;
iIndice++;
switch(m_iTypeSaisie)
{
case SAISIE_VALEUR:
memcpy(&m_dtabValeur[m_iNbObjet],&buffer[16],8);
break;
case SAISIE_CLE:
memcpy(&m_ctabCle[m_iNbObjet*m_iNbcharCle],&buffer[16],m_iNbcharCle);
break;
case SAISIE_CLEVALEUR:
memcpy(&m_dtabValeur[m_iNbObjet],&buffer[16],8);
memcpy(&m_ctabCle[m_iNbObjet*m_iNbcharCle],&buffer[24],m_iNbcharCle);
break;
default:
break;
}
m_iNbObjet++;

Structures et mthodes : implmentation 503


}

Pour les lignes, la procdure de lecture est la suivante :


CPointMygale point;
strcpy(chNomFichierObjets,m_chNomFichier);
strcat(chNomFichierObjets,".lg");
FILE* FileObjets=fopen(chNomFichierObjets,"rb");
if(FileObjets == NULL)
{
::ErreurDeFichier(chNomFichierObjets);
if(m_ctabCle != NULL)free(m_ctabCle);
if(m_dtabValeur != NULL)free(m_dtabValeur);
m_ctabCle=NULL;
m_dtabValeur=NULL;
return FALSE;
}
int iTailleBuffer=8; //--- pour nbpt et sens
if(m_iTypeSaisie == SAISIE_VALEUR || m_iTypeSaisie == SAISIE_CLEVALEUR)iTailleBuffer+=8;
if(m_iTypeSaisie == SAISIE_CLE || m_iTypeSaisie ==
SAISIE_CLEVALEUR)iTailleBuffer+=m_iNbcharCle;
int iIndice=0;
int i,iNbpt,iSens;while(fread(buffer,iTailleBuffer,1,FileObjets) == 1)
{
memcpy(&iNbpt,&buffer[0],4);
memcpy(&iSens,&buffer[4],4);
switch(m_iTypeSaisie)
{
case SAISIE_VALEUR:
memcpy(&m_dtabValeur[m_iNbObjet],&buffer[8],8);
break;
case SAISIE_CLE:
memcpy(&m_ctabCle[m_iNbObjet*m_iNbcharCle],&buffer[8],m_iNbcharCle);
break;
case SAISIE_CLEVALEUR:
memcpy(&m_dtabValeur[m_iNbObjet],&buffer[8],8);
memcpy(&m_ctabCle[m_iNbObjet*m_iNbcharCle],&buffer[16],m_iNbcharCle);
break;
default:
break;
}
//--- lecture de l'arc
m_ptabArc[m_iNbArc]=new CArcMygale(iNbpt);
if(m_ptabArc[m_iNbArc] == NULL)
{
::ErreurDeMemoire();
fclose(FileObjets);
if(m_ctabCle != NULL)free(m_ctabCle);
if(m_dtabValeur != NULL)free(m_dtabValeur);
m_ctabCle=NULL;
m_dtabValeur=NULL;
for(i=0;i < NB_MAX_ARC;i++)
{
if(m_ptabArc[i] != NULL)delete m_ptabArc[i];
m_ptabArc[i]=NULL;
}
return FALSE;
}
for(i=0;i < iNbpt;i++)
{
if(fread(buffer,16,1,FileObjets) != 1)
{
::ErreurDeFichier(chNomFichierObjets);
fclose(FileObjets);
if(m_ctabCle != NULL)free(m_ctabCle);
if(m_dtabValeur != NULL)free(m_dtabValeur);
m_ctabCle=NULL;
m_dtabValeur=NULL;
for(int i=0;i < NB_MAX_ARC;i++)
{

504

Annexe

if(m_ptabArc[i] != NULL)delete m_ptabArc[i];


m_ptabArc[i]=NULL;
}
return FALSE;
}
memcpy(&point.m_dX,&buffer[0],8);
memcpy(&point.m_dY,&buffer[8],8);
m_ptabArc[m_iNbArc]->SetPointGrow(i,point);
}
m_ptabArc[m_iNbArc]->SetNbpt(iNbpt);
m_ptabArc[m_iNbArc]->SetSens(iSens);
//--- calcul de la fentre de l'arc
m_ptabArc[m_iNbArc]->CalculFenetreSav();
m_iNbArc++;
m_iNbObjet++;
}
fclose(FileObjets);

Enfin, pour les zones, la procdure de lecture est la suivante :


FILE* FileObjets=fopen(chNomFichierObjets,"rb");
if(FileObjets == NULL)
{
::ErreurDeFichier(chNomFichierObjets);
free(m_dtabPoint);
if(m_ctabCle != NULL)free(m_ctabCle);
if(m_dtabValeur != NULL)free(m_dtabValeur);
m_dtabPoint=NULL;
m_ctabCle=NULL;
m_dtabValeur=NULL;
return FALSE;
}
int iTailleBuffer=20;
if(m_iTypeSaisie == SAISIE_VALEUR || m_iTypeSaisie == SAISIE_CLEVALEUR)iTailleBuffer+=8;
if(m_iTypeSaisie == SAISIE_CLE || m_iTypeSaisie ==
SAISIE_CLEVALEUR)iTailleBuffer+=m_iNbcharCle;
int iNoZone,iIndice;
double dLong,dColat;
iIndice=0;
while(fread(buffer,iTailleBuffer,1,FileObjets) == 1)
{
memcpy(&iNoZone,&buffer[0],4);
memcpy(&dLong,&buffer[4],8);
memcpy(&dColat,&buffer[12],8);
m_itabNoZone[m_iNbObjet]=iNoZone;
if(iNoZone >= m_iNoZoneLibre)m_iNoZoneLibre=iNoZone+1;
m_dtabPoint[iIndice]=dLong;
iIndice++;
m_dtabPoint[iIndice]=dColat;
iIndice++;
switch(m_iTypeSaisie)
{
case SAISIE_VALEUR:
memcpy(&m_dtabValeur[m_iNbObjet],&buffer[20],8);
break;
case SAISIE_CLE:
memcpy(&m_ctabCle[m_iNbObjet*m_iNbcharCle],&buffer[20],m_iNbcharCle);
break;
case SAISIE_CLEVALEUR:
memcpy(&m_dtabValeur[m_iNbObjet],&buffer[20],8);
memcpy(&m_ctabCle[m_iNbObjet*m_iNbcharCle],&buffer[28],m_iNbcharCle);
break;
default:
break;
}
m_iNbObjet++;
}
fclose(FileObjets);

Structures et mthodes : implmentation 505

//--- lecture des arcs


FILE* FileArcs=fopen(chNomFichierArcs,"rb");
if(FileArcs == NULL)
{
::ErreurDeFichier(chNomFichierArcs);
free(m_dtabPoint);
if(m_ctabCle != NULL)free(m_ctabCle);
if(m_dtabValeur != NULL)free(m_dtabValeur);
m_dtabPoint=NULL;
m_ctabCle=NULL;
m_dtabValeur=NULL;
return FALSE;
}
iTailleBuffer=16; //--- pour nbpt,sens,iNz1,iNz2
int i,iNbpt,iSens,iNz1,iNz2;
CPointMygale point;
while(fread(buffer,iTailleBuffer,1,FileArcs) == 1)
{
memcpy(&iNbpt,&buffer[0],4);
memcpy(&iSens,&buffer[4],4);
memcpy(&iNz1,&buffer[8],4);
memcpy(&iNz2,&buffer[12],4);
//--- lecture de l'arc
m_ptabArc[m_iNbArc]=new CArcMygale(iNbpt);
if(m_ptabArc[m_iNbArc] == NULL)
{
::ErreurDeMemoire();
fclose(FileArcs);
free(m_dtabPoint);
if(m_ctabCle != NULL)free(m_ctabCle);
if(m_dtabValeur != NULL)free(m_dtabValeur);
m_dtabPoint=NULL;
m_ctabCle=NULL;
m_dtabValeur=NULL;
for(i=0;i < NB_MAX_ARC;i++)
{
if(m_ptabArc[i] != NULL)delete m_ptabArc[i];
m_ptabArc[i]=NULL;
}
return FALSE;
}
for(i=0;i < iNbpt;i++)
{
if(fread(buffer,16,1,FileArcs) != 1)
{
::ErreurDeFichier(chNomFichierArcs);
fclose(FileArcs);
free(m_dtabPoint);
if(m_ctabCle != NULL)free(m_ctabCle);
if(m_dtabValeur != NULL)free(m_dtabValeur);
m_dtabPoint=NULL;
m_ctabCle=NULL;
m_dtabValeur=NULL;
for(int i=0;i < NB_MAX_ARC;i++)
{
if(m_ptabArc[i] != NULL)delete m_ptabArc[i];
m_ptabArc[i]=NULL;
}
return FALSE;
}
memcpy(&point.m_dX,&buffer[0],8);
memcpy(&point.m_dY,&buffer[8],8);
m_ptabArc[m_iNbArc]->SetPointGrow(i,point.m_dX,point.m_dY);
}
m_ptabArc[m_iNbArc]->SetNbpt(iNbpt);
m_ptabArc[m_iNbArc]->SetSens(iSens);
m_ptabArc[m_iNbArc]->SetNoZone1(iNz1);
m_ptabArc[m_iNbArc]->SetNoZone2(iNz2);
//--- calcul de la fentre de l'arc
m_ptabArc[m_iNbArc]->CalculFenetreSav();
m_iNbArc++;

506

Annexe

}
fclose(FileArcs);

RESUME
Cet ouvrage prsente un travail de recherche et de dveloppement informatique visant apporter une rponse
concrte la question suivante : comment construire un systme dinformation gographique complet et
oprationnel, en suivant les principes thoriques de la gestion de donnes et en les adaptant aux donnes
gographiques ? .
Le sujet principal de cet ouvrage est de montrer sur un exemple concret limplication des principes thoriques de la
gestion de donnes dans la ralisation pratique dun logiciel de type SIG. Elle prsente l'architecture et la ralisation
dun systme d'information gographique oprationnel le systme SAVANE - partir des nombreux concepts,
techniques et algorithmes ncessaires cette ralisation. Ce travail de recherche a t effectu dans le cadre de lIRD
(Institut de recherche pour le dveloppement).
Louvrage expose lensemble des principes ncessaires la ralisation et la bonne utilisation dun SIG, en dcrivant
chaque aspect ncessaire la construction du systme et en expliquant les choix effectus, selon la dmarche suivante
:
- exposer avec prcision tous les aspects concernant la dfinition et lutilisation de linformation gographique ;
- exposer et dvelopper les principes de la gestion de donnes (modle relationnel et objet) pour les tendre aux
donnes localises ;
- dvelopper ou mettre en uvre les algorithmes ncessaires limplantation de ces principes dans un systme
dinformation ;
- construire un systme oprationnel, mettant en uvre les principes thoriques et rpondant un cahier des charges
fonctionnel couvrant lensemble des besoins ncessaires lutilisation de ce systme dans le cadre de projets
appliqus, notamment en gographie et dans le cadre de la recherche pour le dveloppement..
L'expos des mthodes est souvent suivi de la prsentation d'algorithmes et de leur ralisation concrte. Des
rfrences renvoient frquemment le lecteur une annexe contenant limplantation effective des structures et des
algorithmes.

Vous aimerez peut-être aussi