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. neutron负载均衡高可用测试

    对工作中,实验环境的一个小总结 1.创建高可用负载均衡器------创建高可用的时候,添加上ha-mode参数即可 neutron lb-pool-create --lb-method ROUND_R ...

  2. python之02数据类型学习

    参考链接:http://www.cnblogs.com/yuanchenqi/articles/5782764.html python的数据类型有:Number.Boolean.String .Lis ...

  3. [Xcode 实际操作]四、常用控件-(8)UITextField控件的使用

    目录:[Swift]Xcode实际操作 本文将演示文本输入框控件的基本用法. 文本输入框主要用来接收和显示用户输入的内容. 在项目导航区,打开视图控制器的代码文件[ViewController.swi ...

  4. 洛谷P2025 脑力大人之监听电话

    题目描述 话说埃菲尔铁塔小区的房子只有一栋,且只有一层,其中每一家都装有一个监听器,具体地,如果编号为第i家的人给编号第\(j\)家的人打了电话,\(i \leq j\),当然,也会有些人无聊地自己给 ...

  5. 无法访问http,会强制跳到https

    1. Close Safari. 2. Delete the ~/Library/Cookies/HSTS.plist file. 3. Reopen Safari.

  6. P3823_[NOI2017]蚯蚓排队 哈希+脑子

    之前就写过一遍,今天却写挂了,查了半天发现是数组名写错啦$qwq$ 观察到$K$很小,所以使得我们可以哈希(怎么什么都能哈希$qwq$).我们把长度小于等于$50$的子串扔到哈希表里,并统计出现次数, ...

  7. 2017年江西理工大学C语言程序设计竞赛(初级组)

    问题 A: Petr的盒子(初) #include <iostream> #include <stdio.h> #include <algorithm> using ...

  8. 【ACM】括号配对问题 - 栈

    括号配对问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 现在,有一行括号序列,请你检查这行括号是否配对.   输入 第一行输入一个数N(0<N<=1 ...

  9. Android子线程更新UI成功

    android子线程更新UI成功 今天在写demo的时候,在子线程中更新UI,发现更新成功,记录一下. protected void onCreate(Bundle savedInstanceStat ...

  10. WebSocket协议入门介绍

    目录 目录 WebSocket协议是什么 WebSocket是应用层协议 WebSocket与Http的区别 为什么要使用WebSocket 如何使用WebSocket 客户端API 在客户端使用We ...