首先,看下本篇部落格要達到的效果圖:

1、WorldWind Java導入資料包
在src源碼檔案中找到dataimport包,這個包裡面的示例代碼示範了如何向WW上加載影像及高程檔案。可以看到有import和install兩種方式,import是簡單的以圖層的形式加載到WW上;install是指當檔案較大時,将檔案以本地緩存的方式加載,這裡先以import方式導入影像及高程檔案。源碼比較簡單,這裡就不再過多解析了。
2、WWJ加載影像檔案
直接給出源碼,注釋很清晰,不再贅述
[java] view plain copy
print?
- /**
- *
- * @方法名稱: 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);
- // 讀取栅格資料之前,先驗證改檔案包含imagery
- AVList 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,
- * 删除原栅格資料
- 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()
- {
- // 添加surfaceLayer
- SurfaceImageLayer 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類是表述由經緯度包含的範圍。
3、WWJ加載高程檔案
- * @方法名稱: importElevation ;
- * @方法描述: 導入高程資料 ;
- * @參數 :@param elevationFilePath :高程檔案路徑
- * @參數 :@param wGlCanvas :WW畫布對象
- * @建立時間:2014-12-2 下午4:42:26;
- private void importElevation(String elevationFilePath,
- WorldWindowGLCanvas wGlCanvas)
- File sourceFile = ExampleUtil.saveResourceToTempFile(
- elevationFilePath, ".tif");
- // 由資料源建立一個高程模型:LocalElevationModel
- final LocalElevationModel elevationModel = new LocalElevationModel();
- elevationModel.addElevations(sourceFile);
- // 擷取WW目前的高程模型
- Globe globe = worldWindowGLCanvas.getModel().getGlobe();
- ElevationModel currentElevationModel = globe.getElevationModel();
- // 将新建立的高程模型加入Globe中(也可以是取代目前的高程模型)
- if (currentElevationModel instanceof CompoundElevationModel)
- ((CompoundElevationModel) currentElevationModel).addElevationModel(elevationModel);
- else
- globe.setElevationModel(elevationModel);
- // 飛行至目前視圖
- Sector modelSector = elevationModel.getSector();
- ExampleUtil.goTo(worldWindowGLCanvas, modelSector);
運作後,加載影像和相應的DEM檔案即可建構三維場景。歡迎大家留言交流,需要的請留郵箱!