在Ecplise中嵌入NASA World Wind Java SDK

2023-11-09 00:50

本文主要是介绍在Ecplise中嵌入NASA World Wind Java SDK,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【IT168 技术文章】 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。

  进入 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 视图

1 package org.eclipse.plugin.worldwind.views;
2 _
3
4 /**
5 * World Wind Eclipse RCP Earth View
6 * @author Vladimir Silva
7 *
8 */
9 public class EarthView extends ViewPart
10 {
11    private static final Logger logger = Logger.getLogger(EarthView. class );
12   
13    public static final String ID = EarthView. class .getName();
14    final WorldWindowGLCanvas world = new WorldWindowGLCanvas();
15   
16
17    /**
18     * Initialize the default WW layers
19      */
20    static {
21       initWorldWindLayerModel();
22    }
23
24    public EarthView() {
25       
26    }
27   
28    /**
29     * This is a callback that will allow us to create the viewer and initialize
30     * it.
31      */
32    public void createPartControl(Composite parent)
33    {
34        // GUI: an SWT composite on top
35       Composite top = new Composite(parent, SWT.EMBEDDED);
36       top.setLayoutData( new GridData(GridData.FILL_BOTH));
37         
38        // Swing Frame and Panel
39       java.awt.Frame worldFrame = SWT_AWT.new_Frame(top);
40       java.awt.Panel panel = new java.awt.Panel( new java.awt.BorderLayout());
41       
42       worldFrame.add(panel);
43
44        // Add the WWJ 3D OpenGL Canvas to the Swing Panel
45       panel.add(world, BorderLayout.CENTER);
46
47       parent.setLayoutData( new GridData(GridData.FILL_BOTH));
48         
49    }
50
51    /*
52     * Initialize WW model with default layers
53      */
54    static void initWorldWindLayerModel ()
55    {
56       Model m = (Model) WorldWind.createConfigurationComponent(
57             AVKey.MODEL_CLASS_NAME);
58
59       world.setModel(m);
60    }
61
62    /**
63     * Passing the focus request to the viewer's control.
64      */
65    public void setFocus() {
66    }
67   
68    public static void repaint() {
69       world.repaint();
70    }
71
72    @Override
73    public void dispose() {
74        super .dispose();
75    }
76   
77 }
78

 

  清单 1 首先创建一个顶层 SWT 组件,该组件使用桥梁嵌入 WWJ swing OpenGL 画布:

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

 

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

1 java.awt.Frame worldFrame = SWT_AWT.new_Frame(top);
2 java.awt.Panel panel = new java.awt.Panel( new java.awt.BorderLayout());
3

 

  最后,将 WWJ GL 画布添加到 Swing panel:

1 WorldWindowGLCanvas world = new WorldWindowGLCanvas();
2 panel.add(world, BorderLayout.CENTER);
3

 

  图 1 展示了作为 Rich Client Platform (RCP) 应用程序的一部分嵌入到 Eclipse 视图中的 Earth:

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

  在地球仪中飞往某地

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

  View,该对象提供从模型坐标到眼睛坐标的坐标转换,转换规则遵循 OpenGL 的左手坐标系统惯例

  Globe,该对象表示您看到的世界的 3D 椭球体

  您要到达的位置的纬度/经度坐标

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

  清单 2 演示如何飞往指定位置:

  清单 2. 飞往指定纬度/经度坐标

1 public void flyTo (LatLon latlon)
2 {
3    View view       = world.getView();
4    Globe globe = world.getModel().getGlobe();
5   
6    view.applyStateIterator(FlyToOrbitViewStateIterator.createPanToIterator(
7            (OrbitView)view
8            , globe
9            , latlon       // bbox
10            , Angle.ZERO   // Heading
11            , Angle.ZERO   // Pitch
12            , 3e3 )       // Altitude/Zoom (m)
13            );
14 }
15

 

  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 开发的强大工具。

这篇关于在Ecplise中嵌入NASA World Wind Java SDK的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/373321

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定