データ変換

このセクションでは、座標系の定義に必要な基本操作を示す簡単な例をベースに、座標の順変換と逆変換の使い方について説明します。
このセクションで基本としている例のコード一式は、以下のファイルにあります。

例の概要

Sample1.java ファイルには、メルカトル図法を使用して座標を地理座標から投影座標系に変換する方法を示す非常にシンプルなプログラムが含まれています。
このクラスには、座標系をインスタンス化し、座標を変換する静的な main() メソッドのみがあります。

ソース座標系とターゲット座標系の選択

この例では座標系と変換を使用するため、メルカトル図法の定義用の投影図法パッケージと、関連パッケージをインポートする必要があります。
import ilog.views.maps.*;
import ilog.views.maps.srs.coordsys.*;
import ilog.views.maps.srs.coordtrans.*;
import ilog.views.maps.projection.*;
最初の重要な手順は、ソース座標系とターゲット座標系の定義です。
ソース座標系では、緯度と経度を度数で表す必要があります。これは地理座標系に定義されている座標の種類です。この例では、WGS84 座標が使用されています。WGS84 地理座標系では、標準の WGS84 楕円体上の楕円体座標を定義します。
IlvCoordinateSystem sourceCS = IlvGeographicCoordinateSystem.WGS84;
これらの座標はメルカトル座標に変更します。その後、メルカトル図法で新しい投影座標を作成して座標を描きます。メルカトル図法は、WGS84 地理座標と正確に同じ測地パラメーターを使用する必要があります。後者は、投影された座標系の地理座標系として渡されます。
IlvCoordinateSystem targetCS = 
   new IlvProjectedCoordinateSystem("Mercator",
                                    IlvGeographicCoordinateSystem.WGS84,
                             new IlvMercatorProjection(),
                             IlvLinearUnit.METER,
                             "X",   // The X axis name
                             "Y");  // The Y axis name

座標の変換

座標を変換するためには IlvCoordinateTransformation が必要です。これは自動変換作成メソッドを呼び出して実行します。
IlvCoordinateTransformation CT =
      IlvCoordinateTransformation.CreateTransformation(sourceCS, targetCS);
座標を変換するには、 IlvCoordinate に座標を保存してから、座標変換の transform() メソッドを呼び出すだけです。
// The coordinate to convert : 45W, 30N
IlvCoordinate coord = new IlvCoordinate(-45D, 30D);
   
try {
   coord = CT.transform(coord,
                        coord); // put the result in coord
}
catch (IlvCoordinateTransformationException e) {
   System.out.println("Transformation exception for this data");
}
transform() メソッドは 2 つのパラメーターを使用します。1 番目のパラメーターは変換するソース座標で、2 番目のパラメーターは、変換の結果を保持する IlvCoordinate です。2 番目のパラメーターが null の場合は、新しい IlvCoordinate が割り振られて使用されます。 このメソッドでは変換後の座標を返します。
もちろん、この例のように、ソース座標系およびターゲット座標系で同じ IlvCoordinate を使用することもできます。
変換プロセスで数学的エラーが発生したり、オーバーフローした場合、IlvCoordinateTransformation.transform() メソッドは、さまざまな例外をスローする可能性があります。ほとんどの場合、これらのメソッドを実行すると、変換は特定の場所で定義されません。

結果の表示

ここで変換結果が coord 変数に格納されます。以下のコード例では、結果はデフォルトの測定単位のメートルで表されています。
System.out.println("The Mercator coordinates of 45W 30N is ");
System.out.println("x = " + (int) coord.x + " m");
System.out.println("y = " + (int) coord.y + " m");
メモ
投影図法の中心が投影ポイントから離れており、投影図法は大縮尺で距離を保持しないため、これらの値を距離と解釈してもあまり意味がありません。

逆変換の取得

ここでは、地理座標をメルカトル座標に変換する方法を利用できます。
メルカトル座標から地理的座標に変換し戻すには、逆変換がある場合にその逆変換を返す getInverse メソッドを使用します。
// Get the inverse transformation.
IlvCoordinateTransformation invCT = CT.getInverse();

// Transform the point.
try {
  coord = invCT.transform(coord,
                          coord); // put the result in coord
}
catch (IlvCoordinateTransformationException e) {
  System.out.println("TransformationException exception for this data");
}

地理座標の印刷

地理座標を印刷するために、 IlvAngularUnit クラスから toDMS 変換メソッドを使用することができます。このメソッドは、ある単位の double 値で指定した角度を DMS エンコードに変換します。
例えば、IlvAngularUnit.DEGREE.toDMS() は、度数で指定した角度を DMS に変換します。
System.out.println("The inverse projection is " 
                + IlvAngularUnit.DEGREE.toDMS(coord.x,false) 
                + " "
                + IlvAngularUnit.DEGREE.toDMS(coord.y,true));