Rudiments du PostScript et de la cartographie

Eric.Guichard arobase-anti__spam ens.fr

janvier 2001






Attention, ceci ne constitue en aucun cas une documentation exhaustive ni rigoureuse. Le but est d'aider les personnes ayant une culture informatique minimale de comprendre et de réaliser certains fichiers écrits en PostScript. Pour plus d'infos, voir PostScript Language Tutorial and Cookbook, Addison-Wesley, 1990, ou le Web.

1   Fichiers PostScript élémentaires

1.1   Introduction

Pour expérimenter cette brève documentation, il suffit d'un éditeur, et d'un visualisateur de PostScript (GhostScript et ses variantes: gs, gv, sur Unix, Linux, Mac, Windows). Pour les cartographes des sciences humaines, Illustrator peut êre utilisé afin de desiner des fonds de carte.
Le fait de donner une extension <<.ps>> à un fichier PostScript est une tradition qui vient du monde Unix.

En annexe sont disponibles quelques exemples.

1.1.1   Les commentaires en PostScript

Ils commencent par le symbole %
Évidemment, certains commentaires servent à définir le type du fichier (cf. point suivant).

1.1.2   Début et fin du fichier

Ils ne sont pas indispensables mais fortement conseillés!
%!PS-Adobe-3.0
en première ligne pour définir l'en-tête, et
%EOF
en fin de fichier.

1.2   Exemples

Voir le fichier basique.ps disponible en annexe.
Les coordonnées partent du bas à gauche de l'écran ou de la feuille, et sont définies en points (=1/72 de pouce, soit environ 1/3 mm)

1.2.1   Cercle

Il suffit de taper (ou de copier):
%!PS-Adobe-3.0
100 100 50 0 360 arc
% décrit un arc centré en 100 100 de rayon 50
% allant de 0 à 360 degrés; c'est donc un cercle complet
stroke % dessine le <<trait>> demandé
showpage
%EOF


1.2.2   Triangle ou polygone

C'est assez élémentaire:
%!PS-Adobe-3.0
newpath
% nouveau polygone
50 200 moveto % on part des coordonnées 50 200
50 100 rlineto % on fait un déplacement relatif (r) de 50 en x et de 100 en y
50 -100 rlineto % idem
% on pourrait continuer ainsi s'il faut définir d'autres segments
closepath % fermer le polygone
stroke
showpage
%EOF


Note: ces exemples sont reproduits en annexe sous un format gif afin d'en permettre la visualisation sur le Web. Pour respecter au mieux la position des images dans la page, une bordure noire a été insérée sur les figures. Cette bordure correspondrait à la commande suivante:
newpath
0 0 moveto
0 842 rlineto
595 0 rlineto
0 -842 rlineto
closepath
stroke


Dans les faits, pour éviter des images trop grandes, la taille de la page est réduite à 400 points de large et 450 points en hauteur.

1.2.3   Ligne (éventuellement brisée)

Se déduit du point précédent.
x y moveto
z t lineto
% etc.
stroke

Fait ce qu'on veut. Note:
z t lineto est équivalent à
a b rlineto avec a=z-x et b=t-y

1.3   Couleurs, contours, fonds

Si rien n'est mentionné, la couleur est le noir, ou la couleur précédemment sélectionnée. De même pour le contour, valant par défaut 1 point d'épaisseur.

1.3.1   Couleur et épaisseur du contour

Exemple complétant la description du triangle:
%!PS-Adobe-3.0
newpath
50 200 moveto
50 100 rlineto
50 -100 rlineto
closepath
0 1 0 setrgbcolor
% définit la couleur en Rouge Vert Bleu en fraction: ici Vert
0.2 setlinewidth % épaisseur de la ligne (1/5 point)
stroke
showpage
%EOF


1.3.2   Précisions sur la couleur

Avec des valeurs identiques pour le RVB, on obtient des niveaux de gris:
0 0 0 setrgbcolor = noir
1 1 1 setrgbcolor = blanc
x x x setrgbcolor = gris clair si x proche de 1, sombre si x proche de 0.

