转自java.sun.com 原文作者:Dana Nourie
World Wind是NASA开发的开源软件,它允许人们从卫星的高度看地球的样子。通过叠合LandSat卫星影像和SRTM数据,World Wind可以使用丰富3D形式表现地球地形。下面是圣海伦斯火山的影像叠合模型。
仅仅提供如此的功能并不是ww的本意。相反,ww是一个可以应用在你程序中的Java组件,它将提供可交互的3D地球模型。ww已经为开发者完成了所有复杂的工作,比如动态的图象选择和获取。
ww是什么而又不是什么?
NASA World Wind的可视化技术并不仅仅是一个眩目的软件。它包含了访问NASA的数据和影像的功能。另外,NASA的合作伙伴的数据在ww中也是可用的。ww在科学、教育、商业和政府等行业的应用中都有非常大的潜力。
ww不是Google Earth的拷贝,也不是它的竞争对手。ww和GE都拥有各自优势的技术,使二者成为当前最常用的此类软件。尽管二者看起来非常相似,但在受关注的领域、开发的历史和哲学方面,还是有明显的不同。ww可以在用户程序之中作为组件,可以获取NASA的数据,开发者可以创造性地实用这些数据。
不仅如此,ww还提供了其他星球的影像。而从设计本身来说,ww就具有极强的可扩展性和再创造性。
程序中的WorldWind
用户可以通过Java Web Start或是Applet来部署WorldWind程序。ww包含八个包:
- gov.nasa.worldwind 顶级包
- gov.nasa.worldwind.awt 用于awt的组件
- gov.nasa.worldwind.formats.gpx GPS轨道格式
- gov.nasa.worldwind.formats.nmea GPS轨道格式
- gov.nasa.worldwind.geom 几何与数学类
- gov.nasa.worldwind.globes 地球、火星等星球的实现
- gov.nasa.worldwind.layers 图层
- gov.nasa.worldwind.layers.Earth 专用于地球的图层
创建WorldWind应用
创建一个WorldWind组件,只需要一个frame和window canvas,然后加上一些事件监听
1. 将WorldWindGLCanvas键入JFrame
Class MyWorldWindFrame extends JFrame{
WorldWindowGLCanvas wwc = new WorldWindowGLCanvas();
this.getConentPane().add(wwc, BorderLayout.CENTER);
}
2. 监听WorldWind事件
wwc.addSelectListener(new SelectListener(){
public void selected(SelectEvent event) {...}
});
3. 运行此程序即可
WorldWindow和View接口
以下是WorldWindow接口:
- set/getModel(Model)
- set/getView(View)
- getSceneController(...)
- pick(java.awt.Point)
- set/getInputHandler(...)
以下监听器:
- PositionListener
- SelectListener
- RenderingListener
- repaint()
View 接口:
- Fields
- Position, direction, field of view, altitude, heading, pitch, roll,
- Actions
- apply()
- goto(lat/lon/elev/altitude)
- project(Point 3Dpoint)
- Compute
- horizon()
- positionFromScreenPoint(...)
- rayFromScreenPoint(...)
在Applet中使用WorldWind
要使用Applet,需要Java API for OpenGL(JOGL) Applet Launcher。新版本的JOGL Applet Launcher具备在applet中创建和部署基于OpenGL的3D图形的功能,而不需要客户端安装任何软件。它可以在任何支持JOGL的操作系统和CPU上运行,只需要浏览器上安装JRE1.4.2以上版本。
以下是典型的在applet中部署WorldWind组件的代码:
<applet code="com.sun.opengl.util.JOGLAppletLauncher"
width=400
height=260
codebase="http://www.tomgaskins.net/applet"
archive="jogl.jar,gluegen-rt.jar,jogl-demos.jar">
<param name="subapplet.classname"
VALUE="worldwinddemo.Applet1Up">
<param name="subapplet.displayname"
VALUE="WorldWind Applet Demo">
<param name="progressbar" value="true">
<param name="cache_archive"
VALUE="jogl.jar,gluegen-rt.jar,Applet1Up.jar">
<param name="cache_archive_ex"
VALUE="jogl.jar;preload,gluegen-rt.jar;
preload,Applet1Up;preload">
</applet>
其中Applet1Up.jar文件中包含WorldWindApplet类,无需声明,而是作为参数引入;而应当声明的是JOGL Applet Launcher,它的相关类jogl.jar和gluegen-rt.jar也需要列出。
架构和API
NASA拥有的海量数据可以以T来计算,这些数据来自卫星和太空望远镜。NASA World Wind的可视化技术可以用最便捷和低冗余的方式传送地理空间数据。下图为ww架构图:
ww包含了交互式的3D图形组件,可用于Swing,AWT和SWT或其他UI组件。
World Wind API主要以接口设计,因此用户可以选择性地替换已有组件。
最高级的接口为
WorldWindow,相关的UI组件为Swing/AWT。
其他五个主要的接口为:
- Globe接口 表现地形
- Layer接口 表现影像信息
- Model接口 聚合Globe和Layer,用于创建星球模型
- SceneController接口 控制Model的渲染,可以用于表现事件、时间等
- View接口 控制用户视图
在典型的应用中,程序在一个Model对象中关联一个Globe对象和多个Layer对象。然后将model传给SceneController对象,用于在一个WorldWindow中显示globe和layers。SceneController对象控制globe和layers的显示,并与View接口互动来决定用户视图。
实现这些接口的对象可能由ww或其他开发者提供,而实现这些接口的对象可用于任何需要此类接口的地方。ww已经提供了地球、火星和月球的模型的Globe实现,其他一些基本的Model,SceneController,View接口也都有了基本的实现。
FrameController接口将ww的渲染和整个程序的渲染集成,以便于控制。
所有的数据以缓存文件形式存取,文件缓存可以管理位于多个磁盘的文件碎片的取用、文件缓存可以同区难过WorldWind以单例模式访问。
未来
未来NASA将提供更多数据,包括地球、月球、其他星球、天气、卫星和时区。更多数据格式将被支持。更多可用的组件,包括图层管理器,动画播放器,拖放支持,UI帮助类等将被支持。另外,WorldWind还将对RSS和脚本扩展编程进行支持。最后,未来版本还将包含对Eclipse和NetBeans的支持。