读取本地栅格文件(影像+高程)构建三维场景

/** * * @方法名称: importImagery ; * @方法描述: 导入影像文件 ; * @参数 :@param imageFilePath :影像文件路径 * @参数 :@param worlGlCanvas :WorldWind 画布对象 * @返回类型: void ; * @创建人:奔跑的鸡丝 ; * @创建时间:2014-12-2 下午3:12:30; * @throws */private void importImagery(String imageFilePath,final WorldWindowGLCanvas worlGlCanvas){try{// 读取数据并将其保存在一个缓存文件夹中File sourceFile = ExampleUtil.saveResourceToTempFile(imageFilePath,".tif");/*** 首先创建一个raster reader读取栅格文件。raster reader由当前的栅格数据读取工作空间来创建*/DataRasterReaderFactory readerFactory = (DataRasterReaderFactory) WorldWind.createConfigurationComponent(AVKey.DATA_RASTER_READER_FACTORY_CLASS_NAME);DataRasterReader reader = readerFactory.findReaderFor(sourceFile,null);// 读取栅格数据之前,先验证改文件包含imageryAVList metadata = reader.readMetadata(sourceFile, null);if (metadata == null|| !AVKey.IMAGE.equals(metadata.getStringValue(AVKey.PIXEL_FORMAT)))throw new Exception("Not an image file.");/*** 将文件读取到DataRaster中,如果读取的源文件中中包含多种文件类型,read可能返回多种raster* 但是在这种情况下之使用返回的raster数组中的第一个元素*/DataRaster[] rasters = reader.read(sourceFile, null);if (rasters == null || rasters.length == 0)throw new Exception("Can't read the image file.");DataRaster raster = rasters[0];/*** 获取影像的经纬度范围;改信息在GeoTIFF文件或其附属文件中*/final Sector sector = (Sector) raster.getValue(AVKey.SECTOR);if (sector == null)throw new Exception("No location specified with image.");/*** 获取包含整幅影像的子栅格。这一步是必须的,,因为只有子栅格影像才可以重投影;*/int width = raster.getWidth();int height = raster.getHeight();/*** getSubRaster()方法返回一个特定范围的栅格影像;影像大小可以自定义*/DataRaster subRaster = raster.getSubRaster(width, height, sector,null);/*** 删除原栅格数据*/raster.dispose();/*** 验证子栅格是否可以创建缓存影像,可以则创建一个缓存栅格影像*/if (!(subRaster instanceof BufferedImageRaster))throw new Exception("Cannot get BufferedImage.");BufferedImage image = ((BufferedImageRaster) subRaster).getBufferedImage();/*** 删除子栅格影像*/subRaster.dispose();/*** 创建一个表面影像在指定的经纬度范围内显示该影像*/final SurfaceImage surfaceImage = new SurfaceImage(image, sector);/*** 在新开启的线程中导入影像数据,作为一个surfaceLayer*/SwingUtilities.invokeLater(new Runnable(){public void run(){// 添加surfaceLayerSurfaceImageLayer surfaceImageLayer = new SurfaceImageLayer();surfaceImageLayer.setName("Imported Surface Image");surfaceImageLayer.setPickEnabled(false);surfaceImageLayer.addRenderable(surfaceImage);// 添加该图层到globe中worldWindowGLCanvas.getModel().getLayers().add(surfaceImageLayer);// 飞行到当前影像视图内ExampleUtil.goTo(worlGlCanvas, sector);}});}catch (Exception e){e.printStackTrace();}}这里栅格数据的读取类似ArcEngine中的工作空间的概念;另外需要注意Sector类是表述由经纬度包含的范围。

伟人之所以伟大,是因为他与别人共处逆境时,

读取本地栅格文件(影像+高程)构建三维场景

相关文章:

你感兴趣的文章:

标签云: