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. MCP|WJ|Identification of candidate plasma protein biomarkers for cervical cancer using the multiplex proximity extension assay(利用多重邻位延伸分析技术进行宫颈癌血浆蛋白候选生物标记物的鉴定研究)

    文献名:Identification of candidate plasma protein biomarkers for cervical cancer using the multiplex pr ...

  2. php数组处理函数

    array_reverse()数组反向排序,$arr=array_reverse($arr)

  3. py---------socketserver

    同时两个客户端连接, server 不能有input server端根据client端的要求去执行固定的代码 server.py #-*- coding:utf-8 -*- import time i ...

  4. 019 Remove Nth Node From End of List 删除链表的倒数第N个节点

    给定一个链表,删除链表的倒数第 n 个节点并返回头结点.例如,给定一个链表: 1->2->3->4->5, 并且 n = 2.当删除了倒数第二个节点后链表变成了 1->2 ...

  5. windows 7 elasticsearch-5.3.2

    # windows elasticsearch- D:\nescafe\elasticsearch-\bin λ java -version java version "1.8.0_121& ...

  6. Storm概念学习系列之什么是实时流计算?

    不多说,直接上干货! 什么是实时流计算?    1.实时流计算背景 2.实时计算应用场景 3.实时计算处理流程 4.实时计算框架 什么是实时流计算? 所谓实时流计算,就是近几年由于数据得到广泛应用之后 ...

  7. Spring Cloud微服务初探

    学习初衷 因为加了不少优秀的知识星球,结交了更多的小伙伴,加了更多的群,每每在自我介绍的时候,都说自己是Android & Java攻城狮. 然鹅,有的小伙伴就来问了,你是搞Java的,那对S ...

  8. 性能测试学习第十天_controller

    集合点设置 controller虚拟多个用户执行脚本启动步骤不一定同步,集合点在脚本的某处设置一个标记,当有虚拟用户运行到这个标记的时候,停下等待所有用户都达到这个标记,再一同进行下面的步骤.这样可以 ...

  9. Javascript常见问题

    倒计时 <Script Language="JavaScript"> var timedate= new Date("October 1,2002" ...

  10. P1868 饥饿的奶牛

    题目描述 有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字. 现用汉语翻译为: 有N个区间,每个区间x,y表示提供的x~y共y-x+1堆优质牧草.你可以选择任意区间但不能有 ...