On peut aussi choisir des couleurs d'imprimerie:
x y z t setcmykcolor définit les couleurs en Cyan, Magenta, Yellow, K comme black, avec les indices toujours compris entre 0 et 1. Si t vaut 1, le noir l'emporte.

1.3.3   Fond

Il faut intégrer les commandes suivantes juste après la commande closepath (ou la commande arc):
gsave
x y z setrgbcolor
fill
% ainsi l'objet aura comme fond la couleur désignée
grestore

Pourquoi?
Les commandes PostScript doivent être imaginées posées sur une pile: c'est toujours la commande au dessus de la pile qui est réalisée, ensuite elle est <<jetée>>. Si on veut faire un stroke après un fill, l'objet sur lequel on travaillait sera perdu après l'imposition des couleurs du fond.
D'où le gsave: sauvegarder l'objet; ensuite on effectue la coloration du fond, enfin on restore l'objet sauvegardé (ici, le contour).

Exemple
%!PS-Adobe-3.0
100 100 50 0 270 arc
% arc centré en 100 100 de rayon 50 allant
%de 0 à 270 degrés
gsave
0 0 1 setrgbcolor
fill
grestore
0 1 .5 setrgbcolor
5 setlinewidth
stroke
showpage
%EOF


Cet exemple permet de voir comment se <<remplit>> l'arc de cercle.
Note: ces options sauvegarder et restaurer sont souvent utilisées dans les fichiers PostScript.

1.3.4   Superposition

C'est, en vertu de cette logique de pile, le dernier objet défini qui l'emporte, et qui risque donc de masquer les précédents. Mais un objet sans fond défini (ce qui est différent d'un fond blanc!) restera transparent et laissera ceux dessous visibles.

1.4   Raccourcis

Certaines commandes risquant d'être appliquées souvent, on peut les redéfinir de façon à gagner du temps: au début du fichier (l'idéal, sinon quand on en a besoin), on rédige la définition, comme ainsi:
/raccourci {la longue commande} def
Exemple
/m {moveto} def
alors 50 200 m sera interprété comme 50 200 moveto
Le PostScript ne s'embarrassant pas des passages à la ligne, on peut écrire
/co {gsave
0 1 1 setrgbcolor
fill
grestore} def

ou bien
/co {gsave 0 1 1 setrgbcolor fill grestore} def
ainsi:
%!PS-Adobe-3.0
/co {gsave 0 1 1 setrgbcolor fill grestore} def
100 200 50 0 360 arc
co

0 1 .5 setrgbcolor
5 setlinewidth
stroke
showpage
%EOF

fera ce à quoi on s'attend.

Note: il existe aussi des possibilités d'insérer des variables, d'opérer des homothéties...

1.5   Texte

Ce n'est pas si simple: problèmes d'accent, de longueur de ligne, de centrage, etc. Pour les accents, caractères spéciaux, etc., voir une prochaine leçon, en cas de besoin.

1.5.1   Exemple simple

Alignement standard
%!PS-Adobe-3.0
100 300 moveto
/Helvetica findfont 18 scalefont setfont
% prendre du helvetica 18
(Du texte noir) % le contenu du texte est entre parenthèses
0 setgray % ou 0 0 0 setrgbcolor; si on oublie cette ligne,
% c'est la dernière couleur sélectionnée qui sera utilisée
show
showpage
%EOF

% Le texte part donc vers la droite à partir des coordonnées 100 300

1.5.2   Texte centré

Exemple:
%!PS-Adobe-3.0
100 350 moveto
/Helvetica findfont 18 scalefont setfont
(Du texte noir)
dup stringwidth pop
2 div
0 exch sub
0 rmoveto
show

showpage
%EOF


Bref commentaire: on calcule la largeur du texte, on la divise par 2, on <<joue>> avec la pile pour translater les coordonnées prédéfinies (100 300) de la moitié de la longueur du texte.

