eclipse中添加sdk
WWJ SDK是建立在Java OpenGL(JOGL)扩展之上的3D图形地球仪。 WWJ类层次结构的核心是WorldWindowGLCanvas
,它是GLCanvas
的子类。 GLCanvas
依次是抽象窗口工具包(AWT)组件。
WWJ对AWT的依赖是想要在其Eclipse应用程序中使用WWJ的GIS开发人员的障碍。 您可能知道,Eclipse使用了与AWT不兼容的Standard Widget Toolkit(SWT)。 此外,AWT和JOGL紧密集成在一起,这使得AWT接口的端口很难连接到SWT。 本文提供了一个解决方案,使您可以将WWJ SDK与Eclipse应用程序一起使用。
进入SWT / AWT桥
SWT正在Swift成为用于快速构建可扩展且功能强大的客户端应用程序的顶级窗口工具箱。 SWT和AWT / Swing都在争夺Java用户界面开发的优势。 考虑到两者都有优点和缺点,Eclipse Foundation认识到有必要构建SWT / AWT桥,该桥允许您将AWT / Swing组件嵌入到SWT中。 自Eclipse 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. WWJ Earth作为Eclipse视图
飞到地球仪中的某个位置
如果您希望应用程序以Google Earth的样式飞行到特定的纬度/经度,则需要三个对象:
- 一个
View
,它遵循左手坐标系的OpenGL约定,提供了从模型坐标到眼睛坐标的坐标转换 - 代表您正在查看的世界的3D椭球体的
Globe
- 您想飞到的点的纬度/经度坐标
可选信息包括航向角和俯仰角以及以米为单位的高度。
清单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()
方法可平移或缩放地球,从而在地球的目标坐标上产生平滑的飞applyStateIterator()
或瞬时缩放效果。
WWJ将地球以外的其他地球捆绑在一起; 从WWJ版本0.4.1开始可用的3D世界是:
- 地球( 有关包含的数据集,请参阅参考资料)。
- 月球:40xx / 30xx颜色/灰度图层,是结合了Clementine任务的几个光谱带而创建的。
- 火星:包括来自诸如火星轨道相机(MOC)等任务的高分辨率图像,使用来自NASA喷气推进实验室的数据以及来自NASA火星奥德赛/ THEMIS的数据创建的高程图。
图2将地球,月球和火星显示为三个不同的Eclipse视图:
图2. RCP应用程序中的地球,月球和火星视图
结论
World Wind Java SDK是用Java和OpenGL编写的3D交互式世界查看器,它允许任何用户从外太空缩放到地球上的任何地方。 本文为您嵌入WWJ SDK作为Eclipse视图奠定了基础,从而为Eclipse中的GIS开发获得了一组新的强大工具。
翻译自: https://www.ibm.com/developerworks/opensource/library/j-wwj/index.html
eclipse中添加sdk