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. PostFX v2后期处理特效包:升级更惊艳的视觉效果

    https://mp.weixin.qq.com/s/BMkLLuagbhRSWspzeGhK7g Post-Processing Stack后期处理特效包能够轻松创建和调整高质量视觉效果,实现更为惊 ...

  2. cf811C(预处理&dp)

    题目链接: http://codeforces.com/problemset/problem/811/C 题意: 给一个有n个人排队上车,去相同地方的人要么坐在同一个车厢,要不就不上车,问最大舒适度和 ...

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

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

  4. luoguP4921 情侣?给我烧了!

    luogu 考虑对于\(n\)对情侣,恰好\(k\)对是和谐的方案数是 \[ ans[n][k]=\binom{n}{k}A^k_n2^kg(n-k) \] \(g(n)\)为全部\(n\)对情侣不和 ...

  5. Linux表面工作

    https://www.cnblogs.com/welhzh/p/5899875.html 1.显示文本文件的内容 /etc/issue   #登录前提示 /etc/motd   #登录后提示 ssh ...

  6. Migration-添加表(加外键)

    public partial class _222 : DbMigration { public override void Up() { //DropForeignKey("dbo.Ass ...

  7. Processes and Application Life Cycle

    进程的生命期 Android系统会尽量维持一个进程的生命,直到最终需要为新的更重要的进程腾出内存空间.为了决定哪个该杀哪个该留,系统会跟据运行于进程内的组件的和组件的状态把进程置于不同的重要性等级.当 ...

  8. Mysql 如何设置字段自动获取当前时间,附带添加字段和修改字段的例子

    --添加CreateTime 设置默认时间 CURRENT_TIMESTAMP  ALTER TABLE `table_name`ADD COLUMN  `CreateTime` datetime N ...

  9. win8.1x64下完美运行IE6

    IE6我相信是所有前端人员永远都绕不过去的坎,操作的版本越来越高,离xp越来越远,难道你还在win8下安装个虚拟机来运行IE6吗?这样即消耗系统资源,来回的切换也麻烦,关键是只为了一个测试哦,没必要这 ...

  10. ngnix入门配置

    文件1.首先到ngnix下载页面下载你操作系统对应的ngnix压缩包    http://nginx.org/en/download.html 博主我是window10操作系统  上面是我解压之后放的 ...