%表題   GRPH2 図形処理上位パッケージ
%
%履歴
%\Drireki{
%         94/04/25 塩谷雅人 (5.z版)
%         95/03/01 塩谷雅人
%        }
%
%  \Dchapter{使用例 : 地図投影}
\Dchapterhead
\label{umpack}
\section{概要}

ここでは地図投影変換と関連して，UMPACK を用い海岸線や緯度・経度線を
描いたり，同時に等高線図やトーンによる塗りわけ，ベクトル場を
描く例を示す．
これらのデモプログラムは dcl-x.x/demo/grph2/umpack の中にあるので,
参考にしていただきたい.
\vspace{1em}

地図投影変換に関する詳しい記述は，「GRPH1」マニュアルを参照されたい;
また UMPACK に関しては「GRPH2」マニュアルを参照されたい．

\section{いろいろな地図投影法}

GRPH1 で扱える座標系としては，直角直線座標系，曲線座標系のほかに
14種類の地図投影座標系がある．
(標準ライブラリのENV2が正しく移植されていれば，コマンド{\tt dcltrf}
によってサポートされている座標系の番号，略号，名称を知ることができる．)
U座標を2次元V座標に変換するこれらの正規化変換を設定することによって，
地図座標系での描画が可能となる．
\vspace{1em}

次ページ以降の3ページには，
選択可能な地図投影変換を用いて，全球を表示した例を示す．
変換関数番号10から33までの14種類の投影法で海岸線情報と緯度・経度線が
描かれている．
第1ページ目では円筒図法の地図投影法を,  
第2ページ目では円錐図法の地図投影法を, 
第3ページ目では方位図法の地図投影法を用いて作画した. 
\newpage

\begin{center}
\Depsf[15cm]{umpack/umpk01_001.eps}\\
{\bf umpk01.f:page1}\\
\end{center}
\newpage

\begin{center}
\Depsf[15cm]{umpack/umpk01_002.eps}\\
{\bf umpk01.f:page2}\\
\end{center}
\newpage

\begin{center}
\Depsf[15cm]{umpack/umpk01_003.eps}\\
{\bf umpk01.f:page3}\\
\end{center}
\newpage

地図投影変換を設定するために必要なパラメータとしては，
{\bf ビューポート}, {\bf 相似変換パラメータ}，
{\bf 地図座標回転パラメータ}がある．
これらは{\tt SGSVPT}, {\tt SGSSIM}, {\tt SGSMPL}によって
設定する．
\vspace{1em}

{\bf ビューポート}は直角直線座標系の設定でも用いられていたように, 
V座標系上においてユーザーが見たい矩形領域である. 
ビューポートは, 矩形領域の左下と右上のすみのV座標値を指定する.
この例でもおこなっているように, 
{\tt SG}{\it p}{\tt GET/}{\tt SG}{\it p}{\tt SET} が管理する
内部変数{\tt 'LCLIP'}を{\tt .TRUE.}として
クリッピングをするように指定すると, この枠からはみ出した部分は
描画されない.
\vspace{1em}

{\bf 相似変換パラメータ}は拡大縮小と原点移動に関する指定をおこなう. 
地図投影座標系の関数は MATH1/MAPLIB の関数によって定義されている.
GRPH1 では, これらの関数が返す値に, {\tt SIMFAC}
({\tt SGSSIM}の最初の引数)を掛けてV座標系の値に変換し,
原点をビューポートの中心から{\tt (VXOFF,VYOFF)}
({\tt SGSSIM}の2, 3番めの引数)だけ平行移動した位置に設定する.
\vspace{1em}

{\bf 地図座標回転パラメータ}は地図投影をする前におこなう
緯度・経度座標の回転を指定する. 
{\tt (PLX,PLY)} ({\tt SGSMPL}の最初の2つの引数)は
投影座標の極をおく経度・緯度をU座標系で指定し, 
{\tt PLROT} ({\tt SGSMPL}の最後の引数)は投影座標の極の回りの
回転角を指定する. くわしくは「GRPH2マニュアル」を参照のこと. 
\vspace{1em}

このほかに，円錐図法による投影をおこなう場合は{\bf 標準緯度}を
設定しなければならない(これは 
{\tt SG}{\it p}{\tt GET/}{\tt SG}{\it p}{\tt SET}の管理する
内部変数{\tt 'STLAT1'}, {\tt 'STLAT2'}を設定する)．
また，ウインドウに関する情報は，地図投影変換そのものでは
用いられないが，GRPH2 で参照されることがある．
\vspace{1em}

変換関数番号が30 (正射図法)かどうかで条件判断している部分では，
この変換関数を用いて地球を投影したとき，裏と表の両面を書かないように
するために地図投影におけるクリッピング境界を他の投影法と変えている．
ふつうの投影法だと経度[--180,+180], 緯度[--90,+90]を
地図投影におけるクリッピング境界としておけばよいが
正射図法では片面だけを書かせるようにするために，緯度に関する
クリッピング境界を[0.0,+90]とする必要がある．
\vspace{1em}

これらのパラメータの指定は, 地図投影に関する十分な知識がないと
必ずしも容易ではないかも知れない. 次節では, 必要なパラメータのみ指定し,
ほかは適当に決めてくれるルーチン{\tt UMPFIT}を使用した例を示す. 
\vspace{1em}