1.5.3   Texte aligné à droite

Il suffit d'enlever la ligne 2 div

2   Logiques de la cartographie

2.1   Fichiers

On dispose de deux fichiers, l'un, statistique, dont chaque ligne décrit un objet géographique (ville, département, pays, etc.) et chaque colonne une variable. L'autre sera le fichier graphique.

2.1.1   Exemple de fichier statistique

Cf. le <<Tableau simple>>

Pays Population taux-personnes-de-+-de-60ans etc.
France 60 20  
Allemagne 80 23  
etc.      

Table 1: Tableau simple


Ce fichier subit un traitement... statistique, après lequel on désire souvent obtenir (au moins) deux types de représentations qui traduisent graphiquement les variations mesurées:
- plages de couleurs traduisant une discrétisation (description de pourcentages)
- cercles (ou carrés, etc.) de surface proportionnelle à une variable donnée (entière).

Exemple: On peint la France en jaune, l'Allemagne en rouge, car on a décidé que tout taux supérieur à 22 serait représenté en rouge (variable <<taux-personnes-de-+-de-60ans>>).
On dessine à l'emplacement du <<centre de la France>> (Paris) un cercle de rayon 60 et à l'emplacement de Berlin un cercle de rayon... 69,2 (et non pas 80!!!) pour décrire la variable <<Population>>; en effet, on se rappelle que l'on préfère que la surface des cercles soit proportionnelle à une variable donnée plutôt que leur diamètre).

2.1.2   Objets graphiques

