鐘煜宏 吳梅桂
摘 要:本文基于VB和Automation對(duì)象技術(shù)的使用程序控制Surfer自動(dòng)繪圖的方法,利用Surfer自帶的Scripter腳本語(yǔ)言,可以實(shí)現(xiàn)Surfer面向?qū)ο缶幊陶Z(yǔ)言的二次開發(fā),實(shí)現(xiàn)海洋要素等值線圖、分類圖等不同類型圖件的批量繪制,使用Visual Studio 2013開發(fā)工具,實(shí)現(xiàn)批處理可視化系統(tǒng)功能和界面,系統(tǒng)提供海洋數(shù)據(jù)處理功能,圖件批處理等操作界面。本系統(tǒng)可以顯著提高海洋繪圖工作者的工作效率,避免重復(fù)工作導(dǎo)致的誤差。
關(guān)鍵詞:Surfer Automation VB 等值線 批量繪圖 海洋要素
中圖分類號(hào):TP31 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-3791(2018)08(b)-0022-03
海洋制圖數(shù)據(jù)量巨大,如果手動(dòng)一個(gè)個(gè)處理數(shù)據(jù),畫等值線,效率低下,甚至容易出錯(cuò),導(dǎo)致模擬結(jié)果失真。根據(jù)需要,本文比較幾種處理方法,形成批量畫等值線圖的可視化系統(tǒng)。
Surfer是美國(guó)Golden Software公司研制開發(fā)的繪圖軟件,其不僅提供了豐富的網(wǎng)格化和插值方法,還具有強(qiáng)大的繪制等值線等矢量圖能力,而且Surfer的還提供了Automation技術(shù),發(fā)現(xiàn)可以使用Visual Studio 2010的VB.NET語(yǔ)言開發(fā)批量制圖的客戶端系統(tǒng),此程序后臺(tái)調(diào)用Surfer的Automation對(duì)象,輕松實(shí)現(xiàn)Surfer的強(qiáng)大圖形繪制功能[1],本文選擇Surfer軟件的Automation技術(shù)去實(shí)現(xiàn)水質(zhì)模擬可視化系統(tǒng),去處理批量的數(shù)據(jù)。
1 調(diào)用Surfer軟件繪圖的基本原理
在VB中調(diào)用Suffer 8.0及以上版本進(jìn)行嵌入式編程的原理類似于調(diào)用ActiveX控件編程。Suffer 8.0及以上版本采用了Automation方法來公開其接口,提供了不同種類的ActiveX Automation對(duì)象,它們幾乎覆蓋了Suffer 8.0及以上版本的所有功能[2]。
開發(fā)人員在VB程序中創(chuàng)建、調(diào)用它所提供的Automation對(duì)象,用以實(shí)現(xiàn)相應(yīng)的數(shù)據(jù)可視化功能。更準(zhǔn)確地說這種編程方法是一種面向?qū)ο蟮那度胧骄幊谭椒āB編程人員開發(fā)嵌入Suffer應(yīng)用程序的過程主要包括兩部分工作:一是按照以往的經(jīng)驗(yàn)和習(xí)慣編寫程序的主框架代碼,即核心控制模塊和顯示控制模塊;二是在完成主體代碼后,參考Suffer提供的Automation對(duì)象,編寫制作可視化產(chǎn)品的調(diào)用Suffer嵌入代碼模塊[3]。
2 系統(tǒng)設(shè)計(jì)
Surfer 8.0及以上版本在繪制等值線圖時(shí)一共需要導(dǎo)入3種數(shù)據(jù)文件:包含等值線數(shù)據(jù)的DAT文件、圖形邊界的空白文件和底圖文件(*.BLN),其主要繪制過程可分為導(dǎo)入、網(wǎng)格化、空白和疊合,操作流程如圖1所示。利用Surfer繪圖軟件所提供的Automation方法的調(diào)用來實(shí)現(xiàn)數(shù)據(jù)批量處理。批量處理是利用VB Scripter編程語(yǔ)言來實(shí)現(xiàn),調(diào)用Surfer 8.0提供的接口對(duì)象來實(shí)現(xiàn)批量繪圖功能[4-5]。
3 系統(tǒng)技術(shù)實(shí)現(xiàn)以及關(guān)鍵代碼
Surfer軟件Automation技術(shù)的推出為實(shí)現(xiàn)VB和Surfer接口提供了可能。在VB應(yīng)用程序中,可以給Surfer任何對(duì)象的屬性賦值[6-7]。通過賦與不同的參數(shù)值改變對(duì)象的狀態(tài),程序執(zhí)行過程中通過參數(shù)控制圖形的輸出。因此,在Surfer系統(tǒng)中進(jìn)行的一系列手工操作,完全可以用外部程序中的一段代碼代替,從而實(shí)現(xiàn)了Surfer自動(dòng)繪圖功能。
3.1 原始數(shù)據(jù)的批量處理
根據(jù)Surfer需要的文本格式設(shè)置Excel表格,不同介質(zhì)為不同Excel表格,但是數(shù)據(jù)格式都是設(shè)置為站位、經(jīng)度、緯度、要素值(1-n個(gè)要素),尤其要素值名稱不能重復(fù)。詳細(xì)格式如表1所示。
以下是批量生成TXT文本的核心代碼:
OpenFileDialog1.Filter = "Excel文件(*.xls)|*.xls|所有文(*.*)|*.*"
If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
TextBox1.Clear()
TextBox1.AppendText(OpenFileDialog1.FileName)
executefile = OpenFileDialog1.FileName
Dim xlApp, xlBook As Object
xlApp = CreateObject("Excel.Application")
xlBook = xlApp.Workbooks.Open(OpenFileDialog1.FileName)
Dim c As Integer
c = xlBook.Worksheets.Count
Dim arraylist As ArrayList
arraylist = New ArrayList
For i = 1 To c
ListBox1.Items.Add(xlBook.Sheets(i).Name)
Next
xlApp.Quit()
3.2 批量生成grd文件
網(wǎng)格化是把以XYZ數(shù)據(jù)文件格式表示的、通常是不規(guī)則分布的原始數(shù)據(jù)點(diǎn),經(jīng)過數(shù)學(xué)處理,構(gòu)筑一個(gè)規(guī)則的空間矩形網(wǎng)格的過程。調(diào)用Surfer的應(yīng)用(Application)對(duì)象的GridData方法[8]。
Set SurferApp =CreateObject(“surfer.Application”) '創(chuàng)建Surfer實(shí)例
path= GetFilePath("","txt","","")'獲取參與圖形繪制的txt文件所在的路徑
If Path ="" Then End
Path=Left(Path,InStrRev(Path,"\"))
data=Dir(path+"*.txt")'生成grd文件的完整路徑,以供調(diào)用
While data<>"" '循環(huán)開始語(yǔ)句,批處理核心代碼
Surferapp.GridData(DataFile:=path+data,Algorithm:=srfKriging,ShowReport:=False,xMin:=114.3,xMax:=114.48,yMin:=22.56,yMax:=22.62,OutGrid:=path+data+".grd") '生成克里金插值方法的grd文件
data=Dir ()
Wend
3.3 批量繪置等值線圖
首先創(chuàng)建Surfer的應(yīng)用(Application)對(duì)象,打開一個(gè)已經(jīng)創(chuàng)建的底圖文件srf,然后獲得grd文件和文件路徑,開始循環(huán)繪制等值線圖,導(dǎo)出每個(gè)要素的srf文件。
核心代碼如下:
Set levels=ContourMapFrame.Levels
n=levels.Count '對(duì)象levels的等級(jí)總數(shù)
item=levels.Item(Index:=n)
If (item/1000>=1) Then item=item-item Mod 1000 '求余
If (item/1000<1 And item/100>=1) Then item=item-item Mod 100
If (item/100<1 And item/10>=1) Then item=item-item Mod 10
avg=(0+item)/4
levels.AutoGenerate(minlevel:=0,maxlevel:=item,interval:=avg)
levels(1).Fill.ForeColor=RGB(236,230,242)
levels(2).Fill.ForeColor=RGB(207,195,224)
levels(3).Fill.ForeColor=RGB(158,134,193)
levels(4).Fill.ForeColor=RGB(110,74,162)
因?yàn)榕幚頉]法完全代替人工所有的操作,所以需要把每個(gè)要素的等值線圖生成srf文件,以便對(duì)圖層進(jìn)行一些小的調(diào)整,以達(dá)到自己的要的效果。
3.4 圖形的輸出與自動(dòng)顯示
將圖件導(dǎo)出,需要用到Surfer的應(yīng)用(Application)對(duì)象的Export的方法[9]。
核心代碼如下:
While Data <> ""
doc = Surferapp.Documents.Open(path + Data, "")
If w = "" Or h = "" Then doc.Export(path + Data + "." + formats)
Else doc.Export(path + Data + "." + formats, SelectionOnly:=False, Options:="Width=" & w + ", Height=" & h)
End If
Data = Dir()
End While
4 結(jié)語(yǔ)
利用VB編程對(duì)海洋數(shù)據(jù)進(jìn)行處理,實(shí)現(xiàn)向Surfer軟件數(shù)據(jù)文件的自動(dòng)轉(zhuǎn)換,并用VB對(duì)Surfer軟件二次開發(fā)繪圖函數(shù),實(shí)現(xiàn)海洋要素的等值線圖、流場(chǎng)矢量圖等值線圖等圖形的繪制,以及展望未來要實(shí)現(xiàn)的功能,動(dòng)態(tài)顯示模型。將模擬結(jié)果通過可視化的手段直觀地顯示出來,有利于觀察和分析模擬結(jié)果。通過VB編制繪圖界面,繪圖任務(wù)簡(jiǎn)單明了,在繪圖界面上點(diǎn)擊各種功能按鈕即可進(jìn)行繪圖,并用combo控件實(shí)現(xiàn)在一個(gè)接口程序中多種圖形的批量繪制,減免不必要的重復(fù)編程與操作,節(jié)省一定的人力和時(shí)間。
參考文獻(xiàn)
[1] 賈宏元,趙光平,孫銀川,等.基于Surfer Automation對(duì)象技術(shù)的等值線自動(dòng)繪圖方法研究與應(yīng)用[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2006,15(7):21-24.
[2] 張新宜,張端好.利用VB對(duì)Surfer軟件二次開發(fā)實(shí)現(xiàn)降雨量圖自動(dòng)繪制[J].氣象水文海洋儀器,2010(1):24-27.
[3] 侯春秋,李澤琴,巫曉兵,等.VB和Surfer Automation技術(shù)在地球化學(xué)勘查中的應(yīng)用[J].物探化探計(jì)算技術(shù), 2010,32(5):555-570.
[4] 王冠琳,胡筱敏,熊學(xué)軍,等.使用Surfer Automation實(shí)現(xiàn)海洋要素等值線圖的批量繪制[J].海洋技術(shù),2007,26 (2):70-75.
[5] 尼建軍,張學(xué)宏.Surfer7.0嵌入VB6.0編程實(shí)現(xiàn)水文數(shù)據(jù)快速可視化[J].海洋測(cè)繪,2005,25(1):64-66.
[6] 姜麗杰.VB與Excel數(shù)據(jù)導(dǎo)人導(dǎo)出的研究與實(shí)現(xiàn)[J].遼寧師專學(xué)報(bào),2012,14(1):43-45.
[7] 宣瑞卿,朱介壽,鄭沂森.C++與Surfer的接口技術(shù)及其應(yīng)用[J].計(jì)算機(jī)應(yīng)用,2004(6):364-365.
[8] 劉峰.應(yīng)用Kriging算法實(shí)現(xiàn)氣象資料空間插值[J].氣象科技,2004,32(2):110-115.
[9] 張麗莉,吳健生.綜合利用VB與Surfer實(shí)現(xiàn)地學(xué)三維曲面的動(dòng)態(tài)顯示[J].計(jì)算機(jī)工程與應(yīng)用,2003(14):140-141.