%%
%% This is file `pst-map2d.tex',
%%
%% IMPORTANT NOTICE:
%%
%% Package `pst-map2d.tex'
%%
%% Manuel Luque <Mluque5130@aol.com> (France)
%% Giuseppe Matarazzo <joematara@hotmail.com> (Italy)
%% Herbert Voss <voss@perce.de> (Germany)
%%
%% May 09, 2004
%%
%% This program can be redistributed and/or modified under the terms
%% of the LaTeX Project Public License Distributed from CTAN archives
%% in directory macros/latex/base/lppl.txt.
%%
%% DESCRIPTION:
%%   `pst-map2d' is a PSTricks package to create geographical objects
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\fileversion{1.05}
\def\filedate{2004/05/10}

\message{`PST-map2d' v\fileversion, \filedate\space (ML/GM/HV)}

\csname PSTMaptwod\endcsname
\let\PSTMaptwodLoaded\endinput

% Require PSTricks
\ifx\PSTricksLoaded\endinput\else\input pstricks.tex\fi
\ifx\PSTnodesLoaded\endinput\else\input pst-node.tex\fi
% David Carlisle interface to the `keyval' package.
\input pst-key.tex
%
\edef\PstAtCode{\the\catcode`\@} \catcode`\@=11\relax

\SpecialCoor
%
\define@key{psset}{path}{\edef\psk@WorldMap@Path{#1}} % chemin des données
\setkeys{psset}{path=data}
%\openin1=chemin.txt
%\read1 to \psk@WorldMap@Path
%
\define@key{psset}{level}{\edef\psk@WorldMap@level{#1}}
\setkeys{psset}{level=1}
%
\define@key{psset}{type}{\edef\psk@WorldMap@type{#1}}
\setkeys{psset}{type=1}
% type=1 ==> Mercator
% type=2 ==> Lambert
% type=3 ==> simple
% type=4 ==> Sanson-Flamsteed
% type=5 ==> cylindrical
% type=6 ==> Babinet
% type=7 ==> Collignon
% type=8 ==> Bonne
\define@key{psset}{n}{\edef\psk@WorldMap@n{#1}}
\setkeys{psset}{n=1.77245} % sqrt(pi) % pour Collignon
%
\define@key{psset}{limiteL}{\edef\psk@WorldMap@limiteL{#1}}
\setkeys{psset}{limiteL=180} % longitude limite
%
\define@key{psset}{latitude0}{\edef\psk@WorldMap@latitudeO{#1}}
\setkeys{psset}{latitude0=45}  % pour Bonne latitude 0
%
\define@key{psset}{longitude0}{\edef\psk@WorldMap@longitudeO{#1}}
\setkeys{psset}{longitude0=0}  % pour Bonne longitude 0
%
\define@key{psset}{increment}{\edef\psk@WorldMap@increment{#1}}
\setkeys{psset}{increment=10}
%
\define@key{psset}{MapFillColor}{\edef\psk@WorldMap@Fillcolor{#1}} % couleur des continents
\setkeys{psset}{MapFillColor= 0.99 0.95 0.7 }
%
\newif\ifPst@WorldMap@capitals
\define@key{psset}{capital}[false]{\@nameuse{Pst@WorldMap@capitals#1}}
\setkeys{psset}{capital=false}
%
\newif\ifPst@WorldMap@city
\define@key{psset}{city}[false]{\@nameuse{Pst@WorldMap@city#1}}
\setkeys{psset}{city=false}
%
\newif\ifPst@WorldMap@Rivers
\define@key{psset}{rivers}[true]{\@nameuse{Pst@WorldMap@Rivers#1}}
\setkeys{psset}{rivers=true}
%
\newif\ifPst@WorldMap@Borders
\define@key{psset}{borders}[true]{\@nameuse{Pst@WorldMap@Borders#1}}
\setkeys{psset}{borders=false}
%
\newif\ifPst@WorldMap@maillage
\define@key{psset}{maillage}[true]{\@nameuse{Pst@WorldMap@maillage#1}}
\setkeys{psset}{maillage=true}
%
\newif\ifPst@WorldMap@Fill
\define@key{psset}{Fill}[true]{\@nameuse{Pst@WorldMap@Fill#1}}
\setkeys{psset}{Fill=true}
%
\newif\ifPst@WorldMap@USA
\define@key{psset}{USA}[false]{\@nameuse{Pst@WorldMap@USA#1}}
\setkeys{psset}{USA=false}
%
\newif\ifPst@WorldMap@AUS
\define@key{psset}{AUS}[false]{\@nameuse{Pst@WorldMap@AUS#1}}
\setkeys{psset}{AUS=false}
%
\newif\ifPst@WorldMap@MEX
\define@key{psset}{MEX}[false]{\@nameuse{Pst@WorldMap@MEX#1}}
\setkeys{psset}{MEX=false}
%
\def\VariablesMap{%
  /Coeff_mercatorY {2 div 45 add dup sin exch cos div ln 57.2958 mul} def % Mercator
  /Coeff_simpleY {1 mul} def % simple
  /Coeff_lambertY {sin 57.2958 mul} def % Lambert
  /Coeff_sanson_flamsteedY {1 mul} def % Sanson_Flamstead
  /Coeff_cylindricalY { dup sin exch cos div 57.2958 mul} def % Cylindrical
  /Coeff_babinetY { sin 2 sqrt mul 57.2958 mul} def % Babinet
  /n \psk@WorldMap@n\space def
  /Coeff_collignonY { 0 ge { 1 2 sqrt 90 Y sub 2 div sin mul sub 57.2958 mul n mul}
     { 1 2 sqrt 90 Y add 2 div sin mul sub 57.2958 mul n mul neg} ifelse }def % Collignon
  /Coeff_BonneY {pop /RHO l0 dup cos exch sin div Y neg l0 add 57.2958 div add def
    /Theta Y cos X L0 sub mul RHO div def
    Theta cos RHO mul neg 57.2958 mul}def % Bonne
%
  /Coeff_mercatorX {1 mul} def % Mercator
  /Coeff_simpleX {1 mul} def % simple
  /Coeff_lambertX {1 mul} def % Lambert
  /Coeff_sanson_flamsteedX {Y cos mul} def % Sanson_Flamstead
  /Coeff_cylindricalX { 1 mul } def % Cylindrical
  /Coeff_babinetX { 2 mul 2 sqrt mul 3.1415926 div Y cos mul} def % Babinet
  /Coeff_collignonX { 2 mul 2 sqrt mul 90 Y abs sub 2 div sin mul n div} def % Collignon
  /l0 \psk@WorldMap@latitudeO\space def
  /L0 \psk@WorldMap@longitudeO\space def
  /Coeff_BonneX { pop /RHO l0 dup cos exch sin div Y neg l0 add 57.2958 div add def
    /Theta Y cos X L0 sub mul RHO div def
    Theta sin RHO mul 57.2958 mul } def % Bonne
  \ifcase\psk@WorldMap@type\or
    /CoeffY {Coeff_mercatorY} def
    /CoeffX {Coeff_mercatorX} def
    /StartY -85 def
  \or
    /CoeffY {Coeff_simpleY} def
    /CoeffX {Coeff_simpleX} def
    /StartY -90 def
  \or
    /CoeffY {Coeff_lambertY} def
    /CoeffX {Coeff_lambertX} def
    /StartY -90 def
  \or
    /CoeffY {Coeff_sanson_flamsteedY} def
    /CoeffX {Coeff_sanson_flamsteedX} def
    /StartY -90 def
  \or
    /CoeffY {Coeff_cylindricalY} def
    /CoeffX {Coeff_cylindricalX} def
    /StartY -85 def
  \or
    /CoeffY {Coeff_babinetY} def
    /CoeffX {Coeff_babinetX} def
    /StartY -90 def
  \or
    /CoeffY {Coeff_collignonY} def
    /CoeffX {Coeff_collignonX} def
    /StartY -90 def
  \or
    /CoeffY {Coeff_BonneY} def
    /CoeffX {Coeff_BonneX} def
    /StartY -90 def
  \fi%
  /step \psk@WorldMap@level\space def % hv 2004-05-04
}
\newcount\TypeProjection
\def\WorldMap{\pst@object{WorldMap}}
\def\WorldMap@i{\@ifnextchar[{\WorldMap@do}{\WorldMap@do[]}}
\def\WorldMap@do[#1]{{%
  \setkeys{psset}{#1}%
  \begin@ClosedObj
  \addto@pscode{%
    \VariablesMap
    (\psk@WorldMap@Path/river.dat) run
    (\psk@WorldMap@Path/pcoast.dat) run
    (\psk@WorldMap@Path/pisland.dat) run
    (\psk@WorldMap@Path/pborder.dat) run
    (\psk@WorldMap@Path/plake.dat) run
    (\psk@WorldMap@Path/usa.dat) run
    (\psk@WorldMap@Path/aus.dat) run
    (\psk@WorldMap@Path/mex.dat) run
    1 setlinejoin
    0 0 translate
    /xunit {\pst@number\psxunit\space mul 20 div }def
    /yunit {\pst@number\psyunit\space mul 20 div }def
    /increment \psk@WorldMap@increment\space def
    /limiteLongitude \psk@WorldMap@limiteL\space def
%
    \ifPst@WorldMap@Fill
      gsave
      newpath
      /X limiteLongitude neg def
      /Y StartY def
      X CoeffX xunit Y CoeffY yunit moveto
      StartY 2 StartY neg {%
        /Y exch def
        X CoeffX xunit Y CoeffY yunit lineto
      } for
     /X limiteLongitude def
     StartY neg -2 StartY {
       /Y exch def
       X CoeffX xunit Y CoeffY yunit lineto
     } for
     closepath
     /Color {0.5 0.8 0.8} def
     Color setrgbcolor
     fill
    grestore
  \fi
  /CalculsPoints {
    /region exch def
    newpath
    /nbr region length def % nombre de régions
    region 0 get aload pop
    /Y exch def /X exch def
    X CoeffX xunit Y CoeffY yunit moveto
    /ncount 0 def % hv 2004-05-04
    0 1 nbr 1 sub {
      /ncount ncount 1 add def % hv 2004-05-04
      region exch get aload pop
      ncount step mod 0 eq nbr ncount sub 0 lt or { % hv 2004-05-04
        /Y exch def /X exch def
        X CoeffX xunit Y CoeffY yunit lineto
      }{ pop pop } ifelse % hv 2004-05-04
    } for
  } def
%
  /Draw { {
    CalculsPoints
    \ifPst@WorldMap@Fill
      closepath
% Colour in earth's surfaces
      gsave
      Color setrgbcolor
      fill
      grestore
    \fi
    stroke
  } forall
  } def
\ifPst@WorldMap@Borders
  border
\else
  coasts
\fi
%/Color {0.5 0.8 0.5} def
/Color {\psk@WorldMap@Fillcolor} def
    Draw
islands
    Draw
\ifPst@WorldMap@MEX
mexico
    Draw
\fi
\ifPst@WorldMap@USA
usa
    Draw
\fi
\ifPst@WorldMap@AUS
australia
    Draw
\fi
/Color {0.5 0.8 0.8} def
lake
    Draw
% les rivières
\ifPst@WorldMap@Rivers
/DrawRivers {
    {
CalculsPoints
0 0 1 setrgbcolor
stroke
} forall
}def
river
DrawRivers
\fi
%
\ifPst@WorldMap@maillage
% meridiens
limiteLongitude neg increment limiteLongitude {% for X
    /X exch def
    newpath
    /Y StartY def
     X CoeffX xunit StartY CoeffY yunit moveto
StartY increment 10 div StartY neg { % for Y
    /Y exch def
    X CoeffX xunit Y CoeffY yunit lineto
} for
gsave
% 11 janvier 2004
X 0 eq {1 0 0 setrgbcolor}{0.2 setgray} ifelse
%
0.25 setlinewidth
stroke
grestore
} for
% parallèles
StartY increment StartY neg {% for Y
    /Y exch def
newpath
    /X limiteLongitude neg def
     X CoeffX xunit Y CoeffY yunit moveto
limiteLongitude neg increment 10 div limiteLongitude { % for X
    /X exch def
    X CoeffX xunit Y CoeffY yunit lineto
} for
% 11 janvier 2004
Y 0 eq {1 0 0 setrgbcolor}{0.2 setgray} ifelse
%
0.25 setlinewidth
stroke
} for
\fi
/DrawCitys {
/CITY exch def
/Rayon exch def
/nbr CITY length def % nombre de villes
0 1 nbr 1 sub {
  /compteur exch def
  CITY compteur get aload pop
  /X exch def /Y exch def
   gsave
   1 0 0 setrgbcolor newpath
   X CoeffX xunit Y CoeffY yunit
   Rayon 0 360 arc closepath fill
   grestore
} for
} def
\ifPst@WorldMap@city
% les capitales
  (\psk@WorldMap@Path/c-cap.dat) run
  1.5 % rayon du point
  citycapitals
  DrawCitys
% les autres villes
  (\psk@WorldMap@Path/c-sub.dat) run
  0.5 % rayon du point
  CitySub
DrawCitys
\fi
\ifPst@WorldMap@capitals
% les capitales
  (\psk@WorldMap@Path/c-cap.dat) run
  1.5
  citycapitals
  DrawCitys
\fi
}%
\end@ClosedObj
}}
%
\def\pnodeMap(#1,#2)#3{%   hv 2004-05-09
  \pst@killglue
  \pnode(!
      \VariablesMap
      /Y #2 def
      /X #1 def
      X CoeffX 20 div Y CoeffY 20 div){#3}%
}
%
%------------------- hv 2004-05-08 ----------------------
\def\psNodeLabelStyle{}
\define@key{psset}{mapCountry}{\edef\psk@WorldMap@mapCountry{#1}}
\setkeys{psset}{mapCountry=all}
\define@key{psset}{nodeWidth}{\edef\psk@WorldMap@nodeWidth{#1}}
\setkeys{psset}{nodeWidth=1mm}
\newpsstyle{psNodeMapStyle}{fillstyle=solid,fillcolor=red}
%
\def\mapput{\@ifnextchar[{\mapput@i}{\mapput@i[90]}}
\def\mapput@i[#1](#2,#3){\@ifnextchar[{\mapput@iii[#1](#2,#3)}{\mapput@ii[#1](#2,#3)}}
\def\mapput@ii[#1](#2,#3)#4{\mapput@iii[#1](#2,#3)[#4]{#4}}
\def\mapput@iii[#1](#2,#3)[#4]#5{%
  \@ifnextchar[{\mapput@iv[#1](#2,#3)[#4]#5}{\mapput@iv[#1](#2,#3)[#4]#5[\@empty]}}
\def\mapput@iv[#1](#2,#3)[#4]#5[#6]{{%
% [angle](longitude,lattitude)[node name]{node label}[country]
  \def\pst@tempb{all}
  \ifx\pst@tempb\psk@WorldMap@mapCountry
    \mapput@v[#1](#2,#3)[#4]{#5}
  \else
    \def\pst@tempb{#6}
%    \typeout{Compare \pst@tempb{} with \psk@WorldMap@mapCountry}
    \ifx\pst@tempb\psk@WorldMap@mapCountry
      \mapput@v[#1](#2,#3)[#4]{#5}
    \fi%
  \fi%
}}
\def\mapput@v[#1](#2,#3)[#4]#5{{%
  \pnodeMap(#2,#3){#4}
%  \typeout{Node: #4}
  \pst@dima=\psk@WorldMap@nodeWidth
  \pscircle[style=psNodeMapStyle](#4){\pst@dima}
  \pscircle*(#4){0.5\pst@dima}
  \uput{1.2\pst@dima}[#1](#4){{\psNodeLabelStyle #5}}%
}}
%------------------- hv 2004-05-08 ----------------------
%
\catcode`\@=\PstAtCode\relax
\endinput
