zoukankan      html  css  js  c++  java
  • World Wind Java开发之七——读取本地栅格文件(影像+高程)构建三维场景(转)

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

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

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

    1、WorldWind Java导入数据包

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

    2、WWJ加载影像文件

    直接给出源码,注释很清晰,不再赘述
    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    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.   
    16.         try  
    17.         {  
    18.             // 读取数据并将其保存在一个缓存文件夹中  
    19.             File sourceFile = ExampleUtil.saveResourceToTempFile(imageFilePath,  
    20.                     ".tif");  
    21.   
    22.             /** 
    23.              * 首先创建一个raster reader读取栅格文件。raster reader由当前的栅格数据读取工作空间来创建 
    24.              */  
    25.             DataRasterReaderFactory readerFactory = (DataRasterReaderFactory) WorldWind.createConfigurationComponent(AVKey.DATA_RASTER_READER_FACTORY_CLASS_NAME);  
    26.             DataRasterReader reader = readerFactory.findReaderFor(sourceFile,  
    27.                     null);  
    28.             // 读取栅格数据之前,先验证改文件包含imagery  
    29.             AVList metadata = reader.readMetadata(sourceFile, null);  
    30.             if (metadata == null  
    31.                     || !AVKey.IMAGE.equals(metadata.getStringValue(AVKey.PIXEL_FORMAT)))  
    32.                 throw new Exception("Not an image file.");  
    33.   
    34.             /** 
    35.              * 将文件读取到DataRaster中,如果读取的源文件中中包含多种文件类型,read可能返回多种raster 
    36.              * 但是在这种情况下之使用返回的raster数组中的第一个元素 
    37.              */  
    38.             DataRaster[] rasters = reader.read(sourceFile, null);  
    39.             if (rasters == null || rasters.length == 0)  
    40.                 throw new Exception("Can't read the image file.");  
    41.   
    42.             DataRaster raster = rasters[0];  
    43.   
    44.             /** 
    45.              * 获取影像的经纬度范围;改信息在GeoTIFF文件或其附属文件中 
    46.              */  
    47.             final Sector sector = (Sector) raster.getValue(AVKey.SECTOR);  
    48.             if (sector == null)  
    49.                 throw new Exception("No location specified with image.");  
    50.   
    51.             /** 
    52.              * 获取包含整幅影像的子栅格。这一步是必须的,因为只有子栅格影像才可以重投影; 
    53.              */  
    54.             int width = raster.getWidth();  
    55.             int height = raster.getHeight();  
    56.   
    57.             /** 
    58.              * getSubRaster()方法返回一个特定范围的栅格影像;影像大小可以自定义 
    59.              */  
    60.             DataRaster subRaster = raster.getSubRaster(width, height, sector,  
    61.                     null);  
    62.   
    63.             /** 
    64.              * 删除原栅格数据 
    65.              */  
    66.             raster.dispose();  
    67.   
    68.             /** 
    69.              * 验证子栅格是否可以创建缓存影像,可以则创建一个缓存栅格影像 
    70.              */  
    71.             if (!(subRaster instanceof BufferedImageRaster))  
    72.                 throw new Exception("Cannot get BufferedImage.");  
    73.             BufferedImage image = ((BufferedImageRaster) subRaster).getBufferedImage();  
    74.   
    75.             /** 
    76.              * 删除子栅格影像 
    77.              */  
    78.             subRaster.dispose();  
    79.   
    80.             /** 
    81.              * 创建一个表面影像在指定的经纬度范围内显示该影像 
    82.              */  
    83.             final SurfaceImage surfaceImage = new SurfaceImage(image, sector);  
    84.   
    85.             /** 
    86.              * 在新开启的线程中导入影像数据,作为一个surfaceLayer 
    87.              */  
    88.             SwingUtilities.invokeLater(new Runnable()  
    89.             {  
    90.                 public void run()  
    91.                 {  
    92.                     // 添加surfaceLayer  
    93.                     SurfaceImageLayer surfaceImageLayer = new SurfaceImageLayer();  
    94.                     surfaceImageLayer.setName("Imported Surface Image");  
    95.                     surfaceImageLayer.setPickEnabled(false);  
    96.                     surfaceImageLayer.addRenderable(surfaceImage);  
    97.   
    98.                     // 添加该图层到globe中  
    99.                     worldWindowGLCanvas.getModel().getLayers().add(  
    100.                             surfaceImageLayer);  
    101.                     // 飞行到当前影像视图内  
    102.                     ExampleUtil.goTo(worlGlCanvas, sector);  
    103.                 }  
    104.             });  
    105.         }  
    106.         catch (Exception e)  
    107.         {  
    108.             e.printStackTrace();  
    109.         }  
    110.   
    111.     }  
    这里栅格数据的读取类似ArcEngine中的工作空间的概念;另外需要注意Sector类是表述由经纬度包含的范围。

    3、WWJ加载高程文件

    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    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.   
    18.             File sourceFile = ExampleUtil.saveResourceToTempFile(  
    19.                     elevationFilePath, ".tif");  
    20.   
    21.             // 由数据源创建一个高程模型:LocalElevationModel  
    22.             final LocalElevationModel elevationModel = new LocalElevationModel();  
    23.             elevationModel.addElevations(sourceFile);  
    24.   
    25.             SwingUtilities.invokeLater(new Runnable()  
    26.             {  
    27.                 public void run()  
    28.                 {  
    29.                     // 获取WW当前的高程模型  
    30.                     Globe globe = worldWindowGLCanvas.getModel().getGlobe();  
    31.                     ElevationModel currentElevationModel = globe.getElevationModel();  
    32.   
    33.                     // 将新创建的高程模型加入Globe中(也可以是取代当前的高程模型)  
    34.                     if (currentElevationModel instanceof CompoundElevationModel)  
    35.                         ((CompoundElevationModel) currentElevationModel).addElevationModel(elevationModel);  
    36.                     else  
    37.                         globe.setElevationModel(elevationModel);  
    38.   
    39.                     // 飞行至当前视图  
    40.                     Sector modelSector = elevationModel.getSector();  
    41.                     ExampleUtil.goTo(worldWindowGLCanvas, modelSector);  
    42.                 }  
    43.             });  
    44.         }  
    45.         catch (Exception e)  
    46.         {  
    47.             e.printStackTrace();  
    48.         }  
    49.     }  
    运行后,加载影像和相应的DEM文件即可构建三维场景。欢迎大家留言交流,需要的请留邮箱!
  • 相关阅读:
    Masterha-manager避免自动关闭的方法
    MHA自动切换流程
    vue 使用keep-alive缓存tab切换组件,保持每个组件滚动条位置
    el-select 输入下拉搜索,匹配不到数据时也保留输入值,同时input获取焦点时保留其value值
    尝试 React16、React-router4 实现根据动态菜单生成按需加载的路由
    vue iscroll5滚动条组件
    vue项目中 axios请求拦截器与取消pending请求功能
    jquery编写的简单日历
    手机访问电脑wampServer本地环境页面
    ajax在ie下返回未定义解决方案
  • 原文地址:https://www.cnblogs.com/telwanggs/p/6774598.html
Copyright © 2011-2022 走看看