Style de ligne décalé en MapInfo
Jacques Paris
Novembre 2002
mise à jour 26 novembre 2002
Une ligne en MapInfo
Édition d’un motif
Sens du décalage
Application à des « trajets »
Application à des régions
Exemple de sous-lignage de régions
Le « sens » des régions
« Motifs Dégradés »
Exemple de motif dégradé
Support pour la mise en œuvre
Une
ligne est représentée dans MapInfo en utilisant un style (pen) donné. Par
défaut, c’est un trait droit uni de 1 pixel de large qui passe exactement
par les coordonnées des nœuds de la ligne. Ce style peut être modifié en
changeant en particulier le « motif » (pattern) à utiliser.
Les
motifs sont définis dans le fichier MapInfoW.PEN qui peut en contenir 127.
Dans la version 6.5, 118 sont définis, ce qui laisse la possibilité d’en
rajouter 9 sans avoir à redéfinir des motifs existants. Ce fichier se trouve
dans des emplacements différents selon la version de MI et le OS de
l'installation.. Utilisez une recherche pour le localiser au
besoin.
Les
motifs peuvent occuper jusqu’à 35 pixels de large; la position centrale est
la ligne de base, c’est-à-dire la ligne qui respectera la géométrie de l’objet.
Si un motif est défini de sorte qu’il se trouvera affiché a-symétriquement
par rapport à la ligne de base, nous appellerons ce motif « décalé ».
Une ligne simple de 1 pixel peut donc être décalée au maximum de 17 pixels
d’un côté ou de l’autre de la ligne de base.
La
meilleure façon d’éditer un motif est d’utiliser le « MapInfo LIne
STyle EDitor ». Le fichier programme se nomme MILISTED.exe; son archive
d’installation LineEdit.exe est disponible gratuitement sur le site de
MapInfo.
Une
fois un motif (ou plusieurs) modifié et enregistré, le fichier MapInfoW.pen
est changé. Si vous voulez transporter des produits MI (cartes en fichiers,
documents WOR) qui utilisent ces styles nouveaux ou modifiés, il faut vous
assurer que la nouvelle installation aura aussi accès à cette version du fichier MapInfoW.pen
autrement les styles ne seront pas corrects.
Dans
MILISTED un motif est présenté horizontalement; le sens du dessin est de
gauche vers la droite. Le motif de toute ligne (polyligne ou bordure de
région) est affiché en respectant la direction de traçage de la ligne, c’est-à-dire
du premier nœud défini au dernier. La direction d’une ligne ou polyligne
peut être visualisée dans une carte fenêtre grâce à l’option
« Map | Contrôle de pile | <choisir la couche> | Affichage |
Montrer direction » mais la flèche n’est ajoutée que pour les lignes
et pour la première section d’une polyligne; aucune indication pour les
autres sections s’il y en a ni pour les bordures de polygones n'est donnée.
Donc,
dans MILISTED, ce qui se trouve au-dessus de la ligne de base sera affiché à
la gauche de la ligne de base, et inversement ce qui est en-dessous sera à sa
droite.
Ce
graphique montre l’effet du décalage progressif de 1 à 4 pixels. Les
flèches de direction augmentent de taille avec le décalage; MI prend en
compte la largeur totale du motif (il serait de 9 pixels pour le dernier
décalage) et fait l’ajustement de la pointe de flèche en proportion.
Influence
de l’épaisseur du trait
Un
autre élément du style est l’épaisseur du trait qui peut varier de 1 à 7
pixels. Il y a une interaction intéressante entre décalage et épaisseur
dans ce sens que la valeur actuelle du décalage est multipliée par l’épaisseur
du trait. Dans l’exemple qui suit, les 2 couleurs (= motifs) sont distants
de 2 pixels.
On
peut voir que la séparation entre les lignes due à des décalages non
successifs en nombre de pixels est maintenue en proportion quelle que soit l’épaisseur
des traits. Une telle séparation est utile pour maintenir une bonne
distinction entre les couleurs.
Il
ne faut pas utiliser un décalage de 1 pixel surtout si on veut laisser la
ligne de base bien visible. D’autre part, l’épaisseur de cette ligne est
importante car si elle doit rester visible, le premier motif dont la position
est indépendante du style de la ligne de base doit être suffisamment
décalé pour ne pas la recouvrir.
Si
on choisit par contre des motifs avec des décalages successifs, les couleurs
ont tendance à se mélanger. Peu intéressant dans le cas où la distinction
entre les couleurs est importante, mais une possibilité pour construire des
dégradés (voir plus bas)
Tous
ces effets sont valables si on utilise la même largeur de trait pour chaque
ligne. Un mélange de largeurs entraînerait des « distorsions »
possiblement très néfastes car chaque trait est affiché indépendamment des
autres.
Cet
exemple très simple (un petit réseau et 2 trajets) permet de montrer ce que
l’on pourrait obtenir et quelles sont certains problèmes.
Nous
posons deux conditions : 1 – les trajets doivent être du même côté
de la ligne de base pour rendre visible la « direction » des
trajets, et 2 – les traits doivent être aussi près que possible de la
ligne de base.
Il
a fallu s’assurer au paravant que le réseau était bien découpé aux endroits où les trajets
se joignent et que les tous tronçons étaient dans la bonne direction
Nous
pouvons remarquer des problèmes aux endroits soulignés d’un cercle
1
– continuité des trajets (cercle du centre)
À
tout branchement, un trajet donné peut avoir à « passer par
dessus » un autre , ce qui est le cas ici. Si les 2 trajets
avaient été inversés dans la portion à gauche de point, il y aurait quand
même eu un certain décalage du trait rouge, moins important certes mais
toujours visible. Si dans cet exemple on pourrait ainsi minimiser ce problème,
ce ne sera pas toujours possible dans la vraie vie.
Une
façon de minimiser ce problème serait de le cacher en plaçant sur les
branchements des symboles pouvant suggérer un transfert-correspondance entre
les trajets, par exemple.
2
– coins « internes »
Aux
sommets où la ligne de base fait un angle <180 degrés sur le côté des
lignes décalées, on peut remarquer un certain chevauchement des trajets;
plus l’angle est fermé, plus ce chevauchement devient important, voir le
cercle de gauche.
Il
ne semble pas qu’il y ait de solutions à ce problème pour le moment.
Nous
allons rencontrer dans l’application à des régions les même difficultés
en particulier dans les « coins internes » encore plus fréquents
puisque les lignes sont fermées sur elles-mêmes.
Parmi
les problèmes plus marquant avec des régions, nous trouvons d’abord la
forme des coins extérieurs qui n’est pas nette ni uniforme. Ensuite, il y a
un nouveau problème au nœud de début-fin d’un polygone : le tracé
ne se referme pas.
Cette
image exagère ces deux problèmes (décalage de 4 pixels, largeur de trait 2)
Si
on affiche le résultat sur un ensemble de régions, la carte nous donne une
nouvelle information. En exemple celle-ci
Cette
carte produite avec AllClock.mbx (voir en bas dans Mise en œuvre) permet de remarquer que toutes les
bordures limitrophes sont représentées par un double
trait alors que celles bordures avec l’extérieur n’en ont qu’un simple. La
région « sélectionnée » (formée de 3 polygones, région avec
un trou contenant une "île")) montre que sa topologie a été
parfaitement respectée.
Les
« problèmes » notés plus haut sont ici pratiquement
imperceptibles car les valeurs du décalage et d’épaisseur du trait sont
faibles.
Exemple de sous-lignage de régions
La
situation qui m’a lancé sur cette piste est la suivante : le
« pays » est composé de « municipalités »
regroupées en « régions »,. Il existe aussi des
« zones » opérationnelles. Initialement toutes les limites des régions et des zones devaient suivre les limites municipales,
mais ce n’est plus le cas (en particulier à cause de fusions municipales ou
d'annexoins partielles, non suivies de réajustements de frontières aux
niveaux supérieurs).
Le
problème est de montrer clairement les 3 types de frontières (région, zone,
municipalité) pour une carte basée sur une région.
La
solution présentée ici est d’utiliser des lignes décalées. Une région
utilise une ligne bleue décalée vers l’extérieur (voir la discussion plus
bas sur ce concept extérieur/intérieur appliqué des régions), les zones
une ligne rouge décalée vers l’intérieur. Quant aux municipalités, elles
sont affichées avec un trait standard..
Le
premier exemple est celui d’une région qui n’a pas d’ « extensions ».
Elle contient 3 zones dont les limites communes sont bien visibles sous la
forme d’une triple ligne (rouge, noire, rouge). Mais la ligne centrale manque (légèrement au
dessus du centre de la carte) car la municipalité 29073 est partagée entre
les zones 202910 et 202915.
Le
deuxième exemple montre plusieurs « extensions » de la région de
base. La municipalité 43023 n’est pas incluse en totalité, et seulement
une petite partie de 42005 est dans la région (le petit triangle entre 43023
et 43020).. La zone 102043 déborde à l’ouest ce qui attache à la carte la
municipalité 42025 parce que partiellement dans cette zone.
Les
cartes produites ainsi sont beaucoup plus riches visuellement. Elles peuvent
aussi contribuer à la mise à jour des données de base car les situations
comme celles rencontrées dans le deuxième exemple peuvent provenir d’erreur
de saisie des cartes de base, ou dénoncer des besoins de redéfinition locale
des entités impliquées.
Nous
avons vu que le sens d’une ligne est du premier au dernier nœud de la ligne;
gauche et droite sont relatifs à cette direction. Avec des régions, nous
sommes plus intéressés à spécifier le décalage comme étant vers l’extérieur
ou vers l’intérieur de la région pour prévoir l’effet qu'aura une bordure
décalée. Pour cela il faut connaître le « sens » de traçage
des régions.
Une
région est dite de sens horaire si le sens de traçage de sa bordure est tel
que l’intérieur de la région se trouve sur la droite par rapport à cette
direction. Donc avec une région ‘horaire’ une ligne décalée vers la
gauche sera à l’extérieur de la région, et une vers la droite sera à l’intérieur.
Cela
s’applique bien quand la région n’a qu’un seul polygone, mais quand
elle est faite de plusieurs polygones dont certains sont superposés (régions
avec trous) cette définition doit être prolongée. Pour comprendre ce qu’il
faut faire, utilisons la notion de pile.
Quand
plusieurs polygones d’une même région sont superposés, ils sont les uns
dans les autres (ils ne peuvent pas se couper ce qui serait contraire à la
topologie de la région). Si on les trie par ordre de taille croissante, on
peut assigner à chacun un ordre par le nombre de polygones dans lesquels il
est contenu. Le plus grand sera d’ordre 1 (il n’est contenu que dans
lui-même).
La
règle à appliquer est que les polygones d’ordre impair doivent être dans
le sens horaire alors que ceux d’ordre pair dans le sens opposé au sens
horaire.
La
raison provient du fait qu’il n’y a qu’un style de ligne pour tous les
polygones d’une même région; si le décalage de ligne est vers la gauche,
la limite sera tracée à l’extérieur des polygones ce qui est correct pour
l’ordre 1 mais pour l’ordre 2 l’extérieur de 2 est entre 1 et 2, donc
à l’intérieur de 1, d’ou le besoin de renverser le sens des polygones
pairs.
Utiliser
un ensemble de lignes décalées de plus en plus de la ligne de base avec des
couleurs allant du foncé au pale permet de créer des effets de dégradé
assez intéressants comme dans cette image
J’ai
réalisé cela dans une mise-en-page pensant que l’ordre d’affichage des
polygones est primordial pour l’effet final, et qu’il n’y a aucun moyen
de le contrôler dans une fenêtre-carte.
Cette expérience m’amène à dire que pour avoir des résultats
corrects il faut
-
choisir un décalage vers l’intérieur
du polygone (vers la droite pour une ligne)
-
commencer par le plus fort
décalage, la couleur la plus faible
-
respecter scrupuleusement l’ordre
des objets
Le
problème des « coins internes » soulevé plus haut est évité
par l’ordre d’affichage, les lignes les plus foncées cachant les défauts
des plus claires tracées avant.
Commençons par regarder les résultats d'un motif de 4 lignes de 2 pixels chacune. créé par Fader.MBX (voir plus bas dans Support pour la mise enœuvre)
La ligne de base n'est pas incluse dans cette image des 4 couches seules. Nous pouvons identifier trois types de problèmes:
A - les motifs dépassent dles régions aux coins pointus
B - les motifs ne se referment pas sur eux-mêmes le long de la bordure interne d'un "trou"
C - il peut y avoir une certaine superposition des motifs dans les endoits "serrés".
Certaines de ces manifeststions peuvent être minimisées avec ces deux recettes:
1 - utiliser un cache (région blanche trouée par le pays) cachera les débordements extérieurs;
2 - utiliser les frontières originales pour nettoyer l'espace entre deux régions (ici une simple ligne blanche)
La qualité visuelle a été notablement améliorée et les motifs sont sensiblement plus nets. Le seul problème restant est celui de la non fermeture des motifs pour les polygones internes. Une possibilité serait de rajouter du code pour générer des polylignes de 3 nœuds contruites sur le premier, le deuxième et l'avant-dernier nœuds de ces polygones d'ordre pair.
.
MapInfoW_OFF9.pen (offert à l'origine by Pierre Blanc with 4 styles) contient maintenant 9 motifs (maximum permis avec le fichier standard de la version 6.5 sans destruction de motifs existants) est disponible ici (télédécharger PEN_OFF9.zip)
motif # |
offset (pixels) |
/ ligne direction |
/ région (horaire) |
119 |
1 |
gauche |
extérieur |
120 |
1 |
droite |
intérieur |
121 |
2 |
gauche |
extérieur |
122 |
2 |
droite |
intérieur |
123 |
3 |
gauche |
extérieur |
124 |
3 |
droite |
intérieur |
125 |
4 |
gauche |
extérieur |
126 |
4 |
droite |
intérieur |
127 |
5 |
gauche |
extérieur |
Pour
être sûr que les régions sont bien toutes dans le sens horaire tel que
discuté plus haut, AllClockReg.MBX est disponible comme version BETA
sur ce site.
Fader.MBX utilisé pour créer l'exemple de motif dégradé est aussi disponible comme une application gratuite aux standards MLC