World Wind Java开发之七——读取本地栅格文件(影像+高程)构建三维场景(转)
http://blog.csdn.net/giser_whu/article/details/41679515
首先,看下本篇博客要达到的效果图:
下面逐步分析如何加载影像及高程文件。
1、WorldWind Java导入数据包
2、WWJ加载影像文件
- /**
- *
- * @方法名称: importImagery ;
- * @方法描述: 导入影像文件 ;
- * @参数 :@param imageFilePath :影像文件路径
- * @参数 :@param worlGlCanvas :WorldWind 画布对象
- * @返回类型: void ;
- * @创建人:奔跑的鸡丝 ;
- * @创建时间:2014-12-2 下午3:12:30;
- * @throws
- */
- private void importImagery(String imageFilePath,
- final WorldWindowGLCanvas worlGlCanvas)
- {
- try
- {
- // 读取数据并将其保存在一个缓存文件夹中
- File sourceFile = ExampleUtil.saveResourceToTempFile(imageFilePath,
- ".tif");
- /**
- * 首先创建一个raster reader读取栅格文件。raster reader由当前的栅格数据读取工作空间来创建
- */
- DataRasterReaderFactory readerFactory = (DataRasterReaderFactory) WorldWind.createConfigurationComponent(AVKey.DATA_RASTER_READER_FACTORY_CLASS_NAME);
- DataRasterReader reader = readerFactory.findReaderFor(sourceFile,
- null);
- // 读取栅格数据之前,先验证改文件包含imagery
- AVList metadata = reader.readMetadata(sourceFile, null);
- if (metadata == null
- || !AVKey.IMAGE.equals(metadata.getStringValue(AVKey.PIXEL_FORMAT)))
- throw new Exception("Not an image file.");
- /**
- * 将文件读取到DataRaster中,如果读取的源文件中中包含多种文件类型,read可能返回多种raster
- * 但是在这种情况下之使用返回的raster数组中的第一个元素
- */
- DataRaster[] rasters = reader.read(sourceFile, null);
- if (rasters == null || rasters.length == 0)
- throw new Exception("Can't read the image file.");
- DataRaster raster = rasters[0];
- /**
- * 获取影像的经纬度范围;改信息在GeoTIFF文件或其附属文件中
- */
- final Sector sector = (Sector) raster.getValue(AVKey.SECTOR);
- if (sector == null)
- throw new Exception("No location specified with image.");
- /**
- * 获取包含整幅影像的子栅格。这一步是必须的,因为只有子栅格影像才可以重投影;
- */
- int width = raster.getWidth();
- int height = raster.getHeight();
- /**
- * getSubRaster()方法返回一个特定范围的栅格影像;影像大小可以自定义
- */
- DataRaster subRaster = raster.getSubRaster(width, height, sector,
- null);
- /**
- * 删除原栅格数据
- */
- raster.dispose();
- /**
- * 验证子栅格是否可以创建缓存影像,可以则创建一个缓存栅格影像
- */
- if (!(subRaster instanceof BufferedImageRaster))
- throw new Exception("Cannot get BufferedImage.");
- BufferedImage image = ((BufferedImageRaster) subRaster).getBufferedImage();
- /**
- * 删除子栅格影像
- */
- subRaster.dispose();
- /**
- * 创建一个表面影像在指定的经纬度范围内显示该影像
- */
- final SurfaceImage surfaceImage = new SurfaceImage(image, sector);
- /**
- * 在新开启的线程中导入影像数据,作为一个surfaceLayer
- */
- SwingUtilities.invokeLater(new Runnable()
- {
- public void run()
- {
- // 添加surfaceLayer
- SurfaceImageLayer surfaceImageLayer = new SurfaceImageLayer();
- surfaceImageLayer.setName("Imported Surface Image");
- surfaceImageLayer.setPickEnabled(false);
- surfaceImageLayer.addRenderable(surfaceImage);
- // 添加该图层到globe中
- worldWindowGLCanvas.getModel().getLayers().add(
- surfaceImageLayer);
- // 飞行到当前影像视图内
- ExampleUtil.goTo(worlGlCanvas, sector);
- }
- });
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
这里栅格数据的读取类似ArcEngine中的工作空间的概念;另外需要注意Sector类是表述由经纬度包含的范围。
3、WWJ加载高程文件
- /**
- *
- * @方法名称: importElevation ;
- * @方法描述: 导入高程数据 ;
- * @参数 :@param elevationFilePath :高程文件路径
- * @参数 :@param wGlCanvas :WW画布对象
- * @返回类型: void ;
- * @创建人:奔跑的鸡丝 ;
- * @创建时间:2014-12-2 下午4:42:26;
- * @throws
- */
- private void importElevation(String elevationFilePath,
- WorldWindowGLCanvas wGlCanvas)
- {
- try
- {
- File sourceFile = ExampleUtil.saveResourceToTempFile(
- elevationFilePath, ".tif");
- // 由数据源创建一个高程模型:LocalElevationModel
- final LocalElevationModel elevationModel = new LocalElevationModel();
- elevationModel.addElevations(sourceFile);
- SwingUtilities.invokeLater(new Runnable()
- {
- public void run()
- {
- // 获取WW当前的高程模型
- Globe globe = worldWindowGLCanvas.getModel().getGlobe();
- ElevationModel currentElevationModel = globe.getElevationModel();
- // 将新创建的高程模型加入Globe中(也可以是取代当前的高程模型)
- if (currentElevationModel instanceof CompoundElevationModel)
- ((CompoundElevationModel) currentElevationModel).addElevationModel(elevationModel);
- else
- globe.setElevationModel(elevationModel);
- // 飞行至当前视图
- Sector modelSector = elevationModel.getSector();
- ExampleUtil.goTo(worldWindowGLCanvas, modelSector);
- }
- });
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
运行后,加载影像和相应的DEM文件即可构建三维场景。欢迎大家留言交流,需要的请留邮箱!
World Wind Java开发之七——读取本地栅格文件(影像+高程)构建三维场景(转)的更多相关文章
- [转]World Wind Java开发之五——读取本地shp文件
World Wind Java 使用IconLayer图层类表现点和多点数据,使用RenderableLayer图层表现线和面数据,一个图层只能对应一组shape文件.World Wind Java首 ...
- World Wind Java开发之五——读取本地shp文件(转)
http://blog.csdn.net/giser_whu/article/details/41484433 World Wind Java 使用IconLayer图层类表现点和多点数据,使用Ren ...
- [转]World Wind Java开发之四——搭建本地WMS服务器
在提供地理信息系统客户端时,NASA还为用户提供了开源的WMS Server 服务器应用:World Wind WMS Server.利用这个应用,我们可以架设自己的WMS服务并使用自己的数据(也支持 ...
- World Wind Java开发之十——AnalyticSurface栅格渲染(转)
http://blog.csdn.net/giser_whu/article/details/43017881 1.AnalyticSurfaceDemo ArcGIS下对栅格的各种分级渲染效果是非常 ...
- World Wind Java开发之四——搭建本地WMS服务器(转)
在提供地理信息系统客户端时,NASA还为用户提供了开源的WMS Server 服务器应用:World Wind WMS Server.利用这个应用,我们可以架设自己的WMS服务并使用自己的数据(也支持 ...
- java 保存和读取本地json文件
保存数据到本地文件 private void saveDataToFile(String fileName,String data) { BufferedWriter writer = null; F ...
- World Wind Java开发之六——解析shape文件(转)
http://blog.csdn.net/giser_whu/article/details/41647117 最近一直忙于导师项目的事情了,几天没更新了,昨天和今天研究了下WWJ解析shp文件的源代 ...
- World Wind Java开发之一(转)
http://blog.csdn.net/giser_whu/article/details/40477235 参照<World wind Java三维地理信息系统开发指南随书光盘>以及官 ...
- JAVA读取本地html文件里的html文本
/** * 读取本地html文件里的html代码 * @param file File file=new File("文件的绝对路径") * @return */ public s ...
随机推荐
- Go:Nsq消息队列
Nsq服务端简介 在使用Nsq服务之前,还是有必要了解一下Nsq的几个核心组件整个Nsq服务包含三个主要部分 nsqlookupd 先看看官方的原话是怎么说:nsqlookupd是守护进程负责管理拓扑 ...
- 使用 PHPMailer 发送邮件出现诡异bug,间歇性发送失败
场景 使用PHPMailer的SMTP发送邮件,用的是腾讯企业邮箱 smtp.exmail.qq.com 在邮箱设置里看到配置smtp方法 问题描述 本地windows开发环境发送邮件100%成功 远 ...
- python文件名匹配
待匹配文件:#FY3D_IPMNT_GBAL_L1_20180516_0003_030KM_MS.HDF 干扰文件:#FY3D_IPMNT_GBAL_L1_20180516_0003_030KM_MS ...
- 洛谷P4707 重返现世(扩展MinMax容斥+dp)
传送门 我永远讨厌\(dp.jpg\) 前置姿势 扩展\(Min-Max\)容斥 题解 看纳尔博客去→_→ 咱现在还没搞懂为啥初值要设为\(-1\)-- //minamoto #include< ...
- BUYING FEED
Problem F: F BUYING FEED Description Farmer John needs to travel to town to pick up K (1 <= K < ...
- win下rabbitmq的安装
安装erlang 10.4 和 rabbitmq 3.7.5 然后关闭rabbitmq服务 然后设置 erlang和rabbitmq的环境变量 ERLANG_HOME=erlang安装目录 RABBI ...
- 6、kvm克隆虚拟机
kvm克隆有两种方法可以使用先暂停kvm虚拟机 virsh suspend privi-server 方法一:对虚拟机本身直接clone virt-clone -o privi-server -n p ...
- (转)linux内核参数注释与优化
linux内核参数注释与优化 原文:http://blog.51cto.com/yangrong/1321594 http://oldboy.blog.51.cto.com/2561410/13364 ...
- 新手写AIDL构建失败:...aidl.exe'' finished with non-zero exit value 1
最近学习aidl,写demo后编译报错,跟着<Android开发艺术探索>以及网上的一些aidl详解博客敲完后一直编译不过,错误日志如下: Process 'command 'C:\Use ...
- SSRF总结
ssrf漏洞,全称为服务端请求伪造漏洞,由于有的web应用需要实现从其它服务器上获取资源的功能,但是没有对url进行限制,导致可以构造非本意的url对内网或者其它服务器发起恶意请求.ssrf漏洞的危害 ...