WWJ SDK は 3D グラフィックスによる地球儀であり、JOGL (Java OpenGL) 拡張機能の上に構築されています。WWJ クラスの階層構造の中心には GLCanvas のサブクラスである WorldWindowGLCanvas があります。そして GLCanvas は AWT (Abstract Window Toolkit) コンポーネントです。
WWJ が AWT に依存していることは、Eclipse アプリケーションの中で WWJ を使おうとする GIS 開発者にとっては障害です。おそらくご存じのように、Eclipse は AWT とは互換性のない SWT (Standard Widget Toolkit) を使っています。しかも AWT と JOGL は緊密に統合されているため、AWT インターフェースを SWT に移植することは困難です。この記事では Eclipse アプリケーションで WWJ SDK を使えるようにするためのソリューションについて説明します。
SWT はスケーラブルで強力なクライアント・アプリケーションを素早く作成するためのウィンドウ処理用ツールキットとして急速に高い人気を誇るようになっています。また SWT と AWT/Swing は、Java のユーザー・インターフェース開発における優位性を競っており、どちらにも利点と欠点があることから、Eclipse Foundation では AWT/Swing コンポーネントを SWT に組み込むことのできる SWT/AWT ブリッジを構築する必要があると認識しました。このブリッジは Eclipse のバージョン 3.0 から SWT の一部となっています。この単純な API は org.eclipse.swt.awt パッケージの中にあります (「参考文献」を参照)。
SWT/AWT ブリッジは、AWT ベースの World Wind 3D Globe を SWT を介して Eclipse アプリケーションの中に組みこむための重要なコンポーネントです。
WWJ 3D Earth に対する Eclipse のビュー
SWT/AWT ブリッジは既に SWT の中に用意されているため、ビューの中に WWJ 3D Earth を組み込むのは簡単です。リスト 1 はこのタスクを実行する基本的な Eclipse のビューを示しています。
リスト 1. WWJ 3D Earth のための基本的な Eclipse のビュー
package org.eclipse.plugin.worldwind.views;
_
/**
* World Wind Eclipse RCP Earth View
* @author Vladimir Silva
*
*/
public class EarthView extends ViewPart
{
private static final Logger logger = Logger.getLogger(EarthView.class);
public static final String ID = EarthView.class.getName();
final WorldWindowGLCanvas world = new WorldWindowGLCanvas();
/**
* Initialize the default WW layers
*/
static {
initWorldWindLayerModel();
}
public EarthView() {
}
/**
* This is a callback that will allow us to create the viewer and initialize
* it.
*/
public void createPartControl(Composite parent)
{
// GUI: an SWT composite on top
Composite top = new Composite(parent, SWT.EMBEDDED);
top.setLayoutData(new GridData(GridData.FILL_BOTH));
// Swing Frame and Panel
java.awt.Frame worldFrame = SWT_AWT.new_Frame(top);
java.awt.Panel panel = new java.awt.Panel(new java.awt.BorderLayout());
worldFrame.add(panel);
// Add the WWJ 3D OpenGL Canvas to the Swing Panel
panel.add(world, BorderLayout.CENTER);
parent.setLayoutData(new GridData(GridData.FILL_BOTH));
}
/*
* Initialize WW model with default layers
*/
static void initWorldWindLayerModel ()
{
Model m = (Model) WorldWind.createConfigurationComponent(
AVKey.MODEL_CLASS_NAME);
world.setModel(m);
}
/**
* Passing the focus request to the viewer's control.
*/
public void setFocus() {
}
public static void repaint() {
world.repaint();
}
@Override
public void dispose() {
super.dispose();
}
}
|
リスト 1 はまず、このブリッジを使って WWJ の Swing OpenGL キャンバスを組み込むための最上位 SWT コンポーネントを作成することから始めています。
Composite top = new Composite(parent, SWT.EMBEDDED); top.setLayoutData(new GridData(GridData.FILL_BOTH)); |
次に、WWJ の OpenGL キャンバスに必要な Swing の panel をホストするための AWT 子フレームが、このブリッジを使って最上位 SWT コンポーネントの中に作成されています。
java.awt.Frame worldFrame = SWT_AWT.new_Frame(top); java.awt.Panel panel = new java.awt.Panel(new java.awt.BorderLayout()); |
最後に、WWJ の GL キャンバスが Swing の panel に追加されています。
WorldWindowGLCanvas world = new WorldWindowGLCanvas(); panel.add(world, BorderLayout.CENTER); |
図 1 は、RCP (Rich Client Platform) アプリケーションの一部として Eclipse のビューの中に組みこまれた WWJ 3D Earth を示しています。
図 1. Eclipse のビューとしての WWJ 3D Earthw
Google Earth のスタイルでアプリケーションが特定の緯度と経度に行くようにするためには、次の 3 つのオブジェクトが必要です。
- OpenGL の左手座標系の規則に従ってモデルの座標から人間の目の座標に変換する
View
- ユーザーが見る世界を 3D の楕円体で表現する
Globe
- 行く先の点の緯度座標と経度座標
オプション情報としては、ユーザーが Google Earth を見ている向き (方角) と角度 (傾き)、そしてメートルで表した高度があります。
リスト 2 は、ある場所に行くための方法を示しています。
リスト 2. 指定された緯度と経度の座標に行く
public void flyTo (LatLon latlon)
{
View view = world.getView();
Globe globe = world.getModel().getGlobe();
view.applyStateIterator(FlyToOrbitViewStateIterator.createPanToIterator(
(OrbitView)view
, globe
, latlon // bbox
, Angle.ZERO // Heading
, Angle.ZERO // Pitch
, 3e3 ) // Altitude/Zoom (m)
);
}
|
View クラスの applyStateIterator() メソッドは地球儀のパンとズームを行い、地球儀上の対象座標にスムーズに移動したり、あるいは対象座標を瞬時にズームしたりする、といった効果を実現します。
WWJ には地球以外の天体もバンドルされています。WWJ のバージョン 0.4.1 で利用できる 3D の世界には次のようなものがあります。
- Earth (地球: 含まれるデータセットについては「参考文献」を参照してください)
- Moon (月): 40xx/30xx のカラーとグレースケールのレイヤー (Clementine 探査機からのスペクトラム帯域をいくつか組み合わせて作成されています)
- Mars (火星): MOC (Mars Orbital Camera) など探査機からの高解像度画像や、NASA Jet Propulsion Laboratory のデータを使って作成されたエレベーション・マップ (標高地図)、NASA の Mars Odyssey/THEMIS からのデータなど
図 2 は、地球と月、火星を、それぞれ別の Eclipse ビューとして表示しています。
図 2. RCP アプリケーションの中の地球と月、火星のビュー
World Wind Java SDK は、世界を 3D で見られる対話型のビューアーであり、Java と OpenGL で作成されたものです。この SDK では、ユーザーは宇宙空間から地球上の任意の場所にズームインすることができます。この記事では、WWJ SDK を Eclipse のビューとして組み込み、GIS 開発のための新しい強力なツール・セットを Eclipse の中に実現するための基礎を説明しました。
学ぶために
-
World Wind Central は NASA World Wind SDK の正式なナレッジ・ベースであり、サポート・サイトでもあります。
- WWJ には次のような、低解像度、中解像度、高解像度のデータセットがバンドルされています。
- Blue Marble (1-km/ピクセルの解像度)
- University of Maryland Institute for Advanced Computer Studies の Global Land Cover Facility による、i-cubed 処理の Landsat 7 (15-m/ピクセルの解像度)
- NASA Jet Propulsion Laboratory の SRTM Project プロジェクトによるエレベーション・データ (SRTM30Plus/SRTMv2/USGS NED 派生データセット)
- TeraSeerver から入手可能な USGS と Microsoft Research によるUSGS Topographic、B&W Ortho、Color Urban Area
- USGS Geographic Names Information System による米国の地名
- National Geospatial-Intelligence Agency による世界の地名
-
SWT/AWT ブリッジに関して SWT_AWT クラスの Javadoc を見てください。
- 「Swing/SWT Integration」(Gordon Hirsch 著、eclipse.org、2007年) は SWT/AWT ブリッジを使って既存の Swing コンポーネントを SWT ベースの RCP アプリケーションに組み込む方法に焦点を当てた記事です。
- 「Find your way around open source GIS」(Frank Pohlmann、developerWorks、2005年5月) は UNIX® や Linux® のユーザーのための GIS ツールをいくつか解説しています。
-
Eclipse project resources には Eclipse 開発者のためのリソースが豊富に用意されています。
-
Technology bookstore には、この記事や他の技術的な話題に関する本が豊富に取り揃えられています。
-
developerWorks の Java technology ゾーンには Java プログラミングのあらゆる側面を網羅した記事が豊富に用意されています。
製品や技術を入手するために
-
World Wind Java SDK を NASA のサイトからダウンロードしてください。
-
Europa Simultaneous Release project から無料の Eclipse Europa バンドルをダウンロードしてください。
議論するために
-
developerWorks blogs から developerWorks のコミュニティーに加わってください。
