http://blog.csdn.net/giser_whu/article/details/41679515

首先,看下本篇博客要达到的效果图:

下面逐步分析如何加载影像及高程文件。

1、WorldWind Java导入数据包

在src源码文件中找到dataimport包,这个包里面的示例代码演示了如何向WW上加载影像及高程文件。可以看到有import和install两种方式,import是简单的以图层的形式加载到WW上;install是指当文件较大时,将文件以本地缓存的方式加载,这里先以import方式导入影像及高程文件。源码比较简单,这里就不再过多解析了。

2、WWJ加载影像文件

直接给出源码,注释很清晰,不再赘述
  1. /**
  2. *
  3. * @方法名称: importImagery ;
  4. * @方法描述: 导入影像文件 ;
  5. * @参数 :@param imageFilePath :影像文件路径
  6. * @参数 :@param worlGlCanvas :WorldWind 画布对象
  7. * @返回类型: void ;
  8. * @创建人:奔跑的鸡丝 ;
  9. * @创建时间:2014-12-2 下午3:12:30;
  10. * @throws
  11. */
  12. private void importImagery(String imageFilePath,
  13. final WorldWindowGLCanvas worlGlCanvas)
  14. {
  15. try
  16. {
  17. // 读取数据并将其保存在一个缓存文件夹中
  18. File sourceFile = ExampleUtil.saveResourceToTempFile(imageFilePath,
  19. ".tif");
  20. /**
  21. * 首先创建一个raster reader读取栅格文件。raster reader由当前的栅格数据读取工作空间来创建
  22. */
  23. DataRasterReaderFactory readerFactory = (DataRasterReaderFactory) WorldWind.createConfigurationComponent(AVKey.DATA_RASTER_READER_FACTORY_CLASS_NAME);
  24. DataRasterReader reader = readerFactory.findReaderFor(sourceFile,
  25. null);
  26. // 读取栅格数据之前,先验证改文件包含imagery
  27. AVList metadata = reader.readMetadata(sourceFile, null);
  28. if (metadata == null
  29. || !AVKey.IMAGE.equals(metadata.getStringValue(AVKey.PIXEL_FORMAT)))
  30. throw new Exception("Not an image file.");
  31. /**
  32. * 将文件读取到DataRaster中,如果读取的源文件中中包含多种文件类型,read可能返回多种raster
  33. * 但是在这种情况下之使用返回的raster数组中的第一个元素
  34. */
  35. DataRaster[] rasters = reader.read(sourceFile, null);
  36. if (rasters == null || rasters.length == 0)
  37. throw new Exception("Can't read the image file.");
  38. DataRaster raster = rasters[0];
  39. /**
  40. * 获取影像的经纬度范围;改信息在GeoTIFF文件或其附属文件中
  41. */
  42. final Sector sector = (Sector) raster.getValue(AVKey.SECTOR);
  43. if (sector == null)
  44. throw new Exception("No location specified with image.");
  45. /**
  46. * 获取包含整幅影像的子栅格。这一步是必须的,因为只有子栅格影像才可以重投影;
  47. */
  48. int width = raster.getWidth();
  49. int height = raster.getHeight();
  50. /**
  51. * getSubRaster()方法返回一个特定范围的栅格影像;影像大小可以自定义
  52. */
  53. DataRaster subRaster = raster.getSubRaster(width, height, sector,
  54. null);
  55. /**
  56. * 删除原栅格数据
  57. */
  58. raster.dispose();
  59. /**
  60. * 验证子栅格是否可以创建缓存影像,可以则创建一个缓存栅格影像
  61. */
  62. if (!(subRaster instanceof BufferedImageRaster))
  63. throw new Exception("Cannot get BufferedImage.");
  64. BufferedImage image = ((BufferedImageRaster) subRaster).getBufferedImage();
  65. /**
  66. * 删除子栅格影像
  67. */
  68. subRaster.dispose();
  69. /**
  70. * 创建一个表面影像在指定的经纬度范围内显示该影像
  71. */
  72. final SurfaceImage surfaceImage = new SurfaceImage(image, sector);
  73. /**
  74. * 在新开启的线程中导入影像数据,作为一个surfaceLayer
  75. */
  76. SwingUtilities.invokeLater(new Runnable()
  77. {
  78. public void run()
  79. {
  80. // 添加surfaceLayer
  81. SurfaceImageLayer surfaceImageLayer = new SurfaceImageLayer();
  82. surfaceImageLayer.setName("Imported Surface Image");
  83. surfaceImageLayer.setPickEnabled(false);
  84. surfaceImageLayer.addRenderable(surfaceImage);
  85. // 添加该图层到globe中
  86. worldWindowGLCanvas.getModel().getLayers().add(
  87. surfaceImageLayer);
  88. // 飞行到当前影像视图内
  89. ExampleUtil.goTo(worlGlCanvas, sector);
  90. }
  91. });
  92. }
  93. catch (Exception e)
  94. {
  95. e.printStackTrace();
  96. }
  97. }

