目次


NASA の World Wind Java SDK を Eclipse に組み込む

オープンソースの SDK を使って GIS アプリケーションを開発する

Comments

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/AWT ブリッジの登場

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
Eclipse のビューとしての WWJ 3D Earthw
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 アプリケーションの中の地球と月、火星のビュー
RCP アプリケーションの中の地球と月、火星のビュー
RCP アプリケーションの中の地球と月、火星のビュー

まとめ

World Wind Java SDK は、世界を 3D で見られる対話型のビューアーであり、Java と OpenGL で作成されたものです。この SDK では、ユーザーは宇宙空間から地球上の任意の場所にズームインすることができます。この記事では、WWJ SDK を Eclipse のビューとして組み込み、GIS 開発のための新しい強力なツール・セットを Eclipse の中に実現するための基礎を説明しました。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Java technology, Open source
ArticleID=317200
ArticleTitle=NASA の World Wind Java SDK を Eclipse に組み込む
publish-date=06032008