World Wind Java开发之七——读取本地栅格文件(影像+高程)构建三维场景

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

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

1、WorldWind Java导入数据包

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

2、WWJ加载影像文件

直接给出源码,注释很清晰,不再赘述

/**
	 *
	 * @方法名称: 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,
					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()
				{
					// 添加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画布对象
	 * @返回类型: void ;
	 * @创建人:奔跑的鸡丝 ;
	 * @创建时间:2014-12-2 下午4:42:26;
	 * @throws
	 */
	private void importElevation(String elevationFilePath,
			WorldWindowGLCanvas wGlCanvas)
	{
		try
		{

			File sourceFile = ExampleUtil.saveResourceToTempFile(
					elevationFilePath, ".tif");

			// 由数据源创建一个高程模型:LocalElevationModel
			final LocalElevationModel elevationModel = new LocalElevationModel();
			elevationModel.addElevations(sourceFile);

			SwingUtilities.invokeLater(new Runnable()
			{
				public void run()
				{
					// 获取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);
				}
			});
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

运行后,加载影像和相应的DEM文件即可构建三维场景。欢迎大家留言交流,需要的请留邮箱!

时间: 2024-10-09 22:45:28

World Wind Java开发之七——读取本地栅格文件(影像+高程)构建三维场景的相关文章

[转]World Wind Java开发之五——读取本地shp文件

World Wind Java 使用IconLayer图层类表现点和多点数据,使用RenderableLayer图层表现线和面数据,一个图层只能对应一组shape文件.World Wind Java首先使用ShapefileLoader类完成对shape文件的读取和加载,再通过createLayerFromSource方法创建RenderableLayer,最后将创建的Layer加在layers上.源码如下: /** * * 方法名称: AddShapeData : * 方法描述: 添加本地sh

World Wind Java开发之五——读取本地shp文件

World Wind Java 使用IconLayer图层类表现点和多点数据,使用RenderableLayer图层表现线和面数据,一个图层只能对应一组shape文件.World Wind Java首先使用ShapefileLoader类完成对shape文件的读取和加载,再通过createLayerFromSource方法创建RenderableLayer,最后将创建的Layer加在layers上.源码如下: /** * * 方法名称: AddShapeData : * 方法描述: 添加本地sh

World Wind Java开发之十——AnalyticSurface栅格渲染(转)

http://blog.csdn.net/giser_whu/article/details/43017881 1.AnalyticSurfaceDemo ArcGIS下对栅格的各种分级渲染效果是非常好的,可以做出很漂亮的图,现在在WW下也可以做出同样的效果了,看到这里是不是有点小兴奋呢.先看下WW自带的AnalyticSurfaceDemo的运行效果图: 通过看源代码可以知道给出了三种渲染示例,其中两种是动态的,这里我需要的是对dem数据或者是单波段影像的渲染,也就是左上方的渲染效果. 2.A

World Wind Java开发之四——搭建本地WMS服务器

在提供地理信息系统客户端时,NASA还为用户提供了开源的WMS Server 服务器应用:World Wind WMS Server.利用这个应用,我们可以架设自己的WMS服务并使用自己的数据(也支持缓存转发),这样开发的应用就不必依赖于互联网连接,也可以抛开NASA提供的数据源而独立运行. 1.准备工作 运行WWS服务器需要JDK.JOGL.GDAL包以及World Wind Server压缩包.资源已上传至WorldWind Java配置WMS服务器,请自行下载. 2.安装JDK 随便一搜都

World Wind Java开发之十——AnalyticSurface栅格渲染

1.AnalyticSurfaceDemo ArcGIS下对栅格的各种分级渲染效果是非常好的,可以做出很漂亮的图,现在在WW下也可以做出同样的效果了,看到这里是不是有点小兴奋呢.先看下WW自带的AnalyticSurfaceDemo的运行效果图: 通过看源代码可以知道给出了三种渲染示例,其中两种是动态的,这里我需要的是对dem数据或者是单波段影像的渲染,也就是左上方的渲染效果. 2.AnalyticSurface类 下面来看下主要用到的类: 主要用到的方法: // 创建AnalyticSurfa

World Wind Java开发之六——解析shape文件(上)

最近一直忙于导师项目的事情了,几天没更新了,昨天和今天研究了下WWJ解析shp文件的源代码,现在记录下,希望可以帮到更多的人! 上一篇博客:World Wind Java开发之五--读取本地shp文件只讲了如何加载shp文件,没有涉及到shp文件的解析,我们这篇博客紧接上一篇博客,利用WWJ来解析shp文件.首先来看用到的源码包和相关类,如下图所示.解析shp文件主要用到Shapefile(shapefile文件类).ShapefileRecord(shape文件记录类).DBaseRecord

World Wind Java开发之一

参照<World wind Java三维地理信息系统开发指南随书光盘>以及官网论坛,开始学习World Wind Java开发. 第一个demo //基础类 public class VGE_GFBasicClass extends JFrame { protected WorldWindowGLCanvas worldWindowGLCanvas; //WorldWind 画布 protected StatusBar statusBar; //状态栏 protected Model mode

java开发中截取上传文件的文件名和后缀名

java开发中截取上传文件的文件名和后缀名 /** * Return the extension portion of the file's name . * * @see #getExtension */ public static String getExtension(File f) { return (f != null) ? getExtension(f.getName()) : ""; } public static String getExtension(String f

UWP 读取本地XML文件

读取本地XML文件时要将xxx.xml文件的“生成操作”改为“嵌入的资源”会比较好,在手机上运行的话需要改为“内容” <?xml version="1.0" encoding="utf-8"?> <DataSet xmlns="http://WebXml.com.cn/"> <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata