跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

在 Eclipse 中嵌入 NASA World Wind Java SDK

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

  Vladimir Silva
Vladimir Silva 出生在厄瓜多尔的基多。他于 1994 年从 Polytechnic Institute of the Army 获得系统分析学士证书。同年,他为取得 Middle Tennessee State University 计算机科学硕士学位,作为一名交换学生来到美国。毕业后,他加入了 IBM Web Ahead 技术智囊团。目前,他是位于美国北卡州首府罗利的 Lockheed Martin 的一名网格工程师,工作职责是获得高性能和可视化。他还是 “Grid Computing for Developers” 一书的作者。

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

发布日期: 2008 年 6 月 17 日
级别: 中级 其他语言版本: 英文
访问情况 : 3708 次浏览
评论: 


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
图 1. 显示为 Eclipse 视图的 WWJ Earth

比较 WWJ 与 Google Earth 和 Virtual Earth

Google Earth 和 Virtual Earth 都是可用的流行 3D 地球仪软件。他们都是允许用户缩放并查看位置的 3D Earth。尽管它们与 WWJ 有相似之处,但它们从根本上是不同的。Google Earth 和 Virtual Earth 都是商用产品,而不是 SDK,因此开发人员不能增强客户机以适应他们的需要。例如,科学家不能添加对科学数据格式的支持或对地图绘制服务(如 OpenGIS Web Map Services (WMS) 或 Web Feature Services (WFS) 的支持。实际上,正如您在本文中看到的,WWJ 的开源特性允许将地球仪嵌入到任何类型的客户机中。也可以修改 WWJ 以访问任何类型的数据服务。与其他类似的商用产品相比,这是一个巨大的优势。

在地球仪中飞往某地

如果想让应用程序在 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 视图
图 2. 富客户机应用程序中的 Earth、Moon 和 Mars 视图

结束语

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


参考资料

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • World Wind Central:NASA World Wind SDK 的官方知识库和支持站点。

  • WWJ 捆绑了以下低、中和高分辨率的数据集:
    • Blue Marble(分辨率:1 千米/像素)。

    • i-cubed Landsat 7(分辨率:15 米/像素),来自马里兰大学高级计算机研究所的 Global Land Cover Facility

    • 海拔数据(来源于 SRTM30Plus/SRTMv2/USGS NED 的数据集),来自 NASA 喷气推进实验室的 SRTM 项目

    • USGS 地形图、黑白垂直图像和彩色市区图像,由 USGS 和 Microsoft® 研究,可从 TerraServer 获得。

    • 美国地名,来自 USGS 地理名称信息系统

    • 世界地名,来自美国国家地理空间情报局。

  • SWT/AWT 桥梁SWT_AWT 类的 Javadoc。

  • Swing/SWT Integration”(Gordon Hirsch,eclipse.org,2007 年):本文重点讲述了使用 SWT/AWT 桥梁将现有 Swing 组件嵌入到基于 SWT 的 RCP 应用程序中。

  • 利用开源 GIS 确定方位”(Frank Pohlmann,developerWorks,2005 年 5 月):查阅面向 UNIX® 和 Linux® 用户的 GIS 工具。

  • Eclipse 项目资源:面向 Eclipse 开发人员的丰富资源。

  • 浏览 技术书店,查找关于这些和其他技术主题的图书。

  • developerWorks Java 技术专区:查找关于 Java 编程各个方面的数百篇文章。

获得产品和技术

讨论

关于作者

  Vladimir Silva

Vladimir Silva 出生在厄瓜多尔的基多。他于 1994 年从 Polytechnic Institute of the Army 获得系统分析学士证书。同年,他为取得 Middle Tennessee State University 计算机科学硕士学位,作为一名交换学生来到美国。毕业后,他加入了 IBM Web Ahead 技术智囊团。目前,他是位于美国北卡州首府罗利的 Lockheed Martin 的一名网格工程师,工作职责是获得高性能和可视化。他还是 “Grid Computing for Developers” 一书的作者。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Java technology, Open source
ArticleID=313772
ArticleTitle=在 Eclipse 中嵌入 NASA World Wind Java SDK
publish-date=06172008
author1-email=vladimir_silva@hotmail.com
author1-email-cc=

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。