吳勇拓,畢京佳,徐麗雯
(1.山東電力工程咨詢?cè)河邢薰?,山東 濟(jì)南 250013; 2. 中國(guó)科學(xué)院海洋研究所,山東 青島 266071;3. 青島恒天翼信息科技有限公司,山東 青島 266061; 4.中國(guó)科學(xué)院大學(xué),北京 100049)
工具型軟件系統(tǒng)(如ENVI、ArcGIS)雖然有強(qiáng)大的數(shù)據(jù)處理分析功能,但從應(yīng)用角度來(lái)講,成本太高,并且許多功能用不到,造成資源浪費(fèi)。為了提高軟件的利用效率,降低開發(fā)成本,應(yīng)用過(guò)程中往往采取二次開發(fā)的方式,利用現(xiàn)有軟件功能進(jìn)行重新組合和擴(kuò)展,開發(fā)符合特定應(yīng)用需求的應(yīng)用型軟件。
為了實(shí)現(xiàn)ArcGIS與IDL的一體化開發(fā),需要借助第三方的編程語(yǔ)言。微軟公司研發(fā)的.NET框架及其主要的集成語(yǔ)言C#以其使用的靈活性及簡(jiǎn)便性成為首選。
.NET框架(.NET Framework)是由微軟研發(fā)的一個(gè)致力于快捷開發(fā)的軟件開發(fā)平臺(tái)[1,2]。它是一個(gè)集成多種語(yǔ)言的組件開發(fā)系統(tǒng)和執(zhí)行系統(tǒng),為跨語(yǔ)言編程提供一個(gè)統(tǒng)一的編程環(huán)境[3]。.NET框架的結(jié)構(gòu)可以分為3個(gè)層次:服務(wù)框架、公共語(yǔ)言運(yùn)行時(shí)以及兩類應(yīng)用模板(即Windows應(yīng)用程序模板和基于ASP NET的Web網(wǎng)絡(luò)應(yīng)用程序模板)[4]。
C#是微軟發(fā)布的一種編程語(yǔ)言,是微軟公司.NET框架的主角,與COM組件對(duì)象模型是直接集成的。C#語(yǔ)言是在.NET框架下進(jìn)行組件開發(fā)的首選語(yǔ)言。
ArcGIS Engine可以提供應(yīng)用型GIS軟件所必須的空間分析能力,使開發(fā)人員將精力集中到軟件特定邏輯的構(gòu)建上。ArcGIS Engine也可以將GIS功能嵌入到商業(yè)生產(chǎn)應(yīng)用軟件中,如Microsoft Word和Excel。使用Desktop開發(fā)的產(chǎn)品如果交付給用戶使用,用戶需要配置一套桌面軟件。而對(duì)于ArcGIS Engine開發(fā)的產(chǎn)品,用戶只需要一個(gè)相應(yīng)功能授權(quán)的Runtime即可。
IDL是一種進(jìn)行數(shù)據(jù)分析和構(gòu)建圖像化應(yīng)用的程序及編程語(yǔ)言[5]。IDL語(yǔ)言功能強(qiáng)大,很多時(shí)候只需幾行代碼就可以實(shí)現(xiàn)復(fù)雜的功能,并且語(yǔ)法簡(jiǎn)單易學(xué)。這些優(yōu)點(diǎn)使IDL語(yǔ)言成為進(jìn)行可視化表達(dá)、跨平臺(tái)應(yīng)用開發(fā)以及科學(xué)數(shù)據(jù)分析的理想工具。ENVI軟件是在IDL基礎(chǔ)上開發(fā)出來(lái)的,使用ENVI/IDL既可以調(diào)用IDL豐富的分析工具包,同時(shí)可以使用ENVI提供的函數(shù),從而實(shí)現(xiàn)基于ENVI的數(shù)據(jù)處理分析和可視化程序的二次開發(fā)。
ENVI/IDL和ArcGIS Engine結(jié)合高級(jí)語(yǔ)言C#,可以在.NET框架下搭建GIS與RS一體化的應(yīng)用平臺(tái)。程序員可以在C#環(huán)境中,通過(guò)添加引用,調(diào)用屬于AE和ENVI的函數(shù),從而在C#環(huán)境中實(shí)現(xiàn)AE和ENVI的處理功能。除了添加引用調(diào)用AE和ENVI函數(shù),還可以添加AE和ENVI/IDL提供的可視化插件,調(diào)用AE和ENVI/IDL的功能。AE和ENVI/IDL還提供了各種控件,實(shí)現(xiàn)地圖顯示、地圖輸出、三維地圖顯示、圖層管理、許可管理等功能[6]。圖形化操作簡(jiǎn)化了編程難度。
系統(tǒng)集成了遙感影像處理與GIS數(shù)據(jù)分析兩部分功能,整體上可以分為3個(gè)層次:數(shù)據(jù)層、技術(shù)支撐層和操作層[7](圖 1)。
數(shù)據(jù)層使用不同的數(shù)據(jù)文件分別存儲(chǔ)GIS數(shù)據(jù)、遙感數(shù)據(jù)和水文數(shù)據(jù)。
技術(shù)支撐層是功能實(shí)現(xiàn)的核心。使用.NET框架進(jìn)行整體架構(gòu),C#語(yǔ)言進(jìn)行程序組織和算法編寫,利用ArcGIS Engine提供的組件功能處理GIS數(shù)據(jù),進(jìn)行制圖輸出,用ENVI/IDL提供的組件功能處理遙感影像,提取洪水信息[8]。
操作層是用戶使用系統(tǒng)功能的接口,用C#語(yǔ)言編寫圖形化程序界面,方便用戶使用[9]。
圖1 系統(tǒng)總體框架圖
系統(tǒng)包括文件操作、影像預(yù)處理、痕跡提取、淹沒計(jì)算、制圖輸出和幫助6個(gè)模塊,如圖2。每個(gè)模塊又分為若干個(gè)功能,每個(gè)模塊的具體功能如下所述。
圖2 系統(tǒng)功能模塊
1)文件操作。該模塊為對(duì)地圖文件的操作,包括打開和保存地圖文件、數(shù)據(jù)加載與移除、平移、放大、縮小、前后視圖與全圖、刷新等基本操作操作。主要由ArcGIS Engine提供的控件與組件實(shí)現(xiàn)。
2)影像預(yù)處理。主要包括兩部分:遙感影像加載功能(即波段合成、重采樣、投影轉(zhuǎn)換等)和遙感影像的預(yù)處理功能(即影像裁剪與鑲嵌、大氣校正、地形校正、云層處理等)。該模塊實(shí)現(xiàn)遙感影像數(shù)據(jù)的前期處理,主要由ENVI/IDL提供的函數(shù)實(shí)現(xiàn)。
3)痕跡提取。包括3個(gè)部分:指數(shù)計(jì)算、差異計(jì)算和痕跡斑塊提取。指數(shù)計(jì)算包括對(duì)比值植被指數(shù)(RVI)、歸一化植被指數(shù)(NDVI)、土壤調(diào)節(jié)植被指數(shù)(MSAVI)以及土壤光譜反射率的計(jì)算。差異計(jì)算包括計(jì)算洪水前后植被指數(shù)差異和輸出指數(shù)差異分布統(tǒng)計(jì)。痕跡斑塊提取功能根據(jù)用戶設(shè)定閾值提取洪水痕跡斑塊。
4)淹沒計(jì)算。包括兩個(gè)部分:淹沒估測(cè)和淹沒模擬。淹沒估測(cè)功能可以根據(jù)用戶輸入的洪水痕跡斑塊及相應(yīng)區(qū)域的DEM高程數(shù)據(jù)估算出洪水的最大淹沒范圍。淹沒模擬功能是根據(jù)用戶輸入的淹沒起始點(diǎn)位置信息和最高水位、DEM數(shù)據(jù)進(jìn)行洪水淹沒范圍的模擬。淹沒計(jì)算的結(jié)果包括淹沒范圍和淹沒水位高程兩個(gè)文件。
5)制圖輸出。該模塊包括兩個(gè)功能:地圖制圖和三維可視化。地圖制圖包括設(shè)置地圖格網(wǎng)、設(shè)置地圖框架屬性(邊框、陰影、背景等)、添加地圖整飾對(duì)象(圖例、指北針、比例尺等)。三維可視化實(shí)現(xiàn)地形數(shù)據(jù)和淹沒結(jié)果的三維渲染、疊加展示和圖形輸出。包括對(duì)三維視圖窗口的平行移動(dòng)、立體旋轉(zhuǎn)、前后移動(dòng)、拉伸、地形渲染、水面渲染、自動(dòng)旋轉(zhuǎn)和保存三維場(chǎng)景圖等功能。
使用.NET框架下的AE與IDL一體化開發(fā)技術(shù),在Visual Studio開發(fā)工具中搭建了一體化開發(fā)的平臺(tái),編程實(shí)現(xiàn)了系統(tǒng)的部分功能,證明了一體化開發(fā)的實(shí)用性和便捷性。
具體開發(fā)運(yùn)行環(huán)境如下:
操作系統(tǒng):Microsoft Windows 7;
混編平臺(tái):Visual Studio 2010 + .NET Framework 4.5 + C#
GIS平臺(tái):ArcGIS 10.1 + ArcGIS Engine 10.1
RS平臺(tái):ENVI 5.1 + IDL 8.3
2.3.1 指數(shù)計(jì)算
指數(shù)計(jì)算本質(zhì)上是對(duì)多波段的遙感影像進(jìn)行波段計(jì)算,使用ENVI/IDL提供的圖像處理函數(shù)會(huì)大大降低編程難度。首先在IDL中編寫指數(shù)計(jì)算的類對(duì)象。IDL中的類對(duì)象包括定義和函數(shù)兩部分。類定義相當(dāng)于構(gòu)造函數(shù),定義了類的名稱和參數(shù)接口。函數(shù)是類的功能體。
指數(shù)計(jì)算類的定義語(yǔ)句如下:
PRO OBJECT_ENVI_VICACULATE_DEFINE
void = {Object_ENVI_VICaculate, $
inFileName : '', $
outFileName : '' $
}
END
Obiect_envi_vicaculate類在構(gòu)造時(shí)需要傳入兩個(gè)參數(shù):文件打開路徑和文件保存路徑。這兩個(gè)路徑參數(shù)由C#編寫的界面獲得。
具體的指數(shù)計(jì)算由Obiect_envi_vicaculate類的各個(gè)功能函數(shù)完成(圖3),包括:Obiect_ENVI_VICaculate::EXECUTENDVICaculate(NDVI計(jì)算函數(shù))
圖3 指數(shù)計(jì)算界面
Obiect_ENVI_VICaculate::EXECUTERVICaculate(RVI計(jì)算函數(shù))
Obiect_ENVI_VICaculate::EXECUTEMSAVICaculate(MSAVI計(jì)算函數(shù))
Obiect_ENVI_VICaculate::EXECUTESRCaculate(土壤光譜反射率計(jì)算函數(shù))
在IDL中完成指數(shù)計(jì)算功能的編寫后,便可以使用C#進(jìn)行調(diào)用。首先需要使用COM_IDL_CONNECT組件提供的CreateObiect 方法進(jìn)行ENVI的初始化,具體語(yǔ)句如下:
COM_IDL_connectLib.COM_IDL_connectClass oComIDL= new COM_IDL_connectLib.COM_IDL_connectClass();oComIDL.CreateObject(0, 0, 0);
然后使用COM_IDL_CONNECT組件提供的ExecuteString方法建立并調(diào)用Obiect_envi_vicaculate對(duì)象,用法相當(dāng)于IDL中的命令行語(yǔ)句,具體如下:
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 淹沒估測(cè)與模擬
洪水淹沒與估測(cè)采用八方向種子淹沒算法,算法詳見文獻(xiàn)[10]。現(xiàn)從算法實(shí)現(xiàn)的角度來(lái)描述。
需要用戶從界面輸入的參數(shù)包括:種子文件(點(diǎn))信息、DEM數(shù)據(jù)文件和保存路徑,具體如圖3所示。
圖4 淹沒估測(cè)界面
首先將輸入的柵格數(shù)據(jù)轉(zhuǎn)化為二維數(shù)組。使用ArcGIS Engine提供的IRasterWorkspace接口可以直接打開柵格數(shù)據(jù),然后使用IRaster、IRasterProps、IPixelBlock接口提取柵格數(shù)據(jù)中的像元值存儲(chǔ)到Array二維數(shù)組中,然后便可以使用C#編寫的淹沒估測(cè)、淹沒模擬算法進(jìn)行計(jì)算(圖5)。計(jì)算的結(jié)果是新的二維數(shù)組,還需要通過(guò)上面提到的AE接口轉(zhuǎn)化成帶有坐標(biāo)系的柵格數(shù)據(jù)輸出存儲(chǔ)。
圖5 淹沒模擬界面
2.3.3 三維可視化表達(dá)
三維可視化表達(dá)主要是通過(guò)AE提供的axSceneControl插件實(shí)現(xiàn)。利用這個(gè)插件的Camera接口提供的各種方法,很容易實(shí)現(xiàn)對(duì)三維窗口的放大、縮小、漫游、平移、旋轉(zhuǎn)等基本操作(圖6)。便于用戶從更全面的角度觀察地形和淹沒情況。
圖6 三維可視化界面
拉伸和渲染是地形圖三維可視化的基本操作。通過(guò)拉伸可以改變地形起伏的相對(duì)大小,以便于更好地觀察地形起伏的規(guī)律。渲染可以通過(guò)色彩變化反映高程的大小變化,使地形變化更加直觀明顯。
拉伸是通過(guò)I3DProperties接口修改柵格數(shù)據(jù)的三維屬性實(shí)現(xiàn)。具體語(yǔ)句如下:
I3DProperties properties = new Raster3DPropertiesClass();
properties.ZFactor = Convert.ToDouble(comboBox7.Text);
properties.Apply3DProperties(layer);
渲染需要先通過(guò)IAlgorithmicColorRamp接口建立一個(gè)色帶,然后通過(guò)IRasterStretchColorRampRenderer接口進(jìn)行渲染。地形渲染和水面渲染使用的是不同的色帶,相同的渲染方法。創(chuàng)建色帶的語(yǔ)句:
IAlgorithmicColorRamp pAlgorithmicColorRamp
= new AlgorithmicColorRampClass();
pAlgorithmicColorRamp.Size = 255;
pAlgorithmicColorRamp.FromColor = pFromRgbColor as IColor;
pAlgorithmicColorRamp.ToColor = pToRgbColor as IColor;
應(yīng)用色帶渲染的語(yǔ)句:
IRasterStretchColorRampRenderer pRStretchRender
= new RasterStretchColorRampRendererClass();
pRStretchRender.ColorRamp = pAlgorithmicColorRamp as IColorRamp;
最后,通過(guò)保存場(chǎng)景圖片可以把三維場(chǎng)景保存成圖片,便于存儲(chǔ)應(yīng)用。此功能使用axSceneControl自帶的功能就可以實(shí)現(xiàn)。
介紹了在.NET框架下進(jìn)行AE與IDL一體化開發(fā)的技術(shù)支持和開發(fā)方法,設(shè)計(jì)了一個(gè)基于一體化開發(fā)的洪水淹沒范圍估測(cè)與模擬系統(tǒng),為集遙感影像數(shù)據(jù)處理、GIS應(yīng)用分析和制圖為一體的專業(yè)軟件系統(tǒng)提供一種可行且低成本的解決方案。通過(guò)開發(fā)實(shí)例對(duì)一體化開發(fā)進(jìn)行實(shí)驗(yàn),實(shí)現(xiàn)了系統(tǒng)中基于IDL的指數(shù)計(jì)算功能,以及基于AE的淹沒范圍估測(cè)與模擬、三維可視化表達(dá)幾項(xiàng)功能。實(shí)例中的一體化開發(fā)達(dá)到了平臺(tái)層面的一體化,AE提供的各種功能都以COM組件的形式封裝,C#語(yǔ)言通過(guò)組件接口進(jìn)行調(diào)用,實(shí)現(xiàn)消息傳遞、數(shù)據(jù)共享,并且為整個(gè)系統(tǒng)編寫統(tǒng)一的界面。
[1] 于傳才. 基于ArcGIS與ENVI一體化的遙感影像數(shù)據(jù)的網(wǎng)絡(luò)發(fā)布與共享[D].西安:西北大學(xué),2010
[2] 陳瑩. 基于.NET框架的高校社團(tuán)管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].長(zhǎng)春:吉林大學(xué),2015
[3] 龐開放. 基于.NET框架的專家系統(tǒng)研究與設(shè)計(jì)[D].合肥:安徽大學(xué),2005
[4] 蔣元星. 基于.NET框架的企業(yè)應(yīng)用集成研究和實(shí)現(xiàn)[D].杭州:浙江大學(xué),2005
[5] 闞璦珂,朱利東,張瑞軍,等. 基于IDL和.NET的可視化程序設(shè)計(jì)[J].計(jì)算機(jī)應(yīng)用研究,2007(9):149-151
[6] 楊延征. 基于IDL和ArcEngine的森林資源時(shí)空變化分析系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].楊凌:西北農(nóng)林科技大學(xué),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的洪水預(yù)報(bào)與預(yù)警系統(tǒng)設(shè)計(jì)研究[D].蘭州:西北師范大學(xué),2009
[9] 黃娟. 基于GIS的洪災(zāi)預(yù)警與淹沒評(píng)估系統(tǒng)研究[D].南京:南京信息工程大學(xué),2008
[10] 畢京佳. 基于遙感和GIS的洪水淹沒范圍估測(cè)與模擬研究[D].北京:中國(guó)科學(xué)院大學(xué),2016