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文件即可构建三维场景。欢迎大家留言交流,需要的请留邮箱!

最新文章

  1. 因为多余jar包,所报的错
  2. 洛谷P1111 修复公路
  3. Java Web之会话技术
  4. R语言学习笔记:绘制地图
  5. Objective-C:三种文件导入的方式以及atomic和nonatomic的区别
  6. Vmware 中安装 Ubuntu Server (或者ubuntu 以文本界面登陆时) 分辨率无法全屏问题
  7. Junit4学习(三)Junit运行流程
  8. Dynamics CRM Trace Reader for Microsoft Dynamics CRM
  9. 从零开始学Web之HTML(二)标签、超链接、特殊符号、列表、音乐、滚动、head等
  10. 【洛谷P2257】YY的GCD
  11. access十万级数据分页
  12. 一条命令,根据进程名判断有进程输出up,无进程无输出
  13. Asp.Net MVC2.0 Url 路由入门---实例篇 【转】
  14. Linux wget 命令下载文件
  15. Mongodb下载、安装、配置与使用
  16. 不用中间变量,交换a、b值
  17. Azure 镜像市场发布商指南
  18. CodeForces - 725D Contest Balloons 贪心
  19. GridEh Lookup
  20. FIsherman丶Team

热门文章

  1. Libvirt外部快照
  2. Zjoi2011 看电影
  3. SSM+Druid的搭建
  4. 基于SSL加密的vsftpd 服务器搭建和配置
  5. js 中的 for 循环。。。
  6. angular双向绑定与单向绑定的写法区别
  7. Luogu P4161 [SCOI2009]游戏 数论+DP
  8. Gym 100971B Derangement
  9. UnityError AnimationEvent 'NewEvent' has no receiver! Are you missing a component?
  10. Soup协议-即普通post请求,内容域xml