这里栅格数据的读取类似ArcEngine中的工作空间的概念;另外需要注意Sector类是表述由经纬度包含的范围。

3、WWJ加载高程文件

  1. /**
  2. *
  3. * @方法名称: importElevation ;
  4. * @方法描述: 导入高程数据 ;
  5. * @参数 :@param elevationFilePath :高程文件路径
  6. * @参数 :@param wGlCanvas :WW画布对象
  7. * @返回类型: void ;
  8. * @创建人:奔跑的鸡丝 ;
  9. * @创建时间:2014-12-2 下午4:42:26;
  10. * @throws
  11. */
  12. private void importElevation(String elevationFilePath,
  13. WorldWindowGLCanvas wGlCanvas)
  14. {
  15. try
  16. {
  17. File sourceFile = ExampleUtil.saveResourceToTempFile(
  18. elevationFilePath, ".tif");
  19. // 由数据源创建一个高程模型:LocalElevationModel
  20. final LocalElevationModel elevationModel = new LocalElevationModel();
  21. elevationModel.addElevations(sourceFile);
  22. SwingUtilities.invokeLater(new Runnable()
  23. {
  24. public void run()
  25. {
  26. // 获取WW当前的高程模型
  27. Globe globe = worldWindowGLCanvas.getModel().getGlobe();
  28. ElevationModel currentElevationModel = globe.getElevationModel();
  29. // 将新创建的高程模型加入Globe中(也可以是取代当前的高程模型)
  30. if (currentElevationModel instanceof CompoundElevationModel)
  31. ((CompoundElevationModel) currentElevationModel).addElevationModel(elevationModel);
  32. else
  33. globe.setElevationModel(elevationModel);
  34. // 飞行至当前视图
  35. Sector modelSector = elevationModel.getSector();
  36. ExampleUtil.goTo(worldWindowGLCanvas, modelSector);
  37. }
  38. });
  39. }
  40. catch (Exception e)
  41. {
  42. e.printStackTrace();
  43. }
  44. }

运行后,加载影像和相应的DEM文件即可构建三维场景。欢迎大家留言交流,需要的请留邮箱!

