Page : appli00a1.htm
Auteur : Jean HENRI
Création : 18 nov 2003
Mise à jour : 18 mars 2004

Projet SIG_2004
Système d'Information Géographique
Application(s) 0 : Étude des informations vectorielles

Application 0.1 : Algorithmes de conversion

Les données globales retenues sont :

FichierDept est un fichier texte
NumRegionEtudiee est un entier
XminDep, XmaxDep, YminDep, YmaxDep sont réels

LargeurImg, HauteurImg sont entiers
OrigineAbscisse, OrigineOrdonnee sont entiers
Echelle est un réel
InversionAbscisse, InversionOrdonnee sont booléens

procedure TrouverDepartement

procedure TrouverDepartement (E: NumRegion est un entier
                              S: NbZones est un entier)
donnée
   Ligne est une chaine de car
début
  Se placer sur la première ligne du fichier FichierDept
  répéter
    lire depuis FichierDept dans Ligne
    si (Ligne contient le mot REGION) alors
      NumRegion <- NumRegion - 1
    fin si
  jusqu’à (NumRegion = 0)
  Mettre à jour NbZones avec le nombre contenu à la fin de Ligne
fin

Cet algorithme ne tient pas compte des mauvaises valeurs que peut prendre NumRegion :

Pour ces deux cas, on doit fixer une valeur pour NbZones qui indiquera une erreur concernant le paramètre d’entrée (par exemple –1)

procedure TrouverDepartement (E: NumRegion est un entier
                              S: NbZones est un entier)
donnée
   Ligne est une chaine de car
début
  si (NumRegion < 1) alors
    NbZones <- -1
  sinon
    Se placer sur la première ligne du fichier FichierDept
    répéter
      lire depuis FichierDept dans Ligne
      si (Ligne contient le mot REGION) alors
        NumRegion <- NumRegion - 1
      fin si
    jusqu’à (NumRegion = 0) OU FinFichier (FichierDept)
    si (NumRegion = 0) alors
      Mettre à jour NbZones avec le nombre contenu à la fin de Ligne
    sinon
      NbZones <- -1
    fin si
  fin si
fin

procédure ExtraireCoordonnees

procédure ExtraireCoordonnees (E : Ligne est une chaine de car
                               S : ValeurX, ValeurY sont réels)
donnée
  ValeurCh est une chaine de car
  IndexCar, IndexCar2 sont des entiers
début
  ValeurCh <- VIDE
  IndexCar <- 1
  répéter
    ValeurCh <- ValeurCh + Ligne[IndexCar]
    IndexCar <- IndexCar + 1
  jusqu’à (Ligne[IndexCar] = " ")
  ValeurX <- ConversionChaineVersReel (ValeurCh)
  ValeurCh <- VIDE
  pour IndexCar2 <- (IndexCar + 1) à longueur (Ligne) faire
    ValeurCh <- ValeurCh + Ligne[IndexCar2]
  fin pour
  ValeurY <- ConversionChaineVersReel (ValeurCh)
fin

procédure TrouverCoordonneesExtremes

Pour cette procédure, compte tenu des paramètres d’entrée, il faut connaître le nombre de zones décrites dans le fichier MIF et il faut également pourvoir se placer dans le fichier MIF au début de la région à étudier : la donnée NumRegionEtudiee correspond à cette information

procédure TrouverCoordonneesExtremes (S : Xmin, Xmax, Ymin, Ymax sont réels)
données
  NbZones, NbSegments,
  IndexZone, IndexSegment sont entiers
  Ligne est une chaine de car
  ValeurX, ValeurY sont réels
début
  TrouverDepartement (NumRegionEtudiee, NbZones)
  pour IndexZone <- 1 à NbZones faire
    lire depuis FichierDept dans NbSegments
    pour IndexSegment <- 1 à NbSegments
      lire depuis FichierDept dans Ligne
      ExtraireCoordonnees (Ligne, ValeurX, ValeurY)
      si (IndexZone = 1) ET (IndexSegment = 1) alors
        Xmin <- ValeurX
        Xmax <- ValeurX
        Ymin <- ValeurY
        Ymax <- ValeurY
      sinon
        Xmin <- min (ValeurX, Xmin)
        Xmax <- max (ValeurX, Xmax)
        Ymin <- min (ValeurY, Ymin)
        Ymax <- max (ValeurY, Ymax)
      fin si
    fin pour
  fin pour
fin

fonction CalculerEchelle

fonction CalculerEchelle (E : Xmin, Xmax, Ymin, Ymax sont réels
                              Largeur, Hauteur sont entiers) retourne un réel
données : EchelleX, EchelleY sont réels
début
  EchelleX <- (Xmax – Xmin) / Largeur
  EchelleY <- (Ymax – Ymin) / Hauteur
  retourner max (EchelleX, EchelleY)
fin

procédure CalculerPositionPoint

Dans un premier temps, supposons que le repère de tracé est dans le même sens que le repère utilisé dans le fichier MIF

procédure CalculerPositionPoint (E : PositionX, PositionY sont réels
                                 S : Abscisse, Ordonnee sont entiers)
début
  Abscisse <- (PositionX – XminDep)/Echelle + OrigineAbscisse
  Ordonnee <- (PositionY – YminDep)/Echelle + OrigineOrdonnee
fin

Si l’axe des ordonnées (axe vertical) est inversé, il faut donc adapter le calcul de la coordonnée verticale pour que le tracé reste correct :
Ordonnee <- (HauteurImg - (PositionY – YminDep)/Echelle) + OrigineOrdonnee

Les données globales InversionAbscisse et InversionOrdonnee indiquent si l’un ou l’autre des axes est inversé :

procédure CalculerPositionPoint (E : PositionX, PositionY sont réels
                                 S : Abscisse, Ordonnee sont entiers)
début
  si InversionAbscisse alors
    Abscisse <- (LargeurImg - (PositionX – XminDep)/Echelle) + OrigineAbscisse
  sinon
    Abscisse <- (PositionX – XminDep)/Echelle + OrigineAbscisse
  fin si
  si InversionOrdonnee alors
    Ordonnee <- (HauteurImg - (PositionY – YminDep)/Echelle) + OrigineOrdonnee
  sinon
    Ordonnee <- (PositionY – YminDep)/Echelle + OrigineOrdonnee
  fin si
fin


fin de la page appli00a1.htm