{\tt SGTRNL}は変換関数番号から変換関数名を得るルーチンである. 
また, {\tt UMPMAP}は各種地図情報を描く;
{\tt UMPGLB}は緯度・経度線および地図の輪郭線を描く．
なお, {\tt UM}{\it p}{\tt GET/}{\tt UM}{\it p}{\tt SET}の
管理する内部変数{\tt 'LGRIDMN'}を{\tt .FALSE.}として
minor な緯度・経度線は描かないように指定した;
また major な緯度・経度線のラインインデクスを1とした
(くわしくは, 「GRPH2」マニュアルの UMPACK の章を参照されたい). 
{\tt UMPMAP}が描く地図情報としては世界の海岸線({\tt 'coast\_world'})を
指定している．
ほかに, {\tt UMPMAP}で指定できる地図情報としては, 
日本の海岸線({\tt 'coast\_japan'}), 
世界の国境({\tt 'border\_world'}), 
日本の県境({\tt 'pref\_japan'})などがある. 
\newpage

\Dproginput{umpack/umpk01.f}
\newpage

\section{変換パラメータの自動決定}

umpk01.f では相似変換パラメータや地図座標回転パラメータを
陽に指定したが, これらのパラメータを適切に決めるためには
地図投影に関する知識が必要である. 
\vspace{1em}

たいがいの場合は, ビューポートいっぱいに全球を描くか, 
ある地域を描くかのどちらかであろう.
%(以下では, それぞれ全球モード, 地域モードという.)
これら2つの用途を念頭において, {\tt UMPFIT}は地図投影に必要なパラメー
タを自動的に決定してくれる. 
{\tt UMPFIT}はGRPACKと組み合わせて用いる. 
つまり, GRPACKによって必要なパラメータを指定し, 
変換関数確定の直前に{\tt UMPFIT}を呼ぶことによって, 
ユーザーが指定しなかったパラメータを適当に補った上で,
{\tt GRSTRF}を呼んで変換関数を確定する. 
\vspace{1em}

umpk02.f は基本的には umpk01.f と同じような描画をおこなう
プログラムである. 
ただしここでは, ビューポートと変換関数番号を指定しただけで, 
相似変換パラメータと地図座標回転パラメータは指定していない. 
ウインドウ情報が指定されていないと, {\tt UMPFIT}は全球を描くべく
相似変換パラメータなどを決定して変換関数を確定する. 
(なお, 次の章ではウインドウを指定して, 一部地域を描く例を示す.)

\Dproginput{umpack/umpk02.f}
\newpage

\section{地域モード}
{\tt UMPFIT}とGRPACKを組み合わせて用いたとき, 緯度・経度に関する
ウインドウ情報が指定されていると, 
その領域をほぼ含むような一部地域を描画する
ような地図投影変換が設定される. 

\begin{center}
\Depsf[10cm]{umpack/umpk03.eps}\\
{\bf umpk03.f:page1}\\
\end{center}

umpk03.f ではウインドウ情報を指定し, {\tt UMPFIT}を呼んでいる. 
(この例ではメルカトールとコニカル2つの地図変換についてのみ示した.)
こうすると, ウインドウとして指定した緯度・経度の範囲がビューポート内に
ほぼ収まるように変換関数が設定される. 
\vspace{1em}

この例では, {\tt ISGTRC}によって変換関数の省略名から
変換関数番号を得ている. 
また major な緯度・経度線と minor な緯度・経度線の間隔を
それぞれ 10度, 2度としている. 
\vspace{1em}

またここでは, {\tt UMPMAP}が描く地図情報としては {\tt coast\_japan}が
利用可能であるが, 作画量が多いので{\tt coast\_world}を用いた. 
\newpage

\Dproginput{umpack/umpk03.f}
\newpage

\section{等高線図}

等高線図作画パッケージ UDPACK とトーンによる塗りわけパッケージ UEPACK 
はU座標系で作画するので, 地図投影変換を指定していても利用可能である. 

\begin{center}
\Depsf[10cm]{umpack/umpk04.eps}\\
{\bf umpk04.f:page1}\\
\end{center}

umpk04.f の基本構造は, 第\ref{udegpk}章のデモプログラム u2df05.f と
同じである. 
ただここでは, 変換関数として地図投影変換
(変換関数番号30:正射図法)を選んでいる. 
u2df05.f と同じ等高線とハッチが地図上で作画されているのがわかる. 
\newpage

\Dproginput{umpack/umpk04.f}
\newpage

\section{ベクトル場}

ベクトル場作画パッケージ UGPACK はV座標系上で作画するので, 
残念ながら, 現在のところ地図投影には対応していない. 
しかしながら, アローサブプリミティブを使って, 緯度・経度の単位を持った
矢印を地図上に描くことは簡単にできる. 
したがって, DO ループをもちい, 次元を持ったベクトルを連続的に描けば, 
地図上にベクトル場を描くことも容易に実現できる. 

\begin{center}
\Depsf[10cm]{umpack/umpk05.eps}\\
{\bf umpk05.f:page1}\\
\end{center}

umpk05.fのプログラムの骨組みは, 基本的に第\ref{udegpk}章の
デモプログラム u2df08.f と同じである. 
ベクトルの各成分を緯度・経度の単位でスケーリングしておけば, 
U座標系での矢印作画ルーチン{\tt SGLAZU}を用いて, 
地図上でのベクトル場の表現が可能になる. 
\vspace{1em}

\newpage
\Dproginput{umpack/umpk05.f}
