World Wind Java开发之八——加载本地缓存文件构建大范围三维场景(
http://blog.csdn.net/giser_whu/article/details/42044599
上一篇博客主要是针对小文件直接导入WW中显示,然而当文件特别大时,这种方式就不太可行。因此要将大文件切片,生成本地缓存,WW可以加载本地缓存文件,保障浏览场景时的流畅性。
1、使用Global Mapper生成WW缓存切片


2、参照InstallImageryAndElevationsDemo示例实现缓存文件的初始化加载
- /**
- * @Copyright 2014-2020 @奔跑的鸡丝
- **/
- package edu.whu.vge.util;
- import edu.whu.vge.util.JavaCheckBoxTree.CheckBoxTreeNode;
- import gov.nasa.worldwind.Factory;
- import gov.nasa.worldwind.WorldWind;
- import gov.nasa.worldwind.avlist.AVKey;
- import gov.nasa.worldwind.avlist.AVList;
- import gov.nasa.worldwind.avlist.AVListImpl;
- import gov.nasa.worldwind.awt.WorldWindowGLCanvas;
- import gov.nasa.worldwind.cache.FileStore;
- import gov.nasa.worldwind.exception.WWRuntimeException;
- import gov.nasa.worldwind.geom.Sector;
- import gov.nasa.worldwind.globes.Earth;
- import gov.nasa.worldwind.globes.ElevationModel;
- import gov.nasa.worldwind.layers.Layer;
- import gov.nasa.worldwind.terrain.CompoundElevationModel;
- import gov.nasa.worldwind.util.DataConfigurationFilter;
- import gov.nasa.worldwind.util.DataConfigurationUtils;
- import gov.nasa.worldwind.util.Logging;
- import gov.nasa.worldwind.util.WWIO;
- import gov.nasa.worldwind.util.WWXML;
- import java.awt.Component;
- import java.io.File;
- import javax.swing.JTree;
- import javax.swing.SwingUtilities;
- import javax.swing.tree.DefaultMutableTreeNode;
- import javax.xml.xpath.XPath;
- import org.w3c.dom.Document;
- import org.w3c.dom.Element;
- /**
- * @项目名称:GF_ZHJCYPG
- * @类名称:LoadCacheData
- * @类描述: 加载缓存数据
- * @创建人:奔跑的鸡丝
- * @创建时间:2014-12-19 下午4:30:49
- * @修改备注:
- * @版本:
- */
- public class LoadCacheData
- {
- private static WorldWindowGLCanvas worldWindowGLCanvas;
- private static JTree layerJTree;
- /**
- *
- * 创建一个新的实例 LoadCacheData.
- *
- * @param worWindowGLCanvas
- */
- public LoadCacheData(WorldWindowGLCanvas worWindowGLCanvas, JTree jTree)
- {
- LoadCacheData.setWorldWindowGLCanvas(worWindowGLCanvas);
- LoadCacheData.setLayerJTree(jTree);
- }
- /**
- *
- * @方法名称: loadPreviouslyInstalledData ;
- * @方法描述: 加载已有的缓存文件 ;
- * @参数 :
- * @返回类型: void ;
- * @创建人:奔跑的鸡丝 ;
- * @创建时间:2014-12-19 下午7:06:09;
- * @throws
- */
- public void loadPreviouslyInstalledData()
- {
- Thread thread = new Thread(new Runnable()
- {
- @Override
- public void run()
- {
- // TODO Auto-generated method stub
- loadInstalledDataFromFileStore(WorldWind.getDataFileStore());
- }
- });
- thread.start();
- }
- /**
- *
- * @方法名称: loadInstalledDataFromFileStore ;
- * @方法描述: TODO ;
- * @参数 :@param fileStore
- * @返回类型: void ;
- * @创建人:奔跑的鸡丝 ;
- * @创建时间:2014-12-19 下午7:06:42;
- * @throws
- */
- protected void loadInstalledDataFromFileStore(FileStore fileStore)
- {
- // 便利已有的缓存文件
- for (File file : fileStore.getLocations())
- {
- // 文件存在并且是缓存文件目录
- if (file.exists() && fileStore.isInstallLocation(file.getPath()))
- {
- System.out.println(file.getPath());
- loadInstalledDataFromDirectory(file);
- }
- }
- }
- /**
- *
- * @方法名称: loadInstalledDataFromDirectory ;
- * @方法描述: 从文件目录加载缓存数据 ;
- * @参数 :@param dir
- * @返回类型: void ;
- * @创建人:奔跑的鸡丝 ;
- * @创建时间:2014-12-19 下午7:43:36;
- * @throws
- */
- private void loadInstalledDataFromDirectory(File dir)
- {
- /**
- * 获取缓存文件xml配置文件的在缓存文件目录的相对目录,如Landsat\Landsat.xml
- */
- String[] names = WWIO.listDescendantFilenames(dir,
- new DataConfigurationFilter(), false);
- if (names == null || names.length == 0)
- return;
- for (String filename : names)
- {
- Document doc = null;
- try
- {
- // 根据缓存文件XML描述文件创建Document对象
- File dataConfigFile = new File(dir, filename);
- doc = WWXML.openDocument(dataConfigFile);
- doc = DataConfigurationUtils.convertToStandardDataConfigDocument(doc);
- }
- catch (WWRuntimeException e)
- {
- e.printStackTrace();
- }
- if (doc == null)
- continue;
- // 由于数据配置文件来自于已有的文件,因此不能保证它是由当前版本WW's Installer
- // 产生的。可能是由之前版本或其他应用程序产生的,因此要为可能缺失的参数设置备用值(这些参数需要用来构建图层或高程模拟)
- AVList params = new AVListImpl();
- setFallbackParams(doc, filename, params);
- // 添加数据
- addInstalledData(doc, params);
- }
- }
- /**
- *
- * @方法名称: setFallbackParams ;
- * @方法描述: 设置备用参数值 ;
- * @参数 :@param dataConfig :数据配置XML文件
- * @参数 :@param filename :文件名
- * @参数 :@param params :参数列表
- * @返回类型: void ;
- * @创建人:奔跑的鸡丝 ;
- * @创建时间:2014-12-20 下午12:21:03;
- * @throws
- */
- private void setFallbackParams(Document dataConfig, String filename,
- AVList params)
- {
- XPath xpath = WWXML.makeXPath();
- Element domElement = dataConfig.getDocumentElement();
- // If the data configuration document doesn't define a cache name, then
- // compute one using the file's path
- // relative to its file cache directory.
- String s = WWXML.getText(domElement, "DataCacheName", xpath);
- if (s == null || s.length() == 0)
- DataConfigurationUtils.getDataConfigCacheName(filename, params);
- // If the data configuration document doesn't define the data's extreme
- // elevations, provide default values using
- // the minimum and maximum elevations of Earth.
- String type = DataConfigurationUtils.getDataConfigType(domElement);
- if (type.equalsIgnoreCase("ElevationModel"))
- {
- if (WWXML.getDouble(domElement, "ExtremeElevations/@min", xpath) == null)
- params.setValue(AVKey.ELEVATION_MIN, Earth.ELEVATION_MIN);
- if (WWXML.getDouble(domElement, "ExtremeElevations/@max", xpath) == null)
- params.setValue(AVKey.ELEVATION_MAX, Earth.ELEVATION_MAX);
- }
- }
- /**
- *
- * @方法名称: addInstalledData ;
- * @方法描述: 添加缓存数据 ;
- * @参数 :@param dataConfig
- * @参数 :@param params
- * @返回类型: void ;
- * @创建人:奔跑的鸡丝 ;
- * @创建时间:2014-12-20 下午12:22:29;
- * @throws
- */
- private void addInstalledData(final Document dataConfig, final AVList params)
- {
- if (!SwingUtilities.isEventDispatchThread())
- {
- SwingUtilities.invokeLater(new Runnable()
- {
- public void run()
- {
- addInstalledData(dataConfig, params);
- }
- });
- }
- else
- {
- addInstalledCacheData(dataConfig.getDocumentElement(), params);
- }
- }
- /**
- *
- * @方法名称: addInstalledCacheData ;
- * @方法描述: 添加已有缓存数据 ;
- * @参数 :@param domElement :数据XML描述文件
- * @参数 :@param params :参数列表
- * @返回类型: void ;
- * @创建人:奔跑的鸡丝 ;
- * @创建时间:2014-12-19 下午8:02:21;
- * @throws
- */
- public void addInstalledCacheData(final Element domElement,
- final AVList params)
- {
- if (domElement == null)
- {
- String message = Logging.getMessage("nullValue.DocumentIsNull");
- Logging.logger().severe(message);
- throw new IllegalArgumentException(message);
- }
- String description = getDescription(domElement); // 图层名称
- Sector sector = getSector(domElement); // 图层范围
- System.out.println(description);
- System.out.println(sector);
- addToWorldWindow(domElement, params);
- }
- /**
- *
- * @方法名称: addToWorldWindow ;
- * @方法描述: 将缓存文件加入WW ;
- * @参数 :@param domElement
- * @参数 :@param params
- * @返回类型: void ;
- * @创建人:奔跑的鸡丝 ;
- * @创建时间:2014-12-19 下午4:44:08;
- * @throws
- */
- private void addToWorldWindow(Element domElement, AVList params)
- {
- String type = DataConfigurationUtils.getDataConfigType(domElement);
- if (type == null)
- return;
- if (type.equalsIgnoreCase("Layer"))
- {
- addLayerToWorldWindow(domElement, params);
- }
- else if (type.equalsIgnoreCase("ElevationModel"))
- {
- addElevationModelToWorldWindow(domElement, params);
- }
- }
- /**
- *
- * @方法名称: addLayerToWorldWindow ;
- * @方法描述: 向WW中添加图层 ;
- * @参数 :@param domElement
- * @参数 :@param params
- * @返回类型: void ;
- * @创建人:奔跑的鸡丝 ;
- * @创建时间:2014-12-19 下午4:45:06;
- * @throws
- */
- private void addLayerToWorldWindow(Element domElement, AVList params)
- {
- Layer layer = null;
- try
- {
- // Factory创建的图层默认是不可见的
- Factory factory = (Factory) WorldWind.createConfigurationComponent(AVKey.LAYER_FACTORY);
- layer = (Layer) factory.createFromConfigSource(domElement, params);
- }
- catch (Exception e)
- {
- String message = Logging.getMessage(
- "generic.CreationFromConfigurationFailed",
- DataConfigurationUtils.getDataConfigDisplayName(domElement));
- Logging.logger().log(java.util.logging.Level.SEVERE, message, e);
- }
- if (layer == null)
- return;
- layer.setEnabled(true); // 设置图层可见
- // 添加至WW
- if (!getWorldWindowGLCanvas().getModel().getLayers().contains(layer))
- {
- getWorldWindowGLCanvas().getModel().getLayers().add(layer);
- // System.out.println(pLayerTree.getModel().getRoot().toString());
- Object rootObject = layerJTree.getModel().getRoot();
- if (!layerJTree.getModel().isLeaf(rootObject))
- {
- int count = layerJTree.getModel().getChildCount(rootObject);
- for (int i = 0; i < count; i++)
- {
- String childNodeNameString = layerJTree.getModel().getChild(
- rootObject, i).toString();
- if (childNodeNameString.equals("影像图层"))
- {
- ((DefaultMutableTreeNode) layerJTree.getModel().getChild(
- rootObject, i)).add(new CheckBoxTreeNode(
- layer.getName()));
- layerJTree.updateUI();
- }
- }
- }
- }
- }
- /**
- *
- * @方法名称: addElevationModelToWorldWindow ;
- * @方法描述: 添加高程图层 ;
- * @参数 :@param domElement
- * @参数 :@param params
- * @返回类型: void ;
- * @创建人:奔跑的鸡丝 ;
- * @创建时间:2014-12-19 下午4:51:37;
- * @throws
- */
- private void addElevationModelToWorldWindow(Element domElement,
- AVList params)
- {
- ElevationModel em = null;
- try
- {
- Factory factory = (Factory) WorldWind.createConfigurationComponent(AVKey.ELEVATION_MODEL_FACTORY);
- em = (ElevationModel) factory.createFromConfigSource(domElement,
- params);
- }
- catch (Exception e)
- {
- String message = Logging.getMessage(
- "generic.CreationFromConfigurationFailed",
- DataConfigurationUtils.getDataConfigDisplayName(domElement));
- Logging.logger().log(java.util.logging.Level.SEVERE, message, e);
- }
- if (em == null)
- return;
- ElevationModel defaultElevationModel = getWorldWindowGLCanvas().getModel().getGlobe().getElevationModel();
- if (defaultElevationModel instanceof CompoundElevationModel)
- {
- if (!((CompoundElevationModel) defaultElevationModel).containsElevationModel(em))
- ((CompoundElevationModel) defaultElevationModel).addElevationModel(em);
- }
- else
- {
- CompoundElevationModel cm = new CompoundElevationModel();
- cm.addElevationModel(defaultElevationModel);
- cm.addElevationModel(em);
- getWorldWindowGLCanvas().getModel().getGlobe().setElevationModel(cm);
- }
- }
- /**
- * 获取缓存文件类型 获取缓存配置文件描述:是Layer或者是Elevation
- *
- * @方法名称: getDescription ;
- * @方法描述: TODO ;
- * @参数 :@param domElement
- * @参数 :@return
- * @返回类型: String ;
- * @创建人:奔跑的鸡丝 ;
- * @创建时间:2014-12-19 下午4:53:26;
- * @throws
- */
- private String getDescription(Element domElement)
- {
- String displayName = DataConfigurationUtils.getDataConfigDisplayName(domElement);
- String type = DataConfigurationUtils.getDataConfigType(domElement);
- StringBuilder sb = new StringBuilder(displayName);
- if (type.equalsIgnoreCase("Layer"))
- {
- sb.append(" (Layer)");
- }
- else if (type.equalsIgnoreCase("ElevationModel"))
- {
- sb.append(" (Elevations)");
- }
- return sb.toString();
- }
- /**
- * 获取图层范围
- *
- * @方法名称: getSector ;
- * @方法描述: TODO ;
- * @参数 :@param domElement
- * @参数 :@return
- * @返回类型: Sector ;
- * @创建人:奔跑的鸡丝 ;
- * @创建时间:2014-12-19 下午4:54:17;
- * @throws
- */
- protected static Sector getSector(Element domElement)
- {
- return WWXML.getSector(domElement, "Sector", null);
- }
- public static WorldWindowGLCanvas getWorldWindowGLCanvas()
- {
- return worldWindowGLCanvas;
- }
- public static void setWorldWindowGLCanvas(
- WorldWindowGLCanvas worldWindowGLCanvas)
- {
- LoadCacheData.worldWindowGLCanvas = worldWindowGLCanvas;
- }
- public JTree getLayerJTree()
- {
- return layerJTree;
- }
- public static void setLayerJTree(JTree layerJTree)
- {
- LoadCacheData.layerJTree = layerJTree;
- }
- }
3、高程数据的加载

- // 加载缓存数据
- LoadCacheData loadCacheData = new LoadCacheData(wGlCanvas,
- layerJTree);
- loadCacheData.loadPreviouslyInstalledData();
其中layerJTree是图层树,大家可以不要这个参数,修改相应代码即可,另外如何测试自己的切片数据是否加载成功,可以参考示例中的InstallImageryAndElevationsDemo这个。可能有些朋友不知如何运行自带的示例,下面我贴图说明下哈(假设已添加Worldwind.jar文件,并且已使用GlobalMapper切片放置C:\ProgramData\WorldWindInstalled文件夹下)



World Wind Java开发之八——加载本地缓存文件构建大范围三维场景(的更多相关文章
- iOS开发-UIWebView加载本地和网络数据
UIWebView是内置的浏览器控件,可以用它来浏览网页.打开文档,关于浏览网页榜样可以参考UC,手机必备浏览器,至于文档浏览的手机很多图书阅读软件,UIWebView是一个混合体,具体的功能控件内置 ...
- iOS - 开发中加载本地word/pdf文档说明
最近项目中要加载一个本地的word/pdf等文件比如<用户隐私政策><用户注册说明>,有两种方法加载 > 用QLPreviewController控制器实现 步骤 : & ...
- [转]World Wind Java开发之四——搭建本地WMS服务器
在提供地理信息系统客户端时,NASA还为用户提供了开源的WMS Server 服务器应用:World Wind WMS Server.利用这个应用,我们可以架设自己的WMS服务并使用自己的数据(也支持 ...
- IOS开发-加载本地音乐
IOS开发-加载本地音乐 $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text() ...
- 微信小程序-工具无法加载本地模拟开发服务的解决办法
微信小程序开发工具出现如下问题: 因为网络代理软件或者 VPN 影响,工具无法加载本地模拟开发服务 请尝试以下任一解决方案1.关闭相关网络代理软件,重新编译成功后,再启动相关网络代理软件: 2.配置 ...
- Android GIS开发系列-- 入门季(5) FeatureLayer加载本地shp文件与要素查询
FeatureLayer是要素图层,也是Arcgis的主要图层.用这个图层可以加载本地的shp文件.下面我们看怎样加载shp文件到MapView中.查看ArcGis API可知FeatureLayer ...
- World Wind Java开发之六——解析shape文件(转)
http://blog.csdn.net/giser_whu/article/details/41647117 最近一直忙于导师项目的事情了,几天没更新了,昨天和今天研究了下WWJ解析shp文件的源代 ...
- jvm系列(一):java类的加载机制
java类的加载机制 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装 ...
- Android开发--异步加载
因为移动端软件开发思维模式或者说是开发的架构其实是不分平台和编程语言的,就拿安卓和IOS来说,他们都是移动前端app开发展示数据和用户交互数据的数据终端,移动架构的几个大模块:UI界面展示.本地数据可 ...
随机推荐
- linux---安装ftp并配置用户部分权限
一.启动vsftpd服务1. 启动VSFTP服务器A:cenos下运行:yum install vsftpdB. 登录Linux主机后,运行命令:”service vsftpd start”C. 要让 ...
- 启动windows .net 3.5 功能
近期给window 2008 版本安装loadrunner ,发现还需要用户自己打开windows 的 .net 3.5 功能,所以在这里记录一下步骤 激活
- 一文带你看懂WebSocket 的原理?为什么可以实现持久连接?
工作之余在知乎上偶然看到一篇回帖,瞬间觉得之前看的那么多资料都不及这一篇让我对 websocket 的认知深刻易懂,之前看总完总觉得一知半解云里雾里.所以与大家共同分享一下一起学习.比较喜欢这种博客理 ...
- 【外部节点】json判断@表示正在处理的当前数组项或对象。过滤器还可用于$引用当前对象之外的属性
$.store.book[?(@.price < $.expensive)] { "category" : "reference", "auth ...
- POJ1046 Color Me Less
题目来源:http://poj.org/problem?id=1046 题目大意: 在RGB颜色空间中,用下面的公式来度量两个颜色值的距离. 现给出16个RGB表示的颜色,和一些用于测试的颜色,求被测 ...
- Linux--7
一.Nginx.conf主配置文件 Nginx主配置文件conf/nginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组织的.一般,每个区块以一对大括号{}来表示开始与结束. 核心模 ...
- 【手撸一个ORM】第七步、SqlDataReader转实体
说明 使用Expression(表达式目录树)转Entity的文章在园子里有很多,思路也大致也一样,我在前面有篇文章对解决思路有些说明,有兴趣的小伙伴可以看下 (传送门),刚接触表达式目录树时写的,不 ...
- UVALive 5983 二分答案+dp
想了很久都想不出怎么dp,然后发现有些例子,如果你开始不确定起始值的话,是不能dp的,每种状态都有可能,所以只能二分一个答案,确定开始的val值,来dp了. #include <cstdio&g ...
- Sqoop Export HDFS
Sqoop Export应用场景——直接导出 直接导出 我们先复制一个表,然后将上一篇博文(Sqoop Import HDFS)导入的数据再导出到我们所复制的表里. sqoop export \ -- ...
- Practice encryptedblobstore
C++ BlobStore 使用范例(C++伪代码) 一个可能的接口设计示例(C++) Java BlobStore 使用范例(Java伪代码) 一个可能的接口设计示例(Java) 一个基于Key/V ...