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 en MapInfo

 

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.

 

 

Édition d’un motif

 

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.

 

 

Sens du décalage

 

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.

 

 

Application à des « trajets »

 

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 » (cercle de gauche)

 

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.

 

 

Application à des régions 

 

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. Les parties communes entre régions et zones sont aussi triples (bleu, noir, rouge)

 

 

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.

 

 

Le « sens » des régions

 

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.

 

 

« Motifs dégradés »

 

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.

 

 

Exemple de motif dégradé

 

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.

 

.

Support pour la mise en œuvre

 

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. Il marche aussi sur des sélections.

   

Fader.MBX utilisé pour créer l'exemple de motif dégradé est aussi disponible comme une application gratuite aux standards MLC