World Wind Java开发之七——读取本地栅格文件(影像+高程)构建三维场景(转)的更多相关文章

  1. [转]World Wind Java开发之五——读取本地shp文件

    World Wind Java 使用IconLayer图层类表现点和多点数据,使用RenderableLayer图层表现线和面数据,一个图层只能对应一组shape文件.World Wind Java首 ...

  2. World Wind Java开发之五——读取本地shp文件(转)

    http://blog.csdn.net/giser_whu/article/details/41484433 World Wind Java 使用IconLayer图层类表现点和多点数据,使用Ren ...

  3. [转]World Wind Java开发之四——搭建本地WMS服务器

    在提供地理信息系统客户端时,NASA还为用户提供了开源的WMS Server 服务器应用:World Wind WMS Server.利用这个应用,我们可以架设自己的WMS服务并使用自己的数据(也支持 ...

  4. World Wind Java开发之十——AnalyticSurface栅格渲染(转)

    http://blog.csdn.net/giser_whu/article/details/43017881 1.AnalyticSurfaceDemo ArcGIS下对栅格的各种分级渲染效果是非常 ...

  5. World Wind Java开发之四——搭建本地WMS服务器(转)

    在提供地理信息系统客户端时,NASA还为用户提供了开源的WMS Server 服务器应用:World Wind WMS Server.利用这个应用,我们可以架设自己的WMS服务并使用自己的数据(也支持 ...

  6. java 保存和读取本地json文件

    保存数据到本地文件 private void saveDataToFile(String fileName,String data) { BufferedWriter writer = null; F ...

  7. World Wind Java开发之六——解析shape文件(转)

    http://blog.csdn.net/giser_whu/article/details/41647117 最近一直忙于导师项目的事情了,几天没更新了,昨天和今天研究了下WWJ解析shp文件的源代 ...

  8. World Wind Java开发之一(转)

    http://blog.csdn.net/giser_whu/article/details/40477235 参照<World wind Java三维地理信息系统开发指南随书光盘>以及官 ...

  9. JAVA读取本地html文件里的html文本

    /** * 读取本地html文件里的html代码 * @param file File file=new File("文件的绝对路径") * @return */ public s ...

随机推荐

  1. 历届试题_log大侠

    标题:Log大侠     atm参加了速算训练班,经过刻苦修炼,对以2为底的对数算得飞快,人称Log大侠.     一天,Log大侠的好友 drd 有一些整数序列需要变换,Log大侠正好施展法力... ...

  2. webpack@3.6.0(3)-- 优化

    本篇内容 babel配置 打包调试 第三方资源引入 静态资源的集中输出 babel配置 cnpm i -D babel-core babel-loader babel-preset-es2015 // ...

  3. 上传文件到linux乱码问题

    由于linux系统编码一般设置为utf-8,而中文windows下通常默认编码是gbk,因此经常需要将文件名或文件内容编码进行转换,文件名编码转换软件:convmv yum install convm ...

  4. vue-cli 使用sass(scss)

    安装依赖: npm install sass-loader node-sass vue-style-loader --save-dev

  5. 求第 i 个素数 Meissel Lehmer Algorithm + 二分 【模板】

    1473: L先生与质数V3 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1348  Solved: 147 [Submit][Status][Web ...

  6. 点击对应的a标签返回相应的第几个

    面试中遇到的问题,前两天一直没有解决,今天想想还是得要想办法才行,其实仔细想的话很简单,惭愧啊,面试的时候没有做出来! 题目是这样的,如果一个body中有5个a标签,当我们点击对应的a标签时,aler ...

  7. Codeforces Round #467(Div2)题解

    凌晨起来打CF,0:05,也是我第一次codeforces 第一题: 我刚开始怀疑自己读错题了,怎么会辣么水. 判除了0的数字种类 #include <cstdio> ; ]; int m ...

  8. Unity Unity脚本类为什么要尽量避免继承MonoBehaviour类?

  9. Zookeeper问题汇总

    1. 遗留问题 a). zookeeper集群如何保证请求的均匀分布? 2. ZK概念澄清 2.1 ZK节点类型 CreateMode.PERSISTENT //持久节点,该节点客户端断开后不会删除 ...

  10. 张高兴的 .NET Core IoT 入门指南:(四)使用 SPI 进行通信

    什么是 SPI 和上一篇文章的 I2C 总线一样,SPI(Serial Peripheral Interface,串行外设接口)也是设备与设备间通信方式的一种.SPI 是一种全双工(数据可以两个方向同 ...