当前位置:首页 期刊杂志

面向灾害识别的专题波谱库设计与开发

时间:2024-05-22

王克晓,李显巨,陈伟涛

(1. 中国地质大学(武汉)信息工程学院,湖北 武汉 430074;2. 中国地质大学(武汉)计算机学院,湖北 武汉 430074)

高光谱遥感在灾害监测领域扮演重要的角色。基于高光谱数据的灾害精细识别和分类,需要灾害相关地物波谱库支持。1980年以来,国内相继建立了10余个地物波谱库[1]。王锦地等人在光谱库的基础上,紧密结合高光谱影像,实现了融遥感信息提取为一体的波谱知识库[2]。但国内外尚未公开出版与灾害相关的地物波谱库,不能满足防灾减灾工作需求;尤其是在我国已经成功发射环境与减灾卫星的背景下,灾害专题波谱库的建设更是意义重大。

1 灾害专题波谱库的设计

1.1 基本原则

波谱数据采集严格遵循地物波谱测量标准规范,波谱库的目标是为遥感图像信息提取提供地面波谱参考,因此所采用的运行环境应该直接服务于图像处理过程。基于此,本文设计的灾害专题波谱库具有以下特征:①采用VB.NET2005编写界面,操作数据库;②采用SQL Server 2005管理数据库,可实现客户端远程连接,系统采用C/S模式,应用程序登陆窗口有一个配置按钮,把连接服务器数据库信息写入ini文件;③充分利用IDL7.0的图形功能,实现波谱数据的处理和可视化,并可以集成ENVI软件中常用的函数;④3种语言跨平台集成,实现各语言优势互补。

1.2 基本功能

灾害专题波谱库可视化程序设计,实现了用户管理、波谱预处理、数据库管理和波谱显示等功能。

1)用户管理模块。使用SQL Server 2005建立波谱数据库时,包含2个表:用户信息表和波谱信息表。波谱信息表各字段及其释义参照地物波谱测量标准规范。用户信息表包含用户ID、登陆密码和用户权限3个字段。

2)波谱预处理模块。其功能由VB.NET 2005分别调用ENVI二次开发函数实现。ASD采集的波谱不能直接用作端元,需要进行包括波谱平均、去陡峭、噪声消除和波谱指数统计等预处理。波谱平均:对同一测量环境下相同样品的n(n≥10)条波谱进行算术平均,获取1条近似真实的地物波谱。去陡峭:ASD仪器采集波谱时在1 000 nm、1 750 nm等波长处会产生反射率陡然增加的现象,可根据陡峭位置采用相应的系数法消除这些陡峭现象。噪声去除:根据波谱噪声在测量波长区间的分布状况,采用窗口滤波法消除ASD野外采集的波谱噪声。波谱指数计算:计算吸收谷左右肩部、谷底值及相应的波长位置、吸收深度、吸收宽度、吸收谷总面积和对称度。

3)数据库管理模块。实质上是对数据库中波谱信息表的操作,包括查看/添加波谱数据以及修改波谱数据3个子模块。“查看”模块实现波谱信息属性表的显示;“添加”模块实现把经过预处理的波谱及其相关信息录入数据库;“修改”模块实现对波谱信息的修改、删除和追加操作,为管理员权限。该模块功能采用VB.NET结合SQL Server实现,见图1。

图1 修改波谱属性数据窗口

4)波谱曲线显示模块。由VB.NET调用IDL组件COM_idl_connectlib及相应函数实现,实现原始波谱曲线及处理后波谱曲线的显示。图2和图3是用ASD采集的大同盆地土壤盐碱化原始波谱与预处理后的波谱。

图2 大同盆地土壤盐碱化原始波谱

图3 波谱平均与去陡峭后的原始波谱

2 灾害专题波谱库实现过程

2.1 C/S模式远程连接

配置SQL Server2005,开启远程连接功能。连接服务器数据库字符串由用户配置到ini文件,然后再读取。连接服务器数据库字符串包括:Data Source=服务器IP地址,Initial Catalog=数据库名,User Id=访问数据库用户名,Password=访问数据库用户的密码。为了保护数据库信息,专门设置了用户密码。

2.2 ini文件操作方法

先引入2个API函数,然后自定义读写配置文件函数 GetINI和WriteINI。

'定义读取配置文件函数

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

'定义写入配置文件函数

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

2.3 数据文件格式

本系统的数据文件格式采用ENVI影像格式。栅格影像数据以二进制数据流方式按BSQ、BIL或是BIP的存储顺序存储。文件中只有影像数据,头信息没有嵌入到文件中。ENVI格式的影像文件可使用任意名称,无需扩展名。每一个二进制文件都伴随有一个ASCⅡ格式的头文件,描述影像的基本特征以及附加信息。为了ENVI能够识别这个头文件,它必须和影像文件具有同样的文件名,并以.hdr作为扩展名[3]。

2.4 VB.NET操作SQL Server

