DCL:GRPH2:UMPACK : 地図投影ルーチン:概要
     
UMPACK は地図情報(海岸線や緯度経度線)を描くための描画ルーチンと     
地図投影変換のために必要なパラメータを適当に決めるコントロールルーチン     
からなる.     
     
     
     
UMPACK において ユーザーが使用するメソッド(元サブルーチン)としては以下のようなものがある.
    
umpfit は grfrm などによって未定義状態にされ,     
その後ユーザーが設定しなかった     
変換メソッド(元関数)に関するパラメタを適当に決定する.      
これらのパラメタで変換メソッド(元関数)を確定するには,     
grstrf を呼ばなければならない.     
     
     
     
地図投影に必要なパラメータがすべて設定されているとき, umpfit はなにもしない. いっぽう, 地図投影に必要なパラメータが1つでも設定されていないとき, umpfit はすでに設定された情報から, 適切なパラメタを決定しようと試みる. umpfit の動作は大きく分けて以下の2段階からなる.
- 1:
- 地図投影の極 (PLX, PLY, PLROT)を決める.
- 2:
- 指定された点, および範囲が全て入るように, 相似変換パラメタ(simfac, vxoff, vyoff) を調節する.
     
すなわち, まず地図投影の中心となるべき点を定め,      
後は拡大/縮小および平行移動で必要な範囲を図に収める.     
     
     
     
     
この地図投影の中心となるべき点のことをパッケージでは「接点」と呼ぶ.      
円筒図法および円錐図法においては, 球と投影面は線で接しているが,      
この接線と中央経線の交点を「接点」とする.     
方位図法における「接点」は地図投影の極と同義である.     
これは地図学上の正確な言葉ではないが,      
通常もっとも歪みの少ない中心となるべき点を表わす全ての図法共通の用語     
として「接点」という言葉を使うことにする.     
     
     
     
umpfit の第一段階は, この「接点」を求めることである. このために使われる情報の優先順位は以下の通りである.
優先順位の高い情報が指定されていれば, それ以下の情報は無視される.
- 1:
- SGSMPL による極の指定.
- 2:
- UMSCNT による接点の指定.
- 3:
- UMSCWD による円形ウィンドウの指定.
- 4:
- SGSWND による矩形ウィンドウの指定.
- 5:
- UMSPNT による描画点指定.
- 6:
- デフォルト値 (PLX=0, PLY=90)
メルカトル図法: 南緯75ºから北緯75º ポーラーステレオ図法: 赤道から北極 ランベルト正角円錐図法: 赤道から北極 
    
なお, ビューポートのパラメタvxmin, vxmax, vymin,      
vymaxの一部または全部が指定されていなかった場合には,      
まず, 最大描画範囲に指定された範囲が最大内接するようにスケーリングされ,     
さらに指定された範囲が描画できる最小のビューポートを設定する.     
     
     
     
UMPACK では同じ結果を得る複数のコーディングが可能であるが, 標準的な使用法を以下に示す.
      CALL grfrm
      NumRu::DCL.grstrn(itr)
      NumRu::DCL.grswnd(uxmin,uxmax,uymin,uymax)
      CALL umpfit
      CALL grstrf    
      CALL grfrm
      NumRu::DCL.grstrn(itr)
      NumRu::DCL.umscwd(xcntr,ycntr,r)
      CALL umpfit
      CALL grstrf       
    uxc, uyc は地図の中心になる緯度経度で, この点を中心に     
    半径R (角度) の範囲が描画される.    
     
    
      CALL grfrm
      NumRu::DCL.grstrn(itr)
      NumRu::DCL.umscnt(xcnt,ycnt,rot)
      NumRu::DCL.umlset(cp,lpara)
      CALL umpfit
      CALL grstrf  
     uxc は中央経線となる経度.     
     
      CALL grfrm
      NumRu::DCL.grstrn(itr)
      NumRu::DCL.umscnt(xcnt,ycnt,rot)
      NumRu::DCL.umlset(cp,lpara)
      CALL umpfit
      CALL grstrf