2次元のユーザー座標系には表のような種類があり, その中から関数番号で指定する (略号, または名称から関数番号を返す関数も用意されている). 各座標系は, その種類によって正規化変換に必要なパラメータが異なる.
DCLでは地図投影座標も普通のユーザー座標系の一つとして扱われる. 地図投影法には実にさまざまな種類があり, すべてを解説するためには1冊の本が必要であるが, ここではDCLを利用するために知っておくべき基本的事柄を解説する. なお, 地図学の詳しい解説は 野村 正七 著 「地図投影法」 などを参考にされたい (ただし, この本は絶版).
地図投影法は基本的に「球面を何らかの方法で2次元平面に投影する」方法である. 実際の地球は完全な球面ではなく回転楕円体に近いので, 厳密な地図投影を行なうためには回転楕円体の表面を平面に投影しなければならない. しかし, DCLでは回転楕円体からの投影ではなく, 球面からの投影のみをサポートする. なお, 投影された図形は投影法によっては3次元的な雰囲気を持つが, 地図投影座標はあくまでも2次元座標であることに注意されたい.
地図投影の多くの図法では幾何学的な方法で球面から平面に投影される. その際の平面の形状によって次のようにいくつかの図法に分類される.
円筒図法 | 地球儀をこれに接する円筒の中に位置付け, 何らかの方法で経緯線を円筒に投影して, 展開する図法. |
円錐図法 | 地球儀をこれに接する直円錐の中に位置付け, 何らかの方法で経緯線を円錐に投影して, 展開する図法. |
方位図法 | 地球儀上の一点でこれに接する平面を設定し, 何らかの方法で経緯線をこの平面に投影する図法. |
便宜図法 | 上記以外の図法. |
これらの円筒や円錐の軸, または方位図法における接点からの垂線が
地球の自転軸と一致するものを正軸法,
直交するものを横軸法, 斜めに交わるものを斜軸法と呼ぶ.
一般に, 円筒図法は全球の表示に向いており,
円錐図法は中緯度の表示に向いている.
地図投影では球面を平面に投影するため, どうしてもひずみが生じてしまう. そこで, 多くの図法では 面積 または 角度 のどちらかが 保存されるように工夫されている. 原理的に, この二つを同時に保存するような投影は不可能である. この様な保存性に関する性質によって次のように分類される.
正積図法 | 地図上のどこでも面積関係が正しく表現される図法. |
正角図法 | 地図上のどこでも局所的な角度が正しく表現される図法. |
正距図法 | 経線, 緯線または方位線上で, 長さが正しく表現される 図法. |
DCLでは以下のような地図投影がサポートされる.
番号 | 図 法 | 正積 | 正角 | 正距 |
10 | 正距円筒図法 | × | × | 経線 |
11 | メルカトール図法 | × | ○ | × |
12 | モルワイデ図法 | ○ | × | × |
13 | ハンメル図法 | ○ | × | × |
14 | エッケルト第6図法 | ○ | × | × |
15 | 北田楕円図法 | ○ | × | × |
番号 | 図 法 | 正積 | 正角 | 正距 |
20 | 正距円錐図法 | × | × | 経線 |
21 | ランベルト正積円錐図法 | ○ | × | × |
22 | ランベルト正角円錐図法 | × | ○ | × |
23 | ボンヌ図法 | ○ | × | × |
番号 | 図 法 | 正積 | 正角 | 正距 |
30 | 正射図法 | × | × | × |
31 | ポーラーステレオ図法 | × | ○ | × |
32 | 正距方位図法 | × | × | 方位線 |
33 | ランベルト正積方位図法 | ○ | × | × |
ハンメル図法は地図学上,
ランベルト正積方位図法の変種として方位図法に分類されるが,
その形状や用途はむしろ円筒図法に近いので,
ここでは便宜的に円筒図法に分類する.
これらの図法すべてについて, 正軸法, 横軸方, 斜軸法が可能である.
なお, 普通の地図投影法には含まれないが, 正射図法の変形として人工衛星から眺めたような投影法 (Satellite View) もサポートされている. 普通の正射図法は地球儀を無限遠から眺めたような投影になっているが, これを有限の位置から眺めたような投影に変形したものである.
上記のユーザー座標を2次元正規座標に変換する正規変換に必要なパラメータには 以下のものがある. これらは内部変数を管理するルーチン DclGetParm/DclSetParmにより 一つずつ設定/参照できるが, 同種のパラメータをまとめて設定するユーティリティーも用意されている.
( VXMIN, VXMAX, VYMIN, VYMAX )
ビューポートを指定するパラメタは, すべての変換に共通で必須である.
ビューポートとは, 通常座標軸が描かれる矩形の枠である.
クリッピングをするように指定すると, この枠からはみ出した部分は
描画されない.
ビューポートを指定するには, その左下と右上の角の正規座標系における座標値
を指定する.
これらのパラメータは DclSetViewport/DclGetViewport によって 設定/参照できる.
( UXMIN, UXMAX, UYMIN, UYMAX )
ウインドウは直角直線座標系を設定するのに必要なパラメタである.
これは, ビューポートに対応する座標値をユーザー座標系の値で指定する.
地図投影座標系の場合には, 「注目している緯度経度範囲」という意味で 参照する場合がある. この場合には, 一般にビューポートとウインドウは一致しない.
これらのパラメータは DclSetWindow/DclGetWindow によって 設定/参照できる.
( SIMFAC, VXOFF, VYOFF )
直交曲線座標系および地図投影変換の場合の,
相似変換 (拡大縮小と原点移動) のパラメタ.
(直交曲線座標系の関数は 座標変換(CTRLIB),
地図投影座標系の関数は 地図投影変換(MAPLIB) の関数によって定義されている. )
正規変換のルーチンでは, これらの関数が返す値に, SIMFAC を掛けて
正規座標系の値に変換し,
原点をビューポートの中心から (VXOFF, VYOFF) 平行移動した位置に
設定する.
これらのパラメータは DclSetSimilarity/DclGetSimilarity によって 設定/参照できる.
( PLX, PLY, PLROT )
地図投影変換は常に経度範囲 [-180°, 180°] 緯度範囲 [-90°, 90°]
に対して行なわれるので,
任意の視点からの投影を行なうためには,
地図投影を行なう前に緯度経度座標を回転させておく必要がある.
(PLX, PLY) は投影座標の極をおく経度・緯度(ユーザー座標系)を
指定し, PLROT は投影座標の極の回りの回転角を指定する.
これらのパラメタと, 一般に3次元の回転角を指定するのに使われる
「オイラーの角(θ,φ,ψ)」 との関係は,
θ=π/2-PLY, φ=PLX, ψ=PLROT である.
(オイラーの角の意味については, 数学辞典などを参照のこと.)
これらのパラメータは DclSetMapProjectionAngle/DclGetMapProjectionAngle
によって設定/参照できる.
実際の操作としては, ユーザー座標系(UC)と投影座標系(TC)が 一致している状態を初期状態として,
となる.
TC から正規座標系(VC)への変換は上記の相似変換パラメタによって 決められる. その際地図投影のタイプによって VC 原点に投影される TC の値が異なる.
図 法 | 原点に投影される TC |
円筒図法 | (0, 0) |
方位図法 | (90, 0) |
円錐図法 | 円錐の頂点 |
原点に投影されるこれら TC の値は, オイラーの角を (0,0,0)
と
したとき, すなわち
(PLX,PLY,PLROT)=(λ,90.,0) と
した場合に対応する.
通常の円筒図法や円錐図法 (正軸法) で,
経度λの経線を中央経線とするには,
(PLX,PLY)=(λ,90.,0) とする.
方位図法において, 経度・緯度
(λ,φ) を中心とした
地図を描くには, (PLX,PLY)=(λ,φ) とし,
必要に応じて PLROT を指定する
PLROT=0 の時,
必ずユーザー座標系の南極が原点の下になる.
横軸法の円筒図法などでは, (PLX,PLY)として赤道上の点を 指定する. PLROT=0 の時, ユーザー座標系の南極が中央経線上に投影される. 例えば, 北極海, 大西洋, 南極環海を一つながりの海として 横軸法で表すには, (PLX, PLY, PLROT) = (60.,0.,-90.) とする.
( STLAT1, STLAT2 )
円錐図法の投影では上記のパラメタ以外に,
標準緯度が必要である.
ランベルト正角円錐図法は標準緯線が二つあるので,
STLAT2 も指定しなければならないが,
その他の円錐図法は STLAT1 の値のみを使う.
これらのパラメータは DclSetParm/DclGetParm によって 設定/参照できる.
( RSAT )
正射図法は本来, 無限遠から地球を眺めたような投影法であるが,
オプションとして有限の位置にいる衛星から眺めたような投影
(Satellite View) が可能である.
正射図法でこのオプションを選択するには,
RSAT を 1 以上の値に設定する.
RSAT は, 地球半径を 1 とした時の「衛星の軌道半径」である.
ユーザー座標系で描画するためには, DclNewFrame を呼んだ後でかつ描画をはじめる前に 変換関数を決めるパラメータを指定しておかなければならない. 指定すべきパラメータは座標系によって異なるが, 主要なパラメタはすべて DclGetParm/DclSetParmによって管理されている. ただし, DclGetParm/DclSetParmは単に掲示版の役目をしているだけなので, 設定したパラメタの値は, 変換関数を確定するルーチン DclSetTransFunction を呼ぶことで有効になる. 変換関数のパラメタを1つ1つ設定するのは面倒なので, まとめてパラメタを設定するルーチンが用意されており, 普通はそちらを使ってパラメタの設定を行なう.
具体的に変換パラメタを設定するにはDclNewFrame のあとで次のように コーディングする.
直角座標系
call DclSetViewport(vxmin, vxmax, vymin, vymax) call DclSetWindow(uxmin, uxmax, uymin, uymax) call DclSetTransNumber(itr) call DclSetTransFunction
直交座標系
call DclSetViewport(vxmin, vxmax, vymin, vymax) call DclSetSimilarity(simfac, xoff, yoff) call DclSetTransNumber(itr) call DclSetTransFunction
地図座標系
call DclSetViewport(vxmin, vxmax, vymin, vymax) call DclSetSimilarity(simfac, xoff, yoff) call DclSetMapProjectionAngle(plx, ply, plrot) call DclSetTransNumber(itr) call DclSetTransFunction
円錐投影の場合は, これ以外に DclSetParm によって標準緯線の緯度
(STLAT1, STLAT2) を与えておく必要がある.
これらのパラメタは 変換関数を確定するルーチン DclSetTransFunction が 呼ばれる前であれば, どのような順番で指定しても構わない. 変換関数名または略号を指定して, 変換関数番号を返す関数も用意されている.