使用此开源 SDK 开发 GIS 应用程序

NASA 开发的开源 World Wind Java (WWJ) SDK 为地理信息系统(Geographic Information Systems,GIS)社区提供了新的可能性。World Wind 是一种使用 Java™ 语言和 OpenGL 编写的 3D 交互式地球查看工具,使用户可以从外太空观看地球上的任何地方。本文将讲述想要增强基于 Eclipse 的 应用程序的 GIS 开发人员如何将 WWJ SDK 作为插件嵌入到 Eclipse 中。

WWJ SDK 是一种构建在 Java OpenGL (JOGL) 扩展之上的 3D 图形地球仪。WWJ 类层次结构的核心是GLCanvas 的子类 WorldWindowGLCanvas。而 GLCanvas 是一个 Abstract Window Toolkit (AWT) 组件。

WWJ 对 AWT 的依赖性对于想在 Eclipse 应用程序中使用 WWJ 的 GIS 开发人员来讲是一个障碍。您可能知道,Eclipse 使用了 Standard Widget Toolkit (SWT),而 SWT 与 AWT 不兼容。而且,AWT 和 JOGL 紧密集成,这使得很难从 AWT 移植到 SWT。本文将提供一种解决方案,使您可以在 Eclipse 应用程序中使用 WWJ SDK。

与 WWJ 捆绑的数据集

WWJ 捆绑了以下低、中和高分辨率的数据集(参见 参考资料,获取它们的链接):

  • Blue Marble (分辨率:1 千米/像素)
  • i-cubed Landsat 7 (分辨率:15 米/像素),来自马里兰大学高级计算机研究所的 Global Land Cover Facility
  • 海拔数据(源自 SRTM30Plus/SRTMv2/USGS NED 的数据集),来自 NASA 喷气推进实验室
  • USGS 地形图、黑白垂直图像和彩色市区图像,由 USGS 和 Microsoft® 研究
  • 美国地名,来自 USGS 地理名称信息系统
  • 世界地名,来自美国国家地理空间情报局

进入 SWT/AWT 桥梁

SWT 因能够快速构建可伸缩和强大的客户端应用程序而迅速成为一种顶级窗口工具包。SWT 和 AWT/Swing 都在争当 Java 用户界面开发的权威。由于它们各有利弊,Eclipse 基金会意识到有必要构建一座允许在 SWT 中嵌入 AWT/Swing 组件的 SWT/AWT 桥梁。从 Eclipse version 3.0 开始,这座桥梁就已成为 SWT 的一部分。这个的 API 位于org.eclipse.swt.awt 包中(参见 参考资料)。

SWT/AWT 桥梁是通过 SWT 将基于 AWT 的 World Wind 3D Globe 嵌入到 Eclipse 应用程序中所需的关键组件。

WWJ 3D Earth 的 Eclipse 视图

借助 SWT 中已存在的 SWT/AWT 桥梁,可以轻松地将 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 首先创建一个顶层 SWT 组件,该组件使用桥梁嵌入 WWJ swing OpenGL 画布:

Composite top = new Composite(parent, SWT.EMBEDDED);
top.setLayoutData(new GridData(GridData.FILL_BOTH));

其次,使用桥梁在顶层 SWT 组件中创建一个子 AWT 框架,用于保存 WWJ OpenGL 画布所需的 Swing panel

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 展示了作为 Rich Client Platform (RCP) 应用程序的一部分嵌入到 Eclipse 视图中的 Earth:

图 1. 显示为 Eclipse 视图的 WWJ Earth

在地球仪中飞往某地

如果想让应用程序在 Google Earth 风格下飞往特定的纬度/经度,则需要三个对象:

  • View,该对象提供从模型坐标到眼睛坐标的坐标转换,转换规则遵循 OpenGL 的左手坐标系统惯例
  • Globe,该对象表示您看到的世界的 3D 椭球体
  • 您要到达的位置的纬度/经度坐标

可选信息包括飞行方向和倾斜的角度,以及以米为单位的海拔高度。

清单 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() 方法移动或缩放地球仪,在地球仪的目标坐标上制造一种平稳飞行和即时缩放效果。

除 Earth 以外,WWJ 还捆绑了其他地球仪;WWJ v0.4.1 中可用的 3D 地球仪包括:

  • Earth(参见 参考资料,获取包含的数据集)。
  • Moon:40xx/30xx 颜色/灰度层,使用一组来自 Clementine 任务的光谱带创建
  • Mars:包括来自 Mars Orbital Camera (MOC)、Elevation Maps 等任务的高分辨率图像,使用来自 NASA 喷气推进实验室和 NASA Mars Odyssey/THEMIS 的数据创建。

图 2 展示了以三种不同的 Eclipse 视图显示的 Earth、Moon 和 Mars:

图 2. RCP 应用程序中的 Earth、Moon 和 Mars 视图

结束语

World Wind Java SDK 是使用 Java 和 OpenGL 编写的 3D 交互式地球查看工具,它允许任何用户从外太空缩放 Earth 上的任何地方。本文介绍了将 WWJ SDK 作为一个 Eclipse 视图嵌入的基本原理,获得了一组在 Eclipse 中进行 GIS 开发的强大工具。

原文链接:在 Eclipse 中嵌入 NASA World Wind Java SDK

