このセクションでは、ランベルト正積方位図法で投影した米国の地図をマネージャーにローディングし、地図の上部に都市を追加する例に基づいて説明します。マウス・ポインターで示した地理座標と都市の名前は、ウィンドウ下部のテキスト・フィールドに表示されます。また、このセクションでは、投影座標系のインスタンス化とパラメーター化についても紹介し、データを地理座標から投影座標系に変換する方法、およびビュー・インタラクターの使い方について説明します。
この例のソース・コード一式は、以下のファイルにあります。
メモ
この例の目的は、座標変換の使用法についてのチュートリアルを提供することです。これは JViews Maps Bean ( IlvJMouseCoordinateViewer など) を使用せずに、データ・ソースの統合や地図レイヤー管理を行います。
座標系の初期化
地理座標から投影座標に、またその逆に変換するため、これらの変換のインスタンスを保持する必要があります。これは、
createTransformations()
メソッドによって実行されます。まず、インポートした地図の座標系で使用した投影図法のインスタンスを初期化します。この例では、
usa.ivl
ファイルは、ランベルト正積方位図法です。投影パラメーターは次のとおりです。
投影図法の名前 |
ランベルト正積方位図法 |
中央子午線 |
100DW |
中央緯線 |
40DN |
測定単位 |
メートル (デフォルト値) |
オフセット |
0 (デフォルト値) |
投影パラメーターの詳細は、「投影パラメーター」を参照してください。
private void createTransformations() { // Create the projection. IlvProjection projection = new IlvLambertAzimuthalEqualAreaProjection(); projection.setEllipsoid(IlvEllipsoid.SPHERE); try { double centralMeridian = IlvAngularUnit.RADIAN.fromDMS("100DW"); double centralParallel = IlvAngularUnit.RADIAN.fromDMS("40DN"); projection.setCentralMeridian(centralMeridian); projection.setCentralParallel(centralParallel); } catch (IllegalArgumentException e) { System.out.println("wrong string passed to " + "IlvAngularUnit.RADIAN.fromDMS"); System.out.println("unable to create the projection for the file" + "usa.ivl"); System.exit(0); }
投影パラメーターは常にカーネル単位で指定します。この例では、中央子午線と緯線をラジアンで指定する必要があります。この目標を達成するには、
IlvAngularUnit.RADIAN.fromDMS()
メソッドを使用します。ランベルト正積方位図法を初期化したら、対応する投影座標系を次のように作成する必要があります。
// Create the projected coordinate system. IlvProjectedCoordinateSystem projectedCS = new IlvProjectedCoordinateSystem("Lambert Azimutal Equal Area", projection);
また、単純な球体楕円体を持つ地理座標系を作成します。
// Create the geographic coordinate system. IlvGeographicCoordinateSystem geoCS = new IlvGeographicCoordinateSystem(IlvHorizontalShiftDatum.SPHERE_WGS84, IlvMeridian.GREENWICH);
最後に、座標変換を作成し、後ですぐに参照できるように逆変換も保存します。
// A coordinate transform. geo2projCT = IlvCoordinateTransformation.CreateTransformation(geoCS,projectedCS); // The inverse transform. proj2geoCT = geo2projCT.getInverse();
都市の追加
addCitites()
メソッドは、インポートした米国の地図上にいくつもの都市を追加します。private void addCities() { addCity("Washington", "39D11'N", "76D51W"); addCity("New York", "40D59'N", "73D39'W"); addCity("Miami", "25D58'N", "80D02'W"); addCity("San Francisco", "37D44'N", "122D20'W"); addCity("Seattle", "47D51'N", "122D01'W"); addCity("Denvers", "39D50'N", "104D53'W"); }
座標変換は
addCity()
メソッドで行われます。まず、このメソッドは、各ポイントの経度および緯度の座標を示すために、ストリングで指定した DMS 座標を度数に変換します。
private void addCity(String cityName, String lat, String lon) { try { double latitude = IlvAngularUnit.DEGREE.fromDMS(lat); double longitude = IlvAngularUnit.DEGREE.fromDMS(lon); IlvCoordinate coordinate = new IlvCoordinate(longitude, latitude);
次に、座標の順変換を適用して投影座標を計算します。座標を変換できない場合 (例えば、許容範囲を超えたため)、変換は例外を発します。そのために、コードに try/catch ブロックがあります。
y 座標を反転するために次に
IlvProjectionUtil.invertY()
メソッドが呼び出されます。JViews Maps マネージャー座標系では y 軸は下向きであるのに対して、投影座標系では上向きです。geo2projCT.transform(coordinate,coordinate); IlvPoint p = new IlvPoint((float)coordinate.x, (float)coordinate.y); IlvProjectionUtil.invertY(p);
新しい
IlvPoint
がここで割り振られることにも注意してください。これは、都市を表すグラフィック・オブジェクト (IlvMarker
) の作成に使用されます。このグラフィック・オブジェクトは、マネージャーの レイヤー #1 に追加されます (レイヤー #0 には、米国の国境が含まれます)。IlvMarker marker = new IlvMarker(p, IlvMarker.IlvMarkerFilledDiamond); marker.setSize(4); marker.setForeground(Color.red); manager.addObject(marker, 1, false); marker.setName(cityName); } catch (IlvCoordinateTransformationException e) { e.printStackTrace(); }
ビュー・インタラクターの設定
マウスの位置を追跡するために、ビュー・インタラクターを使用します。これは、
setViewInteractor()
メソッドによって実行されます。まず、地図上の都市の選択に使用する選択インタラクターを作成します。このインタラクターは、複数選択を許可せず、地図の変更ができないように設定されています。したがって、地図内で都市を移動させることができません。レイヤー #0 (国境) を構成する要素はどちらも選択できません。
private void setViewInteractor() { IlvSelectInteractor interactor = new IlvSelectInteractor(); interactor.setDragAllowed(false); interactor.setEditionAllowed(false); interactor.setMoveAllowed(false); interactor.setMultipleSelectionMode(false); manager.setSelectable(0, false); mgrview.pushInteractor(interactor);
次に、適切なテキスト・フィールドでマウスを使用して示す経度と緯度を表示するインタラクターにリスナーを追加します。経度と緯度を計算するには、以前計算した逆変換を適用します。このメソッドで返される結果は、
IlvAngularUnit.DEGREE.toDMS()
メソッドでフォーマット設定されます。// Display the position of the mouse. interactor.addMouseMotionListener(new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { // Get the point in manager coordinates. IlvTransformer t = mgrview.getTransformer(); IlvPoint p = new IlvPoint(e.getX(), e.getY()); t.inverse(p); IlvProjectionUtil.invertY(p); // Display the mouse position. try { IlvCoordinate c = new IlvCoordinate(p.x,p.y); proj2geoCT.transform(c,c); llField.setText(IlvAngularUnit.DEGREE.toDMS(c.x,false) + " " + IlvAngularUnit.DEGREE.toDMS(c.x,true)); } catch (IlvCoordinateTransformationException ex) { System.out.println("Unable to inverse this point " + ex.getMessage()); } } });
最後に、マネージャーにリスナーを追加します。リスナーは適切なテキスト・フィールドに指定した都市の名前を表示します。
manager.addManagerSelectionListener(new ManagerSelectionListener(){ public void selectionChanged(ManagerSelectionChangedEvent e) { IlvGraphic g = e.getGraphic(); if (g == null) return; String name = g.getName(); if (name != null) cityField.setText(name); } });
サンプルをコンパイルすると、「ビュー・インタラクターの設定」に示す地図が画面に表示されます。