On comprend bien que pour réaliser un traitement graphique, il faut manipuler des objets (contour de la France, de l'Allemagne, localisation du point Paris, idem pour Berlin) qu'il vaut mieux regrouper en classes: ici, <<Pays>> et <<Capitales>>.

Il suffit d'introduire un commentaire dans le fichier PostScript pour repérer les objets en question. Ces faits sont détaillés dans les exemples suivants.

Ce sont en fait les logiques de superposition (cf. partie 1) qui imposent de regrouper les objets en classes (sinon, par exemple, le cercle associé à Paris risquera d'être caché par la carte de France). Les classes sont communément appelées <<calques>> (<<layers>> en anglais).

2.1.3   Exemple

Le fichier Fr-All.ps (cf. Annexe) donne un exemple d'un fichier considérablement simplifié issu du logiciel Illustrator (qui est très bavard). Il est composé de 3 calques: Pays, Capitales et Cercles. Il n'y a en fait que 2 objets (France et Allemagne), comme dans la base statistique, mais répliqués dans chaque calque.
Ceci appelle quelques commentaires:
- Il vaut mieux prévoir (au moins) autant de calques que de représentations graphiques potentielles, afin que toutes les localisations soient bien prévues.
- On peut ajouter des calques qui ne serviront que de décoration (on dit <<habillage>>). Par exemple un calque pour les objets de dimension 1 (rivières, routes, etc.), un pour des surfaces telles que les lacs, un pour le fond, le cadre, etc.
- Dans le fichier Fr-All.ps, les points qui représentent les capitales des pays ne sont pas visibles. C'est pourquoi est ajouté un calque a priori inutile, le calque <<Cercles>>, qui permet de visualiser la localisation des capitales.
- Composantes connexes: la Corse étant un polygone appartenant à l'objet statistique France, il convient donc que les deux polygones aient la même couleur. On définit souvent par Objet, Objet-2, Objet-n les intitulés des différentes composantes connexes d'Objet.

2.1.4   Conventions

Elles sont définies pour <<coller>> au mieux aux normes du logiciel Illustrator (versions <=8). Dans la version 9, le nom des objets est placé sous leur description...


On définit un calque de la façon suivante:
%AI5_BeginLayer--
%(Nom du calque) Ln
...description des objets...
%AI5_EndLayer--


Note pour la documentation en LATEX: la rapidité d'écriture en LATEXfait que les deux tirets consécutifs après BeginLayer ou EndLayer (- -) apparaissent sous forme d'un seul tiret long, ce qui n'est pas si grave...

et les objets d'un calque ainsi:
%AI3_Note:Nom-de-l-Objet1
sa description
%AI3_Note:Nom-de-l-Objet2
sa description
etc.


2.1.5   Exemple de fichier résultat

Le fichier Fr-All2.ps (cf. Annexe) donne un exemple de ce que l'on pourrait faire par programmation en manipulant les objets en fonction des variables à décrire (le calque <<Cercles>> a été supprimé, puisqu'on a vu qu'il est en fait inutile).

Qu'a-t-on fait? Pour une représentation donnée (ex: cercles proportionnels), on choisit une variable et un calque (ex: variable <<Population>> et calque <<Capitales>>). Le programme consiste alors à repérer les objets graphiques (objets <<France>> et <<Allemagne>> du bon calque) et à les transformer:

si on rencontre l'expression
%AI5_BeginLayer--
%(Capitales) Ln

alors, quand on lit
%AI3_Note:Objet
remplacer, à la ligne suivante
coord_x coord_y m
par
coord_x coord_y rayon-calculé-de-l-objet 0 360 arc
puis remplacer la suite (jusqu'au prochain %AI3_Note:)
par stroke (ou par des choses un peu plus compliquées si on désire des cercles d'une couleur donnée, d'une épaisseur donnée, évidés ou pas, etc.).

On peut multiplier les représentations, par exemple, décider aussi de modifier le fond des pays en fonction de la variable <<taux-personnes-de-+-de-60ans>>: voir toujours le fichier Fr-All2.ps.

2.1.6   Conclusion

- En bref, il suffit de repérer des chaînes de caractères, de faire quelques calculs élémentaires, d'intégrer des modifications dans un fichier PostScript, et de penser à la gestion des calques, ceux qui apparaîtront en fond étant décrits les premiers.
- On remarque qu'il n'est pas obligatoire d'avoir une description PostScipt du fichier graphique initial. Des fichiers ascii, décrivant d'une façon ou d'une autre points et polygones, sont tout-à-fait adaptés.
- D'autres travaux sont possibles: flèches de couleur et d'épaisseur associées à des variables données, animations (en d'autres formats que le PostScript), etc.

3   Annexes: fichiers d'exemples

3.1   Le fichier basique.ps

Le plus simple est de le visualiser:
%!PS-Adobe-3.0
100 100 50 0 360 arc
stroke
/m {moveto} def

newpath
50 200 m
50 100 rlineto
50 -100 rlineto
closepath
gsave
0.8 0.8 0.8 setrgbcolor
fill
grestore
0 1 0 setrgbcolor
0.2 setlinewidth
stroke

100 200 30 0 270 arc
1 0 0 setrgbcolor
4 setlinewidth
stroke

100 300 m
/Helvetica findfont 18 scalefont setfont
(Du texte noir)
0 setgray show

showpage
%EOF

Sa visualisation en gif

3.2   Le fichier Fr-All.ps

C'est en quelque sorte un <<fond de carte>>, avec une visualisation spécifique pour des points qui en théorie n'apparaissent pas. A visualiser lui aussi.

%!PS-Adobe-3.0
/m {moveto} def
/l {lineto} def
/s {closepath stroke} def
/S {stroke} def

%AI5_BeginLayer--
%(Pays) Ln
%AI3_Note:Allemagne
newpath
266.6094 404.9883 m
294.0967 409.1528 l
287.6865 434.4482 l
346.1563 424.979 l
381.9736 339.6016 l
343.6533 319.834 l
370.3115 279.6289 l
357.8174 255.0566 l
267.627 255.6777 l
278.687 290.041 l
251.1997 307.5322 l
245.9785 360.2422 l
266.6094 404.9883 l
s
%AI3_Note:France
newpath
191.5752 345.9434 m
175.752 341.6104 l
171.5249 323.0166 l
150.915 316.2471 l
145.8311 307.9492 l
127.5063 311.2813 l
126.7188 318.6816 l
117.1211 320.2959 l
118.7603 293.7891 l
88.3574 303.7842 l
65.4512 297.1211 l
69.1992 281.2949 l
99.1855 261.3037 l
116.2612 221.3223 l
98.3525 166.3477 l
181.6479 133.8623 l
193.7261 155.1025 l
203.1533 158.8379 l
241.6206 146.3564 l
264.625 162.2148 l
251.6162 194.251 l
254.7998 227.8662 l
242.0371 229.2354 l
259.1128 254.2236 l
267.627 255.6777 l
278.687 290.041 l
191.5752 345.9434 l
s
%AI3_Note:France-2 % C'est en fait la Corse
newpath
299.4004 143 m
297.3862 135.501 l
283.2681 129.6973 l
294.5132 103.876 l
299.4004 143 l
s
%AI5_EndLayer--

%AI5_BeginLayer--
%(Capitales) Ln
%AI3_Note:France % En fait, Paris
185.3965 288.791 m
S
%AI3_Note:Allemagne
329.0674 378.75 m
S
%AI5_EndLayer--

%AI5_BeginLayer-- % Ce calque inutile sera supprimé par la suite.
%(Cercles) Ln
%AI3_Note:France
329.0674 378.75 2 0 360 arc
S
%AI3_Note:Allemagne
185.3965 288.791 2 0 360 arc
S
%AI5_EndLayer--

showpage
%EOF

Sa visualisation en gif

3.3   Le fichier modifié Fr-All2.ps

Là encore, une visualisation aide à la lecture
%!PS-Adobe-3.0
/m {moveto} def
/l {lineto} def
/s {closepath stroke} def
/S {stroke} def
/g {closepath gsave} def
/coul {setrgbcolor fill} def % coul pour <<couleur>>
/contour {grestore 2 setlinewidth 0 setgray stroke} def

%AI5_BeginLayer--
%(Pays) Ln
%AI3_Note:Allemagne
newpath
266.6094 404.9883 m
294.0967 409.1528 l
287.6865 434.4482 l
346.1563 424.979 l
381.9736 339.6016 l
343.6533 319.834 l
370.3115 279.6289 l
357.8174 255.0566 l
267.627 255.6777 l
278.687 290.041 l
251.1997 307.5322 l
245.9785 360.2422 l
266.6094 404.9883 l
g
1 0 0 coul
contour
%AI3_Note:France
newpath
191.5752 345.9434 m
175.752 341.6104 l
171.5249 323.0166 l
150.915 316.2471 l
145.8311 307.9492 l
127.5063 311.2813 l
126.7188 318.6816 l
117.1211 320.2959 l
118.7603 293.7891 l
88.3574 303.7842 l
65.4512 297.1211 l
69.1992 281.2949 l
99.1855 261.3037 l
116.2612 221.3223 l
98.3525 166.3477 l
181.6479 133.8623 l
193.7261 155.1025 l
203.1533 158.8379 l
241.6206 146.3564 l
264.625 162.2148 l
251.6162 194.251 l
254.7998 227.8662 l
242.0371 229.2354 l
259.1128 254.2236 l
267.627 255.6777 l
278.687 290.041 l
191.5752 345.9434 l
g
1 1 0 coul
contour
%AI3_Note:France-2
newpath
299.4004 143 m
297.3862 135.501 l
283.2681 129.6973 l
294.5132 103.876 l
299.4004 143 l
g
1 1 0 coul
contour
%AI5_EndLayer--

%AI5_BeginLayer--
%(Capitales) Ln
%AI3_Note:France
185.3965 288.791 60 0 360 arc
S
%AI3_Note:Allemagne
329.0674 378.75 69.2 0 360 arc
S
%AI5_EndLayer--

showpage
%EOF

Sa visualisation en gif


This document was translated from LATEX by HEVEA.