[转]在 Eclipse 中嵌入 NASA World Wind Java SDK的更多相关文章

  1. 在Eclipse中运行Jboss时出现java.lang.OutOfMemoryError:PermGen space及其解决方法

    在Eclipse中运行Jboss时出现java.lang.OutOfMemoryError:PermGen space及其解决方法 在Eclipse中运行Jboss时,时间太长可能有时候会出现java ...

  2. eclipse中添加进新的java项目中文乱码

    eclipse中添加进新的java项目中文乱码 添加学习的一些项目进eclipse中,结果其中的中文注释都变成了乱码 右击项目,点最下面的属性,出来新得弹框 在文本文件编码部分可以发现是GBK格式,选 ...

  3. Eclipse中启动tomcat报错java.lang.OutOfMemoryError: PermGen space的解决方法

    有的项目引用了太多的jar包,或者反射生成了太多的类,异或有太多的常量池,就有可能会报java.lang.OutOfMemoryError: PermGen space的错误, 我们知道可以通过jvm ...

  4. eclipse中如何安装插件ADT及SDK工具

    1.如何在eclipse中安装ADT 首先下载ADT Plugin 下载地址: http://tools.android-studio.org/index.php/adt-bundle-plugin ...

  5. 在Eclipse中,如何把一个java项目变成web项目

    经常在eclipse中导入web项目时,出现转不了项目类型的问题,导入后就是一个java项目.解决步骤:1.进入项目目录,可看到.project文件,打开.2.找到<natures>... ...

  6. Eclipse中设置作者日期等Java注释模板

    Eclipse作为JavaIDE(Integrated Development Environment,集成开发环境),可以通过设置自动添加Javadoc注释信息,如@author 作者名.@vers ...

  7. Github管理 第一步:在Eclipse中导入既存Github Java Project

    1.前提 从官网下载的最新版本的Eclipse已经集成了Github插件,所以忽略了配置说明. 如果在下面的步骤中你找不到Git的设定目录,可能你的Eclipse中还没有Github,请自行解决. 2 ...

  8. eclipse中启动tomcat报错 java.lang.ClassNotFoundException

    之前启动还好好的,某次启动tomcat就莫名其妙的报了这个java.lang.ClassNotFoundException的错.   检查maven依赖包,发现这个类是存在的. 然后一通clean操作 ...

  9. eclipse中的javac命令与java命令

    一.eclipse的javac命令:当eclipse对.java(源文件)文件进行保存操作时(快捷键ctrl+s),会执行javac命令.见上图,Default output folder(默认输出文 ...

随机推荐

  1. 内存管理2(主讲MRR)

    内存管理2 我们讨论过properties 后,所有的内存管理系统都是通过控制所有对象的生命周期来减少内存的占用.iOS和OS X应用程序完成这些是通过对象拥有者来实现的,它保证了只要对象使用就会存在 ...

  2. Android群英传笔记系列三 view的自定义:实现一个模拟下载

    1.实现效果:动态显示进度(分别显示了整个的动态改变的过程,然后完成后,弹出一个对话框)       2.实现过程:可以分为绘制一个圆,圆弧和文本三部分,然后在MainAcitivity中通过线程模拟 ...

  3. Dataset的基本操作

    创建一个dateset并往其中加入列 DataSet dsClass = new DataSet(); DataTable dtClass = new DataTable("Class&qu ...

  4. Objective-C 代码规范(Code Style)

    我们写出来的代码会给很多人看,为了使代码清晰简洁,方便阅读理解,都会统一遵从一定的代码规范,Objective-C同样如此. 主要参考规范: 1.Google Objective-C Style Gu ...

  5. Silverlight项目笔记1:UI控件与布局、MVVM、数据绑定、await/async、Linq查询、WCF RIA Services、序列化、委托与事件

    最近从技术支持转到开发岗,做Silverlight部分的开发,用的Prism+MVVM,框架由同事搭好,目前做的主要是功能实现,用到了一些东西,侧重于如何使用,总结如下 1.UI控件与布局 常用的主要 ...

  6. SQL 在表中随机取数据

    在一张10万行产品表(Product)中,随机取10条数据的几种方式: SET STATISTICS IO ON SELECT TOP 10 ID FROM dbo.Product(NOLOCK) W ...

  7. Effective Java 50 Avoid strings where other types are more appropriate

    Principle Strings are poor substitutes for other value types. Such as int, float or BigInteger. Stri ...

  8. ECharts 之一——入门

    一.简介 ECharts是一个来自百度的开源的javascript图标库.通过ECharts我们可以呈现出多种类型的图表.ECharts底层基于ZRender(一个全新的轻量级canvas类库),创建 ...

  9. Windows环境下maven 安装与环境变量配置

    Maven是一个项目管理的Java 工具,在JavaEE中,我们可以使用Maven方便地管理团队合作的项目,现在我们在学习JavaEE框架,使用Maven可以管理类库,有效方便地供团队中的其他人员使用 ...

  10. 烂泥:KVM安装Windows Server 2008 R2使用virtio硬盘

    本文首发于烂泥行天下. 在上一篇文章中,我们介绍了使用IDE硬盘来安装Windows Server 2008 R2,这篇文章我们来介绍使用virtio硬盘来安装Windows Server 2008 ...