VB.NET数据库编程主要利用的是ADO.NET。ADO.NET有2个核心组件:DataSet类和.net数据提供程序,可以实现从数据操作中分解出数据访问。ADO.NET的数据存取,API提供3种数据访问方式:通过ODBC相连访问支持早期ODBC协议的数据库;通过OLEDB相连访问SOL Server6.5、Microsoft Access、Oracle或者其他有提供OLE DB连接能力的数据库;使用SqlConnection直接与SQL Server7.0、SQL Server2000以及SQL Server2005相连[4-6]。本文使用SQL Connection直接连接SQL Server2005数据库。

1)填充数据。运用数据适配器da把表征波谱信息的数据填充到数据集ds中,然后再把ds中的数据显示在datagridview中,实现信息的可视化。

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)删除数据记录。方法与添加数据记录相似,只不过SQL语句不同。

Dim sql As String= “DELETE FROM 表where 字段=某textbox的text”

3)修改数据记录。方法与添加数据记录相似,只不过SQL语句不同。

Dim sql as string= “UPDATE 表SET 字段= ” ” “

2.5 VB.NET调用IDL程序

2.5.1 IDL接口

为了使Windows用户能够用通用开发语言C、C++、Visual Basic和Fortran等集成IDL功能,IDL提供了ActiveX 控件IDLDrawWidget和COM组件COM_IDL_Cconnect 2种方式[7]。本系统使用COM_IDL_Connect组件实现VB.NET和IDL的连接。

2.5.2 调用IDL接口的方法

首先要在VB.NET中添加对COM_IDL_Cconnect的引用。在外部程序中调用IDL 主要有4 个环节:初始化IDL、编译IDL代码、执行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")

对于直接编译好的sav代码,则应为:ostock.ExecuteString("restore,’main.sav’ ")

3)执行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()

在调用IDL过程中,程序运行信息的可视化由下面的过程实现:

Sub evOutput(ByVal ss As String)

IDL_Output_Box.Text = IDL_Output_Box.Text + ss

End Sub

2.6 IDL调用ENVI函数进行二次开发

1)ENVI初始化。在IDL程序中调用ENVI函数时,首先要初始化ENVI批处理模式,添加代码:

ENVI, /RESTORE_BASE_SAVE_FILES

ENVI_BATCH_INIT

2)ENVI函数。文件管理:ENVI_PICKFILE函数产生一个提示用户选择文件的对话框;ENVI_SELECT产生对话框提示用户从ENVI中已经打开的文件中选择一个文件;ENVI_OPEN_FILE 函数返回一个文件的FID;ENVI_GET_DATA从一个打开的文件中获取影像数据,它每次只返回某一波段的数据。

3)ENVI处理程序的通用关键字。

FID:FID为ENVI的程序员提供一个命名变量,可以被数个ENVI程序使用,用来打开或选择文件。ENVI对该文件进行的所有操作都是通过FID完成的。

R_FID和M_FID:如果结果存在内存中,设置R_FID关键字是访问该数据的唯一方法。掩膜处理程序还包括一个M_FID,用于确定用作掩膜波段的文件。

DIMS关键字是一个5个元素长整型数组,它定义了处理数据的空间子集。DIMS[0]:用于存储指向一个打开的ROI区域的指针,仅在ROI被定义时使用,其他时候设为-1;DIMS[1]:采样的起始位置;DIMS[2]:采样的终止位置;DIMS[3]:行的起始位置;DIMS[4]:行的结束位置。

POS关键字定义了用于处理的波段位置,如要处理多波段文件的第三波段和第四波段数据,POS=[2,3]。

3 结 语

本文采用VB.NET2005、SQL Server 2005和IDL7.0集成的可视化程序设计方法,开发了灾害专题波谱库。它既包含了IDL语言强大的科学计算能力、矩阵数据分析和可视化功能,又具备了VB.NET语言便捷的界面设计和控制管理优势,更具备了SQL Server高效地组织和管理数据的优势。该设计方法是有效管理灾害专题波谱库的新途径。

[1]田庆久, 宫鹏. 地物波谱数据库研究现状与发展趋势[J]. 遥感信息, 2002(3): 2-7

[2]王锦地, 张立新, 柳钦火, 等. 中国典型地物波谱知识库[M].北京:科学出版社, 2009

[3]航天星图(北京)有限公司. ENVI二次开发指南[M]. 航天星图(北京)有限公司, 2006

[4]曹萌萌, 李响. VB.NET访问SQL SERVER 2000数据库的方法[J]. 农业图书情报学刊, 2007, 19(1): 110-112

[5]郑伟. VB.NET程序设计与软件项目实训[M]. 北京: 清华大学出版社, 2009

[6]杨湖,李凤蕾,等. SQL Server 2005数据库系统开发案例精选[M]. 北京: 人民邮电出版社, 2007

[7]阐缓坷, 朱利东, 张瑞军. 基于IDL和.NET的可视化程序设计[J]. 计算机应用研究, 2007, 24(9): 149-151

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!