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