王克曉,李顯巨,陳偉濤
(1. 中國(guó)地質(zhì)大學(xué)(武漢)信息工程學(xué)院,湖北 武漢 430074;2. 中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院,湖北 武漢 430074)
高光譜遙感在災(zāi)害監(jiān)測(cè)領(lǐng)域扮演重要的角色?;诟吖庾V數(shù)據(jù)的災(zāi)害精細(xì)識(shí)別和分類(lèi),需要災(zāi)害相關(guān)地物波譜庫(kù)支持。1980年以來(lái),國(guó)內(nèi)相繼建立了10余個(gè)地物波譜庫(kù)[1]。王錦地等人在光譜庫(kù)的基礎(chǔ)上,緊密結(jié)合高光譜影像,實(shí)現(xiàn)了融遙感信息提取為一體的波譜知識(shí)庫(kù)[2]。但國(guó)內(nèi)外尚未公開(kāi)出版與災(zāi)害相關(guān)的地物波譜庫(kù),不能滿(mǎn)足防災(zāi)減災(zāi)工作需求;尤其是在我國(guó)已經(jīng)成功發(fā)射環(huán)境與減災(zāi)衛(wèi)星的背景下,災(zāi)害專(zhuān)題波譜庫(kù)的建設(shè)更是意義重大。
波譜數(shù)據(jù)采集嚴(yán)格遵循地物波譜測(cè)量標(biāo)準(zhǔn)規(guī)范,波譜庫(kù)的目標(biāo)是為遙感圖像信息提取提供地面波譜參考,因此所采用的運(yùn)行環(huán)境應(yīng)該直接服務(wù)于圖像處理過(guò)程。基于此,本文設(shè)計(jì)的災(zāi)害專(zhuān)題波譜庫(kù)具有以下特征:①采用VB.NET2005編寫(xiě)界面,操作數(shù)據(jù)庫(kù);②采用SQL Server 2005管理數(shù)據(jù)庫(kù),可實(shí)現(xiàn)客戶(hù)端遠(yuǎn)程連接,系統(tǒng)采用C/S模式,應(yīng)用程序登陸窗口有一個(gè)配置按鈕,把連接服務(wù)器數(shù)據(jù)庫(kù)信息寫(xiě)入ini文件;③充分利用IDL7.0的圖形功能,實(shí)現(xiàn)波譜數(shù)據(jù)的處理和可視化,并可以集成ENVI軟件中常用的函數(shù);④3種語(yǔ)言跨平臺(tái)集成,實(shí)現(xiàn)各語(yǔ)言?xún)?yōu)勢(shì)互補(bǔ)。
災(zāi)害專(zhuān)題波譜庫(kù)可視化程序設(shè)計(jì),實(shí)現(xiàn)了用戶(hù)管理、波譜預(yù)處理、數(shù)據(jù)庫(kù)管理和波譜顯示等功能。
1)用戶(hù)管理模塊。使用SQL Server 2005建立波譜數(shù)據(jù)庫(kù)時(shí),包含2個(gè)表:用戶(hù)信息表和波譜信息表。波譜信息表各字段及其釋義參照地物波譜測(cè)量標(biāo)準(zhǔn)規(guī)范。用戶(hù)信息表包含用戶(hù)ID、登陸密碼和用戶(hù)權(quán)限3個(gè)字段。
2)波譜預(yù)處理模塊。其功能由VB.NET 2005分別調(diào)用ENVI二次開(kāi)發(fā)函數(shù)實(shí)現(xiàn)。ASD采集的波譜不能直接用作端元,需要進(jìn)行包括波譜平均、去陡峭、噪聲消除和波譜指數(shù)統(tǒng)計(jì)等預(yù)處理。波譜平均:對(duì)同一測(cè)量環(huán)境下相同樣品的n(n≥10)條波譜進(jìn)行算術(shù)平均,獲取1條近似真實(shí)的地物波譜。去陡峭:ASD儀器采集波譜時(shí)在1 000 nm、1 750 nm等波長(zhǎng)處會(huì)產(chǎn)生反射率陡然增加的現(xiàn)象,可根據(jù)陡峭位置采用相應(yīng)的系數(shù)法消除這些陡峭現(xiàn)象。噪聲去除:根據(jù)波譜噪聲在測(cè)量波長(zhǎng)區(qū)間的分布狀況,采用窗口濾波法消除ASD野外采集的波譜噪聲。波譜指數(shù)計(jì)算:計(jì)算吸收谷左右肩部、谷底值及相應(yīng)的波長(zhǎng)位置、吸收深度、吸收寬度、吸收谷總面積和對(duì)稱(chēng)度。
3)數(shù)據(jù)庫(kù)管理模塊。實(shí)質(zhì)上是對(duì)數(shù)據(jù)庫(kù)中波譜信息表的操作,包括查看/添加波譜數(shù)據(jù)以及修改波譜數(shù)據(jù)3個(gè)子模塊?!安榭础蹦K實(shí)現(xiàn)波譜信息屬性表的顯示;“添加”模塊實(shí)現(xiàn)把經(jīng)過(guò)預(yù)處理的波譜及其相關(guān)信息錄入數(shù)據(jù)庫(kù);“修改”模塊實(shí)現(xiàn)對(duì)波譜信息的修改、刪除和追加操作,為管理員權(quán)限。該模塊功能采用VB.NET結(jié)合SQL Server實(shí)現(xiàn),見(jiàn)圖1。
圖1 修改波譜屬性數(shù)據(jù)窗口
4)波譜曲線顯示模塊。由VB.NET調(diào)用IDL組件COM_idl_connectlib及相應(yīng)函數(shù)實(shí)現(xiàn),實(shí)現(xiàn)原始波譜曲線及處理后波譜曲線的顯示。圖2和圖3是用ASD采集的大同盆地土壤鹽堿化原始波譜與預(yù)處理后的波譜。
圖2 大同盆地土壤鹽堿化原始波譜
圖3 波譜平均與去陡峭后的原始波譜
配置SQL Server2005,開(kāi)啟遠(yuǎn)程連接功能。連接服務(wù)器數(shù)據(jù)庫(kù)字符串由用戶(hù)配置到ini文件,然后再讀取。連接服務(wù)器數(shù)據(jù)庫(kù)字符串包括:Data Source=服務(wù)器IP地址,Initial Catalog=數(shù)據(jù)庫(kù)名,User Id=訪問(wèn)數(shù)據(jù)庫(kù)用戶(hù)名,Password=訪問(wèn)數(shù)據(jù)庫(kù)用戶(hù)的密碼。為了保護(hù)數(shù)據(jù)庫(kù)信息,專(zhuān)門(mén)設(shè)置了用戶(hù)密碼。
先引入2個(gè)API函數(shù),然后自定義讀寫(xiě)配置文件函數(shù) GetINI和WriteINI。
'定義讀取配置文件函數(shù)
Public Function GetINI(ByVal Section As String,ByVal AppName As String, ByVal lpDefault As String,ByVal FileName As String) As String
Dim Str As String = LSet(Str, 256)
GetPrivateProfi leString(Section, AppName, lpDefault,Str, Len(Str), FileName)
Return Microsoft.VisualBasic.Left(Str, InStr(Str,Chr(0)) - 1)
End Function
'定義寫(xiě)入配置文件函數(shù)
Public Function WriteINI(ByVal Section As String,ByVal AppName As String, ByVal lpDefault As String,ByVal FileName As String) As Long
WriteINI = WritePrivateProfileString(Section,AppName, lpDefault, FileName)
End Function
本系統(tǒng)的數(shù)據(jù)文件格式采用ENVI影像格式。柵格影像數(shù)據(jù)以二進(jìn)制數(shù)據(jù)流方式按BSQ、BIL或是BIP的存儲(chǔ)順序存儲(chǔ)。文件中只有影像數(shù)據(jù),頭信息沒(méi)有嵌入到文件中。ENVI格式的影像文件可使用任意名稱(chēng),無(wú)需擴(kuò)展名。每一個(gè)二進(jìn)制文件都伴隨有一個(gè)ASCⅡ格式的頭文件,描述影像的基本特征以及附加信息。為了ENVI能夠識(shí)別這個(gè)頭文件,它必須和影像文件具有同樣的文件名,并以.hdr作為擴(kuò)展名[3]。
VB.NET數(shù)據(jù)庫(kù)編程主要利用的是ADO.NET。ADO.NET有2個(gè)核心組件:DataSet類(lèi)和.net數(shù)據(jù)提供程序,可以實(shí)現(xiàn)從數(shù)據(jù)操作中分解出數(shù)據(jù)訪問(wèn)。ADO.NET的數(shù)據(jù)存取,API提供3種數(shù)據(jù)訪問(wèn)方式:通過(guò)ODBC相連訪問(wèn)支持早期ODBC協(xié)議的數(shù)據(jù)庫(kù);通過(guò)OLEDB相連訪問(wèn)SOL Server6.5、Microsoft Access、Oracle或者其他有提供OLE DB連接能力的數(shù)據(jù)庫(kù);使用SqlConnection直接與SQL Server7.0、SQL Server2000以及SQL Server2005相連[4-6]。本文使用SQL Connection直接連接SQL Server2005數(shù)據(jù)庫(kù)。
1)填充數(shù)據(jù)。運(yùn)用數(shù)據(jù)適配器da把表征波譜信息的數(shù)據(jù)填充到數(shù)據(jù)集ds中,然后再把ds中的數(shù)據(jù)顯示在datagridview中,實(shí)現(xiàn)信息的可視化。
Dim ds as dataset
Dim da as sqlclient.sqldataadapter
Dim sql as string =”select * from 波譜信息”
Da=new sqldataadapter(sql,con)
Da.fi ll(ds)
Datagridview1.datasource=ds.tables(0)
2)刪除數(shù)據(jù)記錄。方法與添加數(shù)據(jù)記錄相似,只不過(guò)SQL語(yǔ)句不同。
Dim sql As String= “DELETE FROM 表where 字段=某textbox的text”
3)修改數(shù)據(jù)記錄。方法與添加數(shù)據(jù)記錄相似,只不過(guò)SQL語(yǔ)句不同。
Dim sql as string= “UPDATE 表SET 字段= ” ” “
2.5.1 IDL接口
為了使Windows用戶(hù)能夠用通用開(kāi)發(fā)語(yǔ)言C、C++、Visual Basic和Fortran等集成IDL功能,IDL提供了ActiveX 控件IDLDrawWidget和COM組件COM_IDL_Cconnect 2種方式[7]。本系統(tǒng)使用COM_IDL_Connect組件實(shí)現(xiàn)VB.NET和IDL的連接。
2.5.2 調(diào)用IDL接口的方法
首先要在VB.NET中添加對(duì)COM_IDL_Cconnect的引用。在外部程序中調(diào)用IDL 主要有4 個(gè)環(huán)節(jié):初始化IDL、編譯IDL代碼、執(zhí)行IDL命令和釋放IDL。
1)初始化IDL。
Dim ostock As New COM_IDL_connectLib.COM_IDL_connect
Try
ostock.CreateObject(0, 0, 0)
Catch ex As Exception
MessageBox.Show(ostock.GetLastError())
Return
End Try
AddHandler ostock.OnIDLOutput, AddressOf evOutput
2)編譯IDL代碼。
ostock.ExecuteString(".COMPILE main.pro")
對(duì)于直接編譯好的sav代碼,則應(yīng)為:ostock.ExecuteString("restore,’main.sav’ ")
3)執(zhí)行IDL命令。
Dim FilePathName As String = "FilePathName"
Dim WorkingDirectory As String = "CD, '" +Application.StartupPath + "'"
ostock.ExecuteString(WorkingDirectory)
ostock.SetIDLVariable("FilePathName", fi lepath)
ostock.ExecuteString("main,FilePathName")
4)釋放IDL。
ostock.DestroyObject()
在調(diào)用IDL過(guò)程中,程序運(yùn)行信息的可視化由下面的過(guò)程實(shí)現(xiàn):
Sub evOutput(ByVal ss As String)
IDL_Output_Box.Text = IDL_Output_Box.Text + ss
End Sub
1)ENVI初始化。在IDL程序中調(diào)用ENVI函數(shù)時(shí),首先要初始化ENVI批處理模式,添加代碼:
ENVI, /RESTORE_BASE_SAVE_FILES
ENVI_BATCH_INIT
2)ENVI函數(shù)。文件管理:ENVI_PICKFILE函數(shù)產(chǎn)生一個(gè)提示用戶(hù)選擇文件的對(duì)話(huà)框;ENVI_SELECT產(chǎn)生對(duì)話(huà)框提示用戶(hù)從ENVI中已經(jīng)打開(kāi)的文件中選擇一個(gè)文件;ENVI_OPEN_FILE 函數(shù)返回一個(gè)文件的FID;ENVI_GET_DATA從一個(gè)打開(kāi)的文件中獲取影像數(shù)據(jù),它每次只返回某一波段的數(shù)據(jù)。
3)ENVI處理程序的通用關(guān)鍵字。
FID:FID為ENVI的程序員提供一個(gè)命名變量,可以被數(shù)個(gè)ENVI程序使用,用來(lái)打開(kāi)或選擇文件。ENVI對(duì)該文件進(jìn)行的所有操作都是通過(guò)FID完成的。
R_FID和M_FID:如果結(jié)果存在內(nèi)存中,設(shè)置R_FID關(guān)鍵字是訪問(wèn)該數(shù)據(jù)的唯一方法。掩膜處理程序還包括一個(gè)M_FID,用于確定用作掩膜波段的文件。
DIMS關(guān)鍵字是一個(gè)5個(gè)元素長(zhǎng)整型數(shù)組,它定義了處理數(shù)據(jù)的空間子集。DIMS[0]:用于存儲(chǔ)指向一個(gè)打開(kāi)的ROI區(qū)域的指針,僅在ROI被定義時(shí)使用,其他時(shí)候設(shè)為-1;DIMS[1]:采樣的起始位置;DIMS[2]:采樣的終止位置;DIMS[3]:行的起始位置;DIMS[4]:行的結(jié)束位置。
POS關(guān)鍵字定義了用于處理的波段位置,如要處理多波段文件的第三波段和第四波段數(shù)據(jù),POS=[2,3]。
本文采用VB.NET2005、SQL Server 2005和IDL7.0集成的可視化程序設(shè)計(jì)方法,開(kāi)發(fā)了災(zāi)害專(zhuān)題波譜庫(kù)。它既包含了IDL語(yǔ)言強(qiáng)大的科學(xué)計(jì)算能力、矩陣數(shù)據(jù)分析和可視化功能,又具備了VB.NET語(yǔ)言便捷的界面設(shè)計(jì)和控制管理優(yōu)勢(shì),更具備了SQL Server高效地組織和管理數(shù)據(jù)的優(yōu)勢(shì)。該設(shè)計(jì)方法是有效管理災(zāi)害專(zhuān)題波譜庫(kù)的新途徑。
[1]田慶久, 宮鵬. 地物波譜數(shù)據(jù)庫(kù)研究現(xiàn)狀與發(fā)展趨勢(shì)[J]. 遙感信息, 2002(3): 2-7
[2]王錦地, 張立新, 柳欽火, 等. 中國(guó)典型地物波譜知識(shí)庫(kù)[M].北京:科學(xué)出版社, 2009
[3]航天星圖(北京)有限公司. ENVI二次開(kāi)發(fā)指南[M]. 航天星圖(北京)有限公司, 2006
[4]曹萌萌, 李響. VB.NET訪問(wèn)SQL SERVER 2000數(shù)據(jù)庫(kù)的方法[J]. 農(nóng)業(yè)圖書(shū)情報(bào)學(xué)刊, 2007, 19(1): 110-112
[5]鄭偉. VB.NET程序設(shè)計(jì)與軟件項(xiàng)目實(shí)訓(xùn)[M]. 北京: 清華大學(xué)出版社, 2009
[6]楊湖,李鳳蕾,等. SQL Server 2005數(shù)據(jù)庫(kù)系統(tǒng)開(kāi)發(fā)案例精選[M]. 北京: 人民郵電出版社, 2007
[7]闡緩坷, 朱利東, 張瑞軍. 基于IDL和.NET的可視化程序設(shè)計(jì)[J]. 計(jì)算機(jī)應(yīng)用研究, 2007, 24(9): 149-151