% Template GRASS newsletter - Article
% Language: Latex
%


% 
% TODO reference code snippets, try to use a set of examples that people can try on their own
% might be good to post the inputs on the website.
% 

% 
% TODO how can we include long URLs ?
% 

% 

\title{Cr\'eer des cartes pr\^etes \`a \^etre publi\'ees avec GRASS et GMT}
% \subtitle{An alternative approach to the production of press-ready maps}
\author{par Dylan Beaudette, traduit par Yves Jacolin}

\maketitle

\section{Aper\c{c}u}
\label{sec:overview}
La publication de cartes imprimables de haute qualit\'e est un composant important de la plupart des analyses g\'eographiques. Bien que GRASS n'ait pas \'et\'e \'ecrit pour la production de mat\'eriels imprimables, les commandes du type \texttt{ps.map} et plus r\'ecement un wrapper bien utile \texttt{G-ps.map}, lui permettent de sortir des cartes postscripts de haute qualit\'e. Cependant, la syntaxe et les possibilit\'es plut\^ot limit\'ees de l'approche \texttt{ps.map} produisent souvent une carte qui doit \^etre finalis\'ee dans un logiciel de PAO (Publication Assist\'e par Ordinateur) tel que Inkscape, Scribus, ou The GIMP. La fonctionnalit\'e composer une carte trouv\'ee dans QGIS peut \^etre une bonne alternative dans un proche futur, mais la version actuelle manque de flexibilit\'e, de stabilit\'e, et de la possibilit\'e d'exporter des donn\'ees dans des formats tels que EPS ou PDF. Avec de telles options limit\'ees pour la production de cartes \`a imprimer de grande qualit\'e dans un processus open source, de nombreuses personnes ont bricol\'e ensemble le n\'ecessaire requis pour interfacer GRASS avec de nombreux programmes comme le paketage Generic Mapping Tools. Le projet GMT est tr\`es bien d\'ecrit par ses auteurs :

\begin{quotation}
GMT est une collection open source d'une soixantaine d'outils pour la manipulation de jeux de donn\'ees Cartesian et g\'eographiques (comprenant les filtres,  l'ajustement de la direction, la cr\'eation de grilles, la projection etc.) et la production dans des fichiers PostScript Encapsul\'e (EPS) d'illustrations qui vont du simple graphe x-y en passant par des cartes de contour \`a la surbrillance articielle des surfaces et des vues en perspective en 3D. GMT g\`ere environ 30 projections et transformations cartographiques et est fourni avec des donn\'ees telles que la ligne des c\^otes, les rivi\`eres, les limites politiques. GMT est d\'evelopp\'e et maintenu par Paul Wessel et Walter H. F. Smith avec l'aide d'une \'equipe de volontaires, et est g\'er\'e par la Fondation Nationale des Sciences. Il est diffus\'e sous la licence GNU General Public.
\end{quotation}

\noindent
Cet article d\'ecrit les efforts combin\'es de plusieurs personnes (David Finlayson, Hamish Bowman, Brent Wood, moi-m\^eme, et d'autres) pour cr\'eer le moyen d'interfacer GRASS \`a GMT. Plusieurs permutations des commandes du style \texttt{*.out.gmt} ont \'et\'e cr\'e\'ees, en utilisant \`a la fois des scripts Python et Bash, pour r\'ealiser l'export n\'ecessaire, la configuration, et l'ex\'ecution des commandes GMT. Apr\'es avoir lu cet article vous devriez avoir une id\'ee g\'en\'erale pour composer de simples cartes dans GMT, avec des scripts mod\`eles pour l'utilisation de donn\'ees export\'ees de GRASS. L'article suivant pr\'esentera des exemples sp\'ecifiques \`a Spearfish (le jeu de donn\'ees standard de GRASS) de cr\'eation de cartes avec GMT.

\subsection{GMT}
\label{sec:GMT}
Les applications des Outils de Cartographie G\'en\'erique (GMT) peuvent \^etre install\'ees sur n'importe quelle plate-forme soit par des binaires pr\'epar\'es ou en compilant le code source. Les outils GMT peuvent aussi \^etre install\'es \`a partir de votre syst\`eme de gestion de paquets de votre distribution (par exemple aptitude), cependant cette m\'ethode n'est pas recommand\'ee puisque le paquet a de grandes chances de ne pas \^etre \`a jour. Si vous \^etes sur un syst\`eme d'op\'eration de type UNIX, compiler \`a partir des sources est relativement ais\'e, et assure que vous avez une version \`a jour. En supposant que vous avez un ensemble d'outils de d\'eveloppement en fonctionnement (gcc, make, etc.) \`a allez sur la page 'Download' \footnote{\url{http://gmt.soest.hawaii.edu/gmt/gmt_download.html}}, et suivez les instructions. GMT est distribu\'e avec un manuel compr\'ehensible, des cours pour cr\'eer des cartes, et des donn\'ees pour des cartes \`a diff\'erentes \'echelles. Une fois que vous avez une copie fonctionnelle de GMT install\'ee sur votre machine, et que vous avez t\'el\'echarg\'e les donn\'ees d'exemple \footnote{\url{http://169.237.35.250/~dylan/GRASS/newsletter/sample_data.tar.gz}} vous pouvez suivre les exemples de cet article. Cette archive contient \'egalement un ensemble de scripts approfondis dans plusieurs exemples dans cet article. Le script \texttt{template.sh} peut \^etre utilis\'e pour d\'emarrer pour une approche automatis\'ee pour exporter et tracer des donn\'ees Raster et vecteur de GRASS avec des outils de GMT. Remarquez que ce script est un point de d\'emarrage et est loin d'\^etre complet.

Les commandes GMT sont lanc\'ees depuis la console (avec un jeu complexe de param\`etres, switches et d'autres arguments) et envoient les fragments Postscript qui en r\'esultent vers la sortie standard. Le comportement par d\'efaut de toutes les applications GMT peut \^etre ajust\'e avec la commande \texttt{gmtset}. Cette commande est habituellement utilis\'ee avant toute commande qui produit un rendu, ainsi des \'el\'ements cl\'e tels que la taille du papier, l'espace des polices etc. sont \'etablis. La premi\`ere commande de tra\c{c}age lanc\'ee (g\'en\'eralement \texttt{psbasemap}) cr\'ee le fichier de sortie initial avec l'op\'erateur standard ``>'', tandis que chaque appel suivant ajoute \`a ce fichier avec l'op\'erateur d'ajout double -``>''. Le premier param\`etre \texttt{-K} est utilis\'e avec toutes les commandes GMT avant la derni\`ere commande, ainsi le fichier Postsript en sortie n'est pas finalis\'e pr\'ematur\'ement. Nous utiliserons des donn\'ees \'echantillons d'une application Mapserver pour illustrer divers aspects d'utilisation de GMT, avec une id\'ee de comment coupler cela avec GRASS et GMT.

\subsection{Application \'echantillon}
\label{sec:sample_application}

\label{code:simple_example}
\begin{footnotesize}
\begin{verbatim}
# define some global settings:
gmtset ANNOT_FONT_PRIMARY Times-Roman \
HEADER_FONT_SIZE 16 \
ANNOT_FONT_SIZE_PRIMARY 12 \
LABEL_FONT_SIZE 14 \
BASEMAP_TYPE plain \
PLOT_DEGREE_FORMAT DF \
PAPER_MEDIA letter+

# sample map centered on the western USA
pscoast -JB-116/36/30/42/7i \
-R-125/-108/31/44 -B5 \
-Gwhite -W0.5p \
-A250 -Dh -Na -Xc -Yc -P -K > query_centers.eps

# plot mapxy points:
psxy sample_data/mapxy_locations.latlong -J -R \
-Sc0.075c -W1/1/200/1 -G1/200/1 -O -K >> query_centers.eps

# plot ka-map points 
psxy sample_data/ka-map_locations.latlong -J -R \
-Sc0.075c -W1/255/1/1 -G255/1/1 -O >> query_centers.eps
\end{verbatim}
\end{footnotesize}

%% talk about the parameters
\noindent
L'exemple ci-dessus cr\'ee un graphique de l'Est des \'Etats-Unis, avec des points rouges et verts symbolisant l'activit\'e sp\'ecifique \`a l'endroit d'un site Internet. Le cadre de la carte est cr\'e\'e avec la commande \texttt{psbasemap}, les lignes de c\^otes et limites politiques sont cr\'e\'ees par \texttt{pscoast}, et les points sont cr\'e\'es avec la commande \texttt{psxy}. La localisation des points est stock\'ee comme des paires simples de longitude-latitude au format texte, tandis que la ligne de c\^ote est dessin\'ee \`a partir du jeu de donn\'ees inclus dans GMT. Le r\'esultat peut \^etre vu \`a la Figure \ref{fig:example1}.


\noindent
Une explication compl\`ete des diverses options des lignes de commandes peut \^etre trouv\'ee dans la page de manuel de chaque commande. De plus, un exemple plus complet de GMT r\'ealis\'e en dehors de GRASS peut \^etre trouv\'e sur le site de l'auteur \footnote{\url{http://casoilresource.lawr.ucdavis.edu/drupal/node/102}}. Dans l'exemple ci-dessus, les param\`etres de projection et de r\'egion sont d\'efinis manuellement par l'utilisateur. Des \'el\'ements de formattage additionnels (tel que le param\`etre \texttt{-P} pour un affichage en portrait) doivent \^etre d\'efinis manuellement et d\'efinis en ligne de commande. La g\'en\'eration automatique d'une carte d\'epend alors, en partie, d'une approche dynamique pour d\'efinir les options pass\'ees aux commandes GMT. Un langage de script, capable d'extraire les informations de r\'egion de GRASS \`a partir d'une session de GRASS en cours est une approche id\'eal pour automatiser cette t\^ache.

\setkeys{Gin}{width=1\textwidth}
\begin{figure}[tbp]
   \centering
   %name of your graphic, without the path AND in EPS format:
   \includegraphics[scale=0.4]{integration/beaudette/query_centers}
   %caption of the figure
   \caption{Localisations de requ\^ete, symbolis\'e par une application cartographie active. Les points verts repr\'esentent une application Mapserver bas\'ee sur LandView, les points rouges repr\'esentent une application Mapserver bas\'ee sur Ka-map.}
   %label of the figure, which has to correspond to \ref{}:
   \label{fig:example1}
\end{figure}


\section{Coupler GRASS et GMT}
\label{sec:GRASS_GMT}
L'approche g\'en\'erale pour interfacer GRASS et GMT peut \^etre r\'esum\'ee comme suit :

\begin{small}
\begin{itemize}
\item collecter des informations \`a partir d'utilisateurs sur :
	\begin{itemize}
	\item les donn\'ees en entr\'ees
	\item les options de formatage
	\item les options du rendu
	\end{itemize}

\item collecter des param\`etres g\'eographiques \`a partir de la r\'egion GRASS
\item calculer les param\`eters cl\'es de mise en page
	\begin{itemize}
	\item information sur la projection
	\item limites d'\'echelle
	\item intervales des \'echellons
	\end{itemize}

\item exporter les donn\'ees raster de GRASS vers le format .gd de GMT
\item exporter les donn\'ees vecteurs de GRASS vers le format ASCII de GMT
\item lancer les commandes GMT avec les param\`etres ci-dessus
\end{itemize}
\end{small}


\subsection{Collecter des informations \`a partir de l'utilisateur}
Le parseur de script GRASS fournit une approche ais\'ee \`a la cr\'eation de commandes GRASS pesonnalis\'ees, sans la n\'ecessit\'e de comprendre le langage C. Un script habile et rigoureux peut \^etre utilis\'e pour parser des d\'etails sur le jeu de donn\'ees de GRASS comme des informations sur les param\`etres de la r\'egion en cours aux commandes GMT, en utilisant la syntaxe famili\`ere et la structure de l'interface d'un module GRASS. Avec ces options sauv\'ees dans des variables locales il est possible de modifier les param\`etres par d\'efaut tels que la taille du papier, la taille des polices et l'orientation du texte en lan\c{c}ant le programme \texttt{gmtset} avec nos variables locales substitu\'ees par l'interpr\'eteur de script \footnote{On peut trouver plus d'informations sur l'interpr\'eteur de script GRASS ici \url{http://grass.itc.it/gdp/html_grass63/g.parser.html}}.


\subsection{Collecter des informations g\'eographiques}
Extraire des informations cl\'e des param\`etres de la r\'egion en cours (pour une utilisation des param\`etres plus tard dans GMT) peut \^etre r\'ealis\'e de plusieurs mani\`eres. Parmi celles-ci une implique les outils \texttt{g.region} et de traitement de texte, gr\^ace \`a Bruce Raup pour la suggestion \'el\'egante de \texttt{eval}. Remarquez que tous les exemples suivants n\'ecessitent que vous soyez dans une session GRASS active.

% 
% might not want to include all of this.
% 
\begin{footnotesize}
\begin{verbatim}
# need to be in an active GRASS session for this to work.
#
# region extents: used with -R flag
# resolution: used with the -I flag
#
# elegant approach to extracting extent and 
# region resolution as suggested by
# Bruce Raup - National Snow and Ice Data Center
#
region_assignments=`g.region -g`
eval $region_assignments

# setup flags for GMT commands
region="-R$w/$e/$s/$n"
inc="-I$ewres/$nsres"

# extract extent values for calculating map aspect ratio
extent_assignments=`g.region -ge`
eval $extent_assignments

# preserve aspect ratio from UTM E,N coordinates:
aspect_ratio=`echo $ns_extent $ew_extent 
| awk '{printf("%f", $1 / $2)}'`

# calculate the map length based on the 
# original aspect ratio
map_length=`echo $map_width $aspect_ratio 
| awk '{printf("%f", $1 * $2)}'`

# calculate the y location (in paper units)
# for the field sheet title
field_sheet_title_y=`echo $map_length 
| awk '{printf("%f", $1 + 0.33)}'`

#compile the projection string, with 
# width/length variables
#linear projection, width inches / length inches
projection_string="X${map_width}i/${map_length}i"
\end{verbatim}
\end{footnotesize}

\noindent
Une approche plus robuste impliquerait la liaison GRASS-Python pour extraire directement les param\`etres de la r\'egion. Une fois que les donn\'ees de la r\'egion ont \'et\'e extraites et sauv\'ees dans des variables locales, nous pouvons r\'ealiser les calculs n\'ecessaires pour obtenir les autres param\`etres tels que l'\'echelle de la carte, le rapport de l'aspect de la carte, la taille de la carte sur le papier, etc. Les param\`etres de la r\'egion sont utilis\'es pour le param\`etre \textit{de tra\c{c}age de la r\'egion} (\texttt{-R\$w/\$e/\$s/\$n}), souvent utilis\'e seulement dans la premi\`ere fonction de tra\c{c}age. Toutes les fonctions de tra\c{c}ages suivantes peuvent h\'eriter de ces valeurs en d\'efinissant des param\`etres vides \texttt{-J} et \texttt{-R} en fonction du param\`etre \texttt{-O} (superposition).

% 
% talk a bit about how GMT operates with unprojected vs. projected data.
% 
\subsubsection{Les projections des cartes dans GMT}
L'approche traditionnelle pour utiliser les outils GMT implique le tra\c{c}age de donn\'ees, encod\'e en paire longitude-latitude, dans une projection d\'efinie avec le param\`etre \texttt{-J}. Les coordonn\'ees sont transform\'ees au fur et \`a mesure que la sortie Postscript est g\'en\'er\'ee. Comme not\'e dans l'exemple de code ci-dessus, une projection Alber Equal Area centr\'ee sur (116$^\circ$W, 36$^\circ$N), en ayant des parall\`eles standards \`a 30$^\circ$N et 42$^\circ$N, et qui a 7 pouces de large est encod\'e par \texttt{-JB-116/36/30/42/7i}. Lisez le manuel de GMT pour une liste compl\`ete de projections g\'er\'ees et de leurs param\`etres.

Lorsqu'on travaille dans GRASS, les donn\'ees sont habituellement (mais pas toujours) dans une projection g\'eographique et donc le mode de projection \textit{linear} doit \^etre utilis\'e. Une fois qu'une largeur et une longueur appropri\'ees de la carte (dans ce cas en utilisant des pouces) ont \'et\'e \'etablies les param\`etres de la projection lin\'eaire sont encod\'ees par \texttt{-JX\$\{map\_width\}i/\$\{map\_length\}i}. Remarquez que les unit\'es m\'etriques ou imp\'eriales peuvent \^etre utilis\'ees dans GMT et passer de l'un \`a l'autre implique seulement l'ajout d'un 'c' pour centim\`etre et 'i' pour pouces ([NdT] inches en anglais) apr\`es le nombre.


\subsection{Exporter et tracer des donn\'ees raster GRASS}
Exporter une donn\'ee raster GRASS vers un format compatible GMT peut \^etre r\'ealis\'e avec une combinaison de \texttt{r.out.bin} et \texttt{xyz2grd} (inclu dans la distribution GMT). 
L'utilisation correcte de \texttt{xyz2grd} n\'ecessite des connaissances dans les donn\'ees raster en entr\'ee : c'est \`a dire entier ou virgule flottante, etc. Pour une cellule raster export\'ee avec \texttt{r.out.bin}, le param\`etre \texttt{-ZTLh} pourrait \^etre utilis\'e pour renseigner \texttt{xyz2grd} que le flux de donn\'ees en entr\'ees est de type enti\`er court orient\'ee. %For a CELL raster exported with \texttt{r.out.bin}, the flag \texttt{-ZTLh} would be used to instruct \texttt{xyz2grd} that the input data stream is scanline oriented short integer data.
Pour les cartes FCELL et DCELL les param\`etres correspondants pourraient \^etre respectivement \texttt{-ZTLf} ou \texttt{-ZTLd}. Le param\`etre \texttt{-F} instruit \texttt{xyz2grd} pour utiliser l'enregistement des pixels des grilles des cellules, le m\^eme enregistrement utilis\'e pour les rasters GRASS. Une simple d\'eclaration CASE peut \^etre utilis\'ee dans nos exemples de scripts pour cr\'eer automatiquement l'appel \`a \texttt{xyz2grd}. Un param\`etre optionnel dans notre exemple de script peut \^etre utilis\'e pour sauter cette \'etape pour faciliter la r\'ecup\'eration des autres param\`etres sans perdre de temps de traitement pour exporter les donn\'ees raster. L'auteur a trouv\'e que d\'efinir la r\'egion par une r\'esolution enti\`ere entra\^ine l'op\'eration la plus fiable de \texttt{xyz2grd}.

\begin{footnotesize}
\begin{verbatim}
# obtenir le type de la carte d'un raster donn\'ee
MAP_TYPE=`r.info -t "$output_raster" | cut -f2 -d'='`

# exporter le raster bas\'e sur son type,
# ses param\`etres de r\'egionde l'exemple ci-dessus
# et les param\`etres de r\'esolution de l'exemple plus haut :
case "$MAP_TYPE" in
	CELL)
		r.out.bin input=$output_raster output=- null=-9999 \
		| xyz2grd -G$output_raster.grd \
		$region $inc -ZTLh -F -N-9999 ;;
	FCELL)
		r.out.bin input=$output_raster output=- null=-9999 \
		| xyz2grd -G$output_raster.grd \
		$region $inc -ZTLf -F -N-9999 ;; 
	DCELL)
		r.out.bin input=$output_raster output=- null=-9999 \
		| xyz2grd -G$output_raster.grd \
		$region $inc -ZTLd -F -N-9999 ;; 
esac
\end{verbatim}
\end{footnotesize}

\noindent
Une fois que les donn\'ees rasters ont \'et\'e export\'ees au format .grd nous somme presque pr\^ets pour leur utilisation avec les commandes de dessins de GMT telles que \texttt{psimage}. Cette commande peut soit utiliser un seul fichier grille, avec un fichier de palette de couleurs (.cpt), soit avec des canaux de couleurs s\'epar\'ees rouge, vert, bleu \footnote{Les d\'efinitions des fichiers de palette de couleur de GTM peuvent \^etre trouv\'ees sur \url{http://www.soest.hawaii.edu/GMT/gmt/doc/html/GMT_Docs/node57.html}}.


% 
% not sure about the use of footnotes in the newsletter
% 
\subsubsection{Exporter les donn\'ees des tables de couleur GRASS}
Pour l'instant il n'y a pas de m\'ethode \textit{simple} disponible pour convertir les informations de la table des couleurs de GRASS en un fichier de palette de couleurs fiable pour GMT. Les d\'eveloppements existants sont capables d'approcher le format .cpt, cependant l'auteur n'a pas \'et\'e capable d'utiliser avec succ\`es ces fichiers g\'en\'er\'es automatiquement. Un script de conversion fonctionnel (de pr\'ef\'erence \'ecrit en un langage de script de haut niveau tel que Python) sera post\'e prochainement sur le wiki de GRASS d\`es qu'il sera complet \footnote{De plus amples tests et adaptations du script r.out.gmt.py de David Finlayson pourraient \^etre l'approche la plus rapide).}.

GMT fournit plusieurs outils pour cr\'eer manuellement un fichier de palette de couleur dans un domaine de donn\'ees fourni par l'utilisateur, ou un domaine de donn\'ees lu \`a partir d'un fichier grid de GMT. Bien que cela ne soit pas une approche id\'eale , il peut \^etre utile quand une des palettes de couleur de GMT est appropri\'ee. Dans le cas sp\'ecial o\`u l'image export\'ee est en nuance de gris, la palette de couleur standard ``gray.cpt'' peut \^etre utilis\'ee pour cr\'eer un nouveau fichier cpt avec le programme \texttt{makecpt}.

\begin{footnotesize}
\begin{verbatim}
# cr\'eer une palette de couleur fiable pour une image
# raster CELL en nuance de gris, les valeurs de grille
# sont des entiers dans un domaine compris de 0-255
makecpt -Cgray -T0/255/1 -V > doqq.cpt

\end{verbatim}
\end{footnotesize}

\noindent
Lorsque l'on travaille avec des canaux de couleurs qui ont d\'ej\`a \'et\'e s\'epar\'es (par exemple, landsat ou d'autres images multispectrales) il est possible d'utiliser \texttt{psimage} sans un fichier de palette de couleurs, au lieu de d\'efinir des fichiers de grilles en entr\'ee en rouge, vert et bleu. Cette approche est plus ais\'ee lorsque l'on travaille avec des donn\'ees qui ont \'et\'e collect\'ees dans des bandes s\'epar\'ees. Pour des donn\'ees \`a une seule bande, la s\'eparation des couleurs peut \^etre cr\'e\'ee avec \texttt{r.mapcalc}.

\begin{footnotesize}
\begin{verbatim}
# obtenir les s\'eparations de couleurs pr\^et pour GMT
 
r.mapcalc "some_raster.red = r#some_raster"
r.mapcalc "some_raster.blue = b#some_raster"
r.mapcalc "some_raster.green = g#some_raster"
\end{verbatim}
\end{footnotesize}

 
\subsection{Exporter et tracer des donn\'ees vecteurs GRASS}
Le format vecteur de GMT est bas\'e sur un format ASCII bas\'e sur des vertex, tr\`es simple, d\'esign\'e au d\'ebut pour stocker des donn\'ees g\'eom\'etriques. Cependant, avec des scripts il est possible d'encoder des donn\'ees attributs simples dans ce format pour la production de cartes th\'ematiques. Une approche alternative implique que les donn\'ees vecteurs qui ont \'et\'e pr\'e-filtr\'ees avec un outil GRASS tel que \texttt{v.extract}, en plusieurs fichiers o\`u chacun repr\'esente une classe sp\'ecifique. En utilisant la premi\`ere approche (encoder les attributs dans une fichier vecteur GMT) la symbologie pour chaque point, ligne et polygone est encod\'ee dans le fichier, tandis que la symbologie est d\'efinie avec des param\`etres en ligne de commande pour la seconde aproche.

\subsubsection{Donn\'ees points}
Exporter des donn\'ees ponctuelles est la conversion la plus simple de GRASS $\rightarrow$ Vecteur GMT. Dans la plupart des cas, o\`u un ensemble de points doit \^etre trac\'e dans GMT en utilisant une symbologie fixe, la sortie de \texttt{v.out.ascii} ou \texttt{v.out.ascii.db}  peut \^etre directement trac\'ee avec la commande GMT texttt{psxy}. Notez que filtrer la sortie avec l'une ou l'autre commande avec des outils de traitement de texte UNIX est une m\'ethode id\'eale pour convertir des attributs dans une symbologie ou pour ajuster les \'etiquettes.


\begin{footnotesize}
\begin{verbatim}
# exporter d'un format ASCII de GRASS
v.out.ascii in=points fs=" " > points.xy

# trace les points avec un contour blanc et remplit de
# bleu en utilisant un symbol circulaire de 0.125 
# pouces de diam\`etre en ajoutant le resultat Postscript
# \`a 'outfile.eps'
psxy points.xy -R -J -M -Sc0.125 -G255/1/1 \
-W1/255/255/255 -O -K >> output.eps 
\end{verbatim}
\end{footnotesize}

\noindent
L'\'etiquetage des donn\'ees points peut \^etre r\'ealis\'e d'abord en filtrant la sortie de \texttt{v.out.ascii} avec un simple script \texttt{awk}, puis en utilisant la sortie avec la commande \texttt{pstext}. Le format des \'etiquettes utilis\'e par GMT est document\'e dans la page du manuel de \texttt{pstext}, cependant une simple explication est donn\'ee dans l'\'echantillon de code ci-dessous.

\begin{footnotesize}
\begin{verbatim}
# export du format de GRASS vers ASCII avec des 
# attributs s\'electionn\'es (colonne 'ID'), sortie
# filtr\'e avec awk, classement des colonnes,
# et insertion des \'etiquettes dans le formulaire :
# x_coord, y_coord, font_size, rotation_angle, 
# font_number, label_offset, label_text
v.out.ascii.db in=points columns=ID | awk -F"|" 
'{print $2, $3, 10, 0, 4, "BL", $4}' \ 
> points_with_labels.xy

# trace les textes des \'etiquettes \`a partir des 
# g\'eom\'etries et des propri\'et\'es des \'etiquettes stock\'ees
# dans 'points_with_labels.xy' les \'etiquettes seront
# bleu et distante de 0.1 cm dans les directions
# horizontale et verticales d\'efinie dans la colonne
# 5 du fichier en entr\'ee
pstext points_with_labels.xy -R -J -Dj0.1c/0.1c 
-G0/0/255 -K -O >> outfile.eps
\end{verbatim}
\end{footnotesize}


\subsubsection{Donn\'ees ligne et polygone}
Il n'y a pas pour l'instant de m\'ethode directe pour convertir des donn\'ees lignes et polygone GRASS en un format compatible avec GMT. Cependant, en utilisant une application externe appell\'ee \texttt{shp2gmt} \footnote{ce petit programme utile initialement \'ecrit par (Frank Warmerdam), a \'et\'e modifi\'e par (Mark Fenbers) pour inclure des informations attributaires \`a partir d'une shapefile. Le code du \texttt{shp2gmt} modifi\'e peut \^etre trouv\'e \`a \url{http://www.arcknowledge.com/gmane.comp.gis.gmt.user/2004-01/msg00121.html}}, il est possible de cr\'eer des fichiers vecteurs compatibles avec GMT en exportant d'abord les donn\'ees GRASS en shapefile puis en les convertissant avec \texttt{shp2gmt}. Le texte issu de \texttt{shp2gmt} contient tous les attributs stock\'es dans le shapefile en entr\'ee en fonction des coordonn\'ees du vertex, et peut \^etre facilement filtr\'e avec \texttt{awk} pour inclure les param\`etres de la symbologie. Un exemple de session GRASS illustrant ce type d'op\'eration est list\'e ci*dessous.

\begin{footnotesize}
\begin{verbatim}
# export de GRASS vers le format shapefile
v.out.ogr -e in=lines dsn=. olayer=lines
v.out.ogr -e in=polys dsn=. olayer=polys

# convertit du format shapefile vers GMT
shp2gmt lines.shp > lines.xy
shp2gmt polys.shp > polys.xy

# en option filtre le fichier vecteur GMT
# pour inclure la symbologie
awk '
{
# tous les segments lignes avec l'attribut
# 'some_value' sera dessin\'e avec un pinceau
# rouge
if ($0 ~ /some_value/) printf "> -Wred\n"
# ... ajoute plus d'am\'elioration pour les autres classes
# pour les lignes qui ne correspondent pas, pour les 
# tracer mot pour mot (c.a.d. les donn\'ees vertex)
else print
}
' lines.xy > lines-thematic.xy

# traces les lignes, avec la symbologie d\'efinie dans 
# le fichier vecteur GMT
psxy lines-thematic.xy -R -J -O -K >> outfile.eps

\end{verbatim}
\end{footnotesize}


\noindent
L'\'etiquettage des objets lignes et polygones suit la m\^eme approche g\'en\'erale que l'\'etiquettage des objets ponctuels, par l'utilisation de \texttt{pstext}. Pour de simples cartes, une approche presque automatique pour \'etiquetter les donn\'ees polygonales implique l'export des centro\"ides avec \texttt{v.out.ascii.db}, comme list\'e au-dessus. \'Etiquetter les donn\'ees lignes n\'ecessite plus d'actions de la part de l'utilisateur, puisque chaque \'etiquette n\'ecessite des coordonn\'ees et un angle associ\'es. Avec un peu de travail il est possible d'utiliser le fichier cr\'ee par \texttt{v.label} pour produire un ensemble compatible avec GMT d'instruction de placement d'\'etiquettes. Un exemple de script \texttt{awk}, utilis\'e dans une session GRASS, est pr\'esent\'e ci-dessus.

\begin{footnotesize}
\begin{verbatim}
# creer le fichier d'\'etiquette GRASS : 
# tourner les \'etiquettes pour correspondre aux segments
# de ligne
v.label -a map=trails column=trail_name labels=trails.lab

# converti le foramt d'\'etiquette GRASS vers le format GMT
awk '
BEGIN{FS="\n" ; RS="\n\n"}
{ 
split($1, e, ": ") 
split($2, n, ": ")
split($15, r, ": ")
split($16, l, ": ")
# s'il n'y a pas de rotation, nous devons ajouter une
# roration de 0
if(NF == 16) {rotation = r[2] ; label = l[2]} 
else {rotation = 0 ; label = r[2]}
# creation les instructions d'\'etiquettage GMT
print e[2], n[2], 10, rotation, 4, label
}
' DATABASE/LOCATION/MAPSET/paint/labels/trails.lab 
> labels.xy

# dessin avec pstext
pstext labels.xy -R -J -Dj0.1c/0.1c -G0/0/255 -K -O 
>> outfile.eps

\end{verbatim}
\end{footnotesize}

\noindent
Bien que l'approche au-dessus peut fonctionner pour de simples cartes, une intervention de l'utilisateur est habituellement requise pour des cartes plus complexes. Une approche plus robuste pour l'\'etiquettage des objets ponctuels, lignes et polygones avec des possiblit\'es avanc\'ees telles que la d\'etection des collisions des \'etiquettes est n\'ecessaire pour une approche enti\`erement automatis\'ee.


% 
% finishing up, running commands,optionally converting the output to PDF with some tweaks.
% 
\subsection{Divers \'el\'ements de cartographie}
Des \'el\'ements suppl\'ementaires tels que le contexte de la carte (\texttt{psbasemap} avec \texttt{psxy}), l'\'echelle graphique (\texttt{psbasemap}), ou la l\'egende (\texttt{pslegend}) peuvent \^etre ajout\'es apr\`es que les composants de la carte principale aient \'et\'e ajout\'es au fichier en sortie. V\'erifier que la derni\`ere commande GMT n'utilise pas le param\`etre \texttt{-K} est toujours une bonne id\'ee, afin de s'assurer que le fichier en sortie est finalis\'e. Par l'utilisation rigoureuse des param\`etres \texttt{-O}, \texttt{-X}, et \texttt{-Y} il est possible de red\'efinir la r\'egion du trac\'e pour chaque appel d'un programme GMT. Cette approche fonctionne bien pour cr\'eer une carte de situation de petite taille, dans une autre carte finalis\'ee. En \'etendant le premier exemple, vous trouverez ci-dessous un script plus complet pour illustrer l'utilisation de \texttt{psbasemap} pour produire des \'el\'ements de la carte tels qu'une \'echelle graphique, une fl\`eche indiquant le nord, en fonction de la cr\'eation d'une carte de situation dans la carte principale.


\label{code:complex_example}
\begin{footnotesize}
\begin{verbatim}
# definition de param\`etres globaux :
gmtset ANNOT_FONT_PRIMARY Times-Roman \
HEADER_FONT_SIZE 16 \
ANNOT_FONT_SIZE_PRIMARY 12 \
LABEL_FONT_SIZE 14 \
BASEMAP_TYPE plain \
PLOT_DEGREE_FORMAT DF \
PAPER_MEDIA letter+

# carte \'echantillon centr\'ee sur l'est des USA
pscoast -JB-116/36/30/42/7i \
-R-125/-108/31/44 -B5 \
-Gwhite -W0.5p \
-A250 -Dh -Na -Xc -Yc -P -K 
> query_centers_2.eps

# trace les points mapxy :
psxy sample_data/mapxy_locations.latlong -J -R \
-Sc0.075c -W1/1/200/1 -G1/200/1 -O -K 
>> query_centers_2.eps

# tracve les points ka-map
psxy sample_data/ka-map_locations.latlong -J -R \
-Sc0.075c -W1/255/1/1 -G255/1/1 -O  -K 
>> query_centers_2.eps

# ajout de la barre d'\'echelle
psbasemap -J -R -Lf-119/32.5/32/150k:"Kilometers": \
-O -K -P -V >> query_centers_2.eps

#cr\'eer un contexte \`a la carte
pscoast -JB-116/36/30/42/7i \
-R-130/-100/25/50 \
-X0.25i -Y1.75i \
-Gwhite -W0.5p \
-A250 -Di -Na -P -K >> query_centers_2.eps

# ajoute la bo\^ite de la r\'egion
psxy context_box.xy -M -JB -R  -W3/1/1/0 -P -O 
>> query_centers_2.eps
\end{verbatim}
\end{footnotesize}

\setkeys{Gin}{width=1\textwidth}
\begin{figure}[tbp]
   \centering
   %name of your graphic, without the path AND in EPS format:
   \includegraphics[scale=0.4]{integration/beaudette/query_centers_2b}
   %caption of the figure
   \caption{Ajout d'un contexte \`a la carte et d'une \'echelle graphique.}
   %label of the figure, which has to correspond to \ref{}:
   \label{fig:example2}
\end{figure}

\subsubsection{Limitations actuelles}
L'approche actuelle par la console unix pour interfacer GRASS et GMT a plusieurs d\'esavantages : manque de portabilit\'e vers les syst\`emes non-unix, manque d'op\'erateurs math\'ematiques sophistiqu\'es, et une d\'ependance avec des outils plus utiles tels que \texttt{awk}, \texttt{sed}, \texttt{grep}, etc. Ces d\'esavantages sont particuli\`erement ennuyeux lors qu'on essaye d'automatiser la construction des \'el\'ements d'une carte tel que les intervalles ou les d\'ecorations bas\'es sur l'\'echelle. Les exemples dans cet article utilisent des intervalles d\'efinis manuellement, cependant lors de la cr\'eation de cartes \`a partir de GRASS (qui est habituellement dans un syst\`eme de coordonn\'ees projet\'e) cela prendre du temps de rajouter les intervalles annot\'es ou non pour chaque carte. Regardez le script \texttt{template.sh} inclus dans l'archive des donn\'ees d'\'echantilon pour avoir une id\'ee. Encore une fois, une int\'egration \'etroite avec GRASS via la liaison Python r\'esoudrait le probl\`eme ci-dessus. En attendant qu'un d\'eveloppement enti\`erement en Python soit termin\'e, l'estimation des intervalles automatiques peut \^etre simplifi\'ee avec le script perl suivant.

\begin{footnotesize}
\begin{verbatim}
#!/usr/bin/perl -w

# Le 1er argument est l'\'etendue maximale en unit\'e de la carte
# divis\'e par un nombre raisonable d'annotations par bord
$x = $ARGV[0] / 10;

print round_up($x) , "\n";

# arrondit \`a une \'echelle raisonable
# trouv\'e \`a :
# http://www.perlmonks.org/?node_id=599865

sub round_up {
  my $n = shift;
  my $scale = 10**int(log($n)/log(10));
  $n = 9 if $scale == 1; #magic for single digits
  if ($n > $scale) {
    $n = int($n/$scale+1)*$scale;
  }
  $n;
}
\end{verbatim}
\end{footnotesize}

% 
% recap, other examples, proposed system using GRASS Python bindings.
% 
\section{Conclusion}
Cet article r\'esume les conditions actuelles de conversion des donn\'ees GRASS au format GMT pour la production de carte Postscript de grandes qualit\'es. Bien que plusieurs mod\`eles et exemples existent pour automatiser ce processus, pour la production de cartes complexes de consid\'erables modifications sont n\'ecessaires par l'utilisateur. Apr\`es des progr\`es suffisants sur des projets comme l'interface de GRASS et la liaison Python, il pourrait \^etre possible de cr\'eer un syst\`eme plus complet pour am\'eliorer le processus de GRASS $\rightarrow$ GMT  Il y a actuellement un effort men\'e par Brent Wood pour r\'eviser le format vecteur de GMT qui pourrait simplifier le processus de cartographie th\'ematique avec GMT. De plus Brent est en train de travailler sur l'inclusion de la gestion en \'ecriture pour le format vecteur GMT dans OGR (GDAL). Une fois termin\'e, l'export vectoriel de GRASS vers GMT pourrait \^etre aussi simple que \texttt{v.out.ogr format=GMT}. Le travail propos\'e par Wolf Bergenheim, sur un algorithme g\'en\'eral de d\'etection et de correction de collision des \'etiquettes pour \texttt{v.label}, pourrait \^etre une excellente solution pour les t\^aches d'\'etiquettage \`a la fois dans GRASS et GMT. Nous verrons la prochaine fois un exemple plus en profondeur de cr\'eation d'une carte complexe en utilisant des donn\'ees de GRASS \`a partir de l'\'echantillon de donn\'ees Spearfish.

%\subsection{Resources}
%A collection of links to various tutorials, manual pages, and examples of interfacing GRASS and GMT.

%% how do we associate a link to a word?
%\begin{itemize}
%\item SSC 105 example map (\url{http://casoilresource.lawr.ucdavis.edu/drupal/node/102})
%\item Example map illustrating the use of GRASS point, line, CELL raster, and FCELL raster data. (\begin{small}(\url{http://169.237.35.250/~dylan/grass_user_group/map1.html})\end{small}) 
%\item Example used in Where 2.0 Conference (link to script)
%\item The Generic Mapping Tools Home Page (\begin{small}(\url{http://gmt.soest.hawaii.edu/})\end{small})
%\item GRASS Add-ons page
%\end{itemize}



% 
% might be good to acknowlage some people here: Hamish, David F. Brent Wood.
% 


% % Figures, usually in EPS (Encapsulated Postscript)
% to insert an image: ...
% the figure~\ref{fig:label_of_your_image} shows the structure 
% of the project ...
% 
% 
% %\setkeys{Gin}{width=1\textwidth}
% \begin{figure}[htbp]
%    \centering
%    %name of your graphic, without the path AND in EPS format:
%    \includegraphics[scale=0.8]{grasslogo_vector.eps}
%    %caption of the figure
%    \caption{this is the grass logo}
%    %label of the figure, which has to correspond to \ref{}:
%    \label{fig:label_of_your_image}
% \end{figure}
% 



% 
% \begin{footnotesize}
% \begin{thebibliography}{99}
% 
% \bibitem[Herborg et~al. (2003) Herborg, Bentley, Clare, Rushton]{herborg:2003} 
% L.M. Herborg, M.G. Bentley, A.S. Clare, S.P. Rushton (2003)
% \newblock The spread of the Chinese mitten crab (Eriocheir sinensis) in
% Europe; the predictive value of an historical data set.
% \newblock {\em Hydrobiologia} 503: 21-28.
% 
% 
% \end{thebibliography}
% \end{footnotesize}
% 

\address{Dylan Beaudette\\
  Universit\'ee de Californie \`a Davis\\
  \url{http://casoilresource.lawr.ucdavis.edu}\\
  \email{debeaudette AT ucdavis.edu}}

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: main_document.tex
%%% End: 

