基于AE与IDL洪水淹没范围估测与模拟系统设计
2018-04-27吴勇拓毕京佳徐丽雯
吴勇拓,毕京佳,徐丽雯
(1.山东电力工程咨询院有限公司,山东 济南 250013; 2. 中国科学院海洋研究所,山东 青岛 266071;3. 青岛恒天翼信息科技有限公司,山东 青岛 266061; 4.中国科学院大学,北京 100049)
工具型软件系统(如ENVI、ArcGIS)虽然有强大的数据处理分析功能,但从应用角度来讲,成本太高,并且许多功能用不到,造成资源浪费。为了提高软件的利用效率,降低开发成本,应用过程中往往采取二次开发的方式,利用现有软件功能进行重新组合和扩展,开发符合特定应用需求的应用型软件。
1 技术支持
为了实现ArcGIS与IDL的一体化开发,需要借助第三方的编程语言。微软公司研发的.NET框架及其主要的集成语言C#以其使用的灵活性及简便性成为首选。
1.1 .NET框架
.NET框架(.NET Framework)是由微软研发的一个致力于快捷开发的软件开发平台[1,2]。它是一个集成多种语言的组件开发系统和执行系统,为跨语言编程提供一个统一的编程环境[3]。.NET框架的结构可以分为3个层次:服务框架、公共语言运行时以及两类应用模板(即Windows应用程序模板和基于ASP NET的Web网络应用程序模板)[4]。
C#是微软发布的一种编程语言,是微软公司.NET框架的主角,与COM组件对象模型是直接集成的。C#语言是在.NET框架下进行组件开发的首选语言。
1.2 ArcGIS Engine与ENVI/IDL
ArcGIS Engine可以提供应用型GIS软件所必须的空间分析能力,使开发人员将精力集中到软件特定逻辑的构建上。ArcGIS Engine也可以将GIS功能嵌入到商业生产应用软件中,如Microsoft Word和Excel。使用Desktop开发的产品如果交付给用户使用,用户需要配置一套桌面软件。而对于ArcGIS Engine开发的产品,用户只需要一个相应功能授权的Runtime即可。
IDL是一种进行数据分析和构建图像化应用的程序及编程语言[5]。IDL语言功能强大,很多时候只需几行代码就可以实现复杂的功能,并且语法简单易学。这些优点使IDL语言成为进行可视化表达、跨平台应用开发以及科学数据分析的理想工具。ENVI软件是在IDL基础上开发出来的,使用ENVI/IDL既可以调用IDL丰富的分析工具包,同时可以使用ENVI提供的函数,从而实现基于ENVI的数据处理分析和可视化程序的二次开发。
1.3 在.NET框架中搭建一体化平台
ENVI/IDL和ArcGIS Engine结合高级语言C#,可以在.NET框架下搭建GIS与RS一体化的应用平台。程序员可以在C#环境中,通过添加引用,调用属于AE和ENVI的函数,从而在C#环境中实现AE和ENVI的处理功能。除了添加引用调用AE和ENVI函数,还可以添加AE和ENVI/IDL提供的可视化插件,调用AE和ENVI/IDL的功能。AE和ENVI/IDL还提供了各种控件,实现地图显示、地图输出、三维地图显示、图层管理、许可管理等功能[6]。图形化操作简化了编程难度。
2 系统设计与实例
2.1 系统总体设计
系统集成了遥感影像处理与GIS数据分析两部分功能,整体上可以分为3个层次:数据层、技术支撑层和操作层[7](图 1)。
数据层使用不同的数据文件分别存储GIS数据、遥感数据和水文数据。
技术支撑层是功能实现的核心。使用.NET框架进行整体架构,C#语言进行程序组织和算法编写,利用ArcGIS Engine提供的组件功能处理GIS数据,进行制图输出,用ENVI/IDL提供的组件功能处理遥感影像,提取洪水信息[8]。
操作层是用户使用系统功能的接口,用C#语言编写图形化程序界面,方便用户使用[9]。
图1 系统总体框架图
2.2 系统功能设计
系统包括文件操作、影像预处理、痕迹提取、淹没计算、制图输出和帮助6个模块,如图2。每个模块又分为若干个功能,每个模块的具体功能如下所述。
图2 系统功能模块
1)文件操作。该模块为对地图文件的操作,包括打开和保存地图文件、数据加载与移除、平移、放大、缩小、前后视图与全图、刷新等基本操作操作。主要由ArcGIS Engine提供的控件与组件实现。
2)影像预处理。主要包括两部分:遥感影像加载功能(即波段合成、重采样、投影转换等)和遥感影像的预处理功能(即影像裁剪与镶嵌、大气校正、地形校正、云层处理等)。该模块实现遥感影像数据的前期处理,主要由ENVI/IDL提供的函数实现。
3)痕迹提取。包括3个部分:指数计算、差异计算和痕迹斑块提取。指数计算包括对比值植被指数(RVI)、归一化植被指数(NDVI)、土壤调节植被指数(MSAVI)以及土壤光谱反射率的计算。差异计算包括计算洪水前后植被指数差异和输出指数差异分布统计。痕迹斑块提取功能根据用户设定阈值提取洪水痕迹斑块。
4)淹没计算。包括两个部分:淹没估测和淹没模拟。淹没估测功能可以根据用户输入的洪水痕迹斑块及相应区域的DEM高程数据估算出洪水的最大淹没范围。淹没模拟功能是根据用户输入的淹没起始点位置信息和最高水位、DEM数据进行洪水淹没范围的模拟。淹没计算的结果包括淹没范围和淹没水位高程两个文件。
5)制图输出。该模块包括两个功能:地图制图和三维可视化。地图制图包括设置地图格网、设置地图框架属性(边框、阴影、背景等)、添加地图整饰对象(图例、指北针、比例尺等)。三维可视化实现地形数据和淹没结果的三维渲染、叠加展示和图形输出。包括对三维视图窗口的平行移动、立体旋转、前后移动、拉伸、地形渲染、水面渲染、自动旋转和保存三维场景图等功能。
2.3 应用实例
使用.NET框架下的AE与IDL一体化开发技术,在Visual Studio开发工具中搭建了一体化开发的平台,编程实现了系统的部分功能,证明了一体化开发的实用性和便捷性。
具体开发运行环境如下:
操作系统:Microsoft Windows 7;
混编平台:Visual Studio 2010 + .NET Framework 4.5 + C#
GIS平台:ArcGIS 10.1 + ArcGIS Engine 10.1
RS平台:ENVI 5.1 + IDL 8.3
2.3.1 指数计算
指数计算本质上是对多波段的遥感影像进行波段计算,使用ENVI/IDL提供的图像处理函数会大大降低编程难度。首先在IDL中编写指数计算的类对象。IDL中的类对象包括定义和函数两部分。类定义相当于构造函数,定义了类的名称和参数接口。函数是类的功能体。
指数计算类的定义语句如下:
PRO OBJECT_ENVI_VICACULATE_DEFINE
void = {Object_ENVI_VICaculate, $
inFileName : '', $
outFileName : '' $
}
END
Obiect_envi_vicaculate类在构造时需要传入两个参数:文件打开路径和文件保存路径。这两个路径参数由C#编写的界面获得。
具体的指数计算由Obiect_envi_vicaculate类的各个功能函数完成(图3),包括:Obiect_ENVI_VICaculate::EXECUTENDVICaculate(NDVI计算函数)
图3 指数计算界面
Obiect_ENVI_VICaculate::EXECUTERVICaculate(RVI计算函数)
Obiect_ENVI_VICaculate::EXECUTEMSAVICaculate(MSAVI计算函数)
Obiect_ENVI_VICaculate::EXECUTESRCaculate(土壤光谱反射率计算函数)
在IDL中完成指数计算功能的编写后,便可以使用C#进行调用。首先需要使用COM_IDL_CONNECT组件提供的CreateObiect 方法进行ENVI的初始化,具体语句如下:
COM_IDL_connectLib.COM_IDL_connectClass oComIDL= new COM_IDL_connectLib.COM_IDL_connectClass();oComIDL.CreateObject(0, 0, 0);
然后使用COM_IDL_CONNECT组件提供的ExecuteString方法建立并调用Obiect_envi_vicaculate对象,用法相当于IDL中的命令行语句,具体如下:
oComIDL.ExecuteString(".compile '" + path +
@"object_envi_vicaculate_def i ne.pro'");
oComIDL.ExecuteString(@"s = obj_new('object_envi_vicaculate','"
+ inPath + "','" + outPath + "')");
oComIDL.ExecuteString("s.EXECUTENDVICACULATE");oComIDL.ExecuteString("Obj_destroy,s");2.3.2 淹没估测与模拟
洪水淹没与估测采用八方向种子淹没算法,算法详见文献[10]。现从算法实现的角度来描述。
需要用户从界面输入的参数包括:种子文件(点)信息、DEM数据文件和保存路径,具体如图3所示。
图4 淹没估测界面
首先将输入的栅格数据转化为二维数组。使用ArcGIS Engine提供的IRasterWorkspace接口可以直接打开栅格数据,然后使用IRaster、IRasterProps、IPixelBlock接口提取栅格数据中的像元值存储到Array二维数组中,然后便可以使用C#编写的淹没估测、淹没模拟算法进行计算(图5)。计算的结果是新的二维数组,还需要通过上面提到的AE接口转化成带有坐标系的栅格数据输出存储。
图5 淹没模拟界面
2.3.3 三维可视化表达
三维可视化表达主要是通过AE提供的axSceneControl插件实现。利用这个插件的Camera接口提供的各种方法,很容易实现对三维窗口的放大、缩小、漫游、平移、旋转等基本操作(图6)。便于用户从更全面的角度观察地形和淹没情况。
图6 三维可视化界面
拉伸和渲染是地形图三维可视化的基本操作。通过拉伸可以改变地形起伏的相对大小,以便于更好地观察地形起伏的规律。渲染可以通过色彩变化反映高程的大小变化,使地形变化更加直观明显。
拉伸是通过I3DProperties接口修改栅格数据的三维属性实现。具体语句如下:
I3DProperties properties = new Raster3DPropertiesClass();
properties.ZFactor = Convert.ToDouble(comboBox7.Text);
properties.Apply3DProperties(layer);
渲染需要先通过IAlgorithmicColorRamp接口建立一个色带,然后通过IRasterStretchColorRampRenderer接口进行渲染。地形渲染和水面渲染使用的是不同的色带,相同的渲染方法。创建色带的语句:
IAlgorithmicColorRamp pAlgorithmicColorRamp
= new AlgorithmicColorRampClass();
pAlgorithmicColorRamp.Size = 255;
pAlgorithmicColorRamp.FromColor = pFromRgbColor as IColor;
pAlgorithmicColorRamp.ToColor = pToRgbColor as IColor;
应用色带渲染的语句:
IRasterStretchColorRampRenderer pRStretchRender
= new RasterStretchColorRampRendererClass();
pRStretchRender.ColorRamp = pAlgorithmicColorRamp as IColorRamp;
最后,通过保存场景图片可以把三维场景保存成图片,便于存储应用。此功能使用axSceneControl自带的功能就可以实现。
3 结 语
介绍了在.NET框架下进行AE与IDL一体化开发的技术支持和开发方法,设计了一个基于一体化开发的洪水淹没范围估测与模拟系统,为集遥感影像数据处理、GIS应用分析和制图为一体的专业软件系统提供一种可行且低成本的解决方案。通过开发实例对一体化开发进行实验,实现了系统中基于IDL的指数计算功能,以及基于AE的淹没范围估测与模拟、三维可视化表达几项功能。实例中的一体化开发达到了平台层面的一体化,AE提供的各种功能都以COM组件的形式封装,C#语言通过组件接口进行调用,实现消息传递、数据共享,并且为整个系统编写统一的界面。
[1] 于传才. 基于ArcGIS与ENVI一体化的遥感影像数据的网络发布与共享[D].西安:西北大学,2010
[2] 陈莹. 基于.NET框架的高校社团管理系统的设计与实现[D].长春:吉林大学,2015
[3] 庞开放. 基于.NET框架的专家系统研究与设计[D].合肥:安徽大学,2005
[4] 蒋元星. 基于.NET框架的企业应用集成研究和实现[D].杭州:浙江大学,2005
[5] 阚瑷珂,朱利东,张瑞军,等. 基于IDL和.NET的可视化程序设计[J].计算机应用研究,2007(9):149-151
[6] 杨延征. 基于IDL和ArcEngine的森林资源时空变化分析系统设计与实现[D].杨凌:西北农林科技大学,2012
[7] Michel R M, Beaudoin A. Flood Mapping Using ERS Tandem Coherence Image: A Case Study in Southern France [C]. ESASP:Florence ,1997
[8] 宋阁庆. 基于ArcGIS Server的洪水预报与预警系统设计研究[D].兰州:西北师范大学,2009
[9] 黄娟. 基于GIS的洪灾预警与淹没评估系统研究[D].南京:南京信息工程大学,2008
[10] 毕京佳. 基于遥感和GIS的洪水淹没范围估测与模拟研究[D].北京:中国科学院大学,2016