基于VB和Surfer的海洋要素制图的批处理可视化系统

2018-03-06 12:59钟煜宏吴梅桂
科技资讯 2018年23期

钟煜宏 吴梅桂

摘 要:本文基于VB和Automation对象技术的使用程序控制Surfer自动绘图的方法,利用Surfer自带的Scripter脚本语言,可以实现Surfer面向对象编程语言的二次开发,实现海洋要素等值线图、分类图等不同类型图件的批量绘制,使用Visual Studio 2013开发工具,实现批处理可视化系统功能和界面,系统提供海洋数据处理功能,图件批处理等操作界面。本系统可以显著提高海洋绘图工作者的工作效率,避免重复工作导致的误差。

关键词:Surfer Automation VB 等值线 批量绘图 海洋要素

中图分类号:TP31 文献标识码:A 文章编号:1672-3791(2018)08(b)-0022-03

海洋制图数据量巨大,如果手动一个个处理数据,画等值线,效率低下,甚至容易出错,导致模拟结果失真。根据需要,本文比较几种处理方法,形成批量画等值线图的可视化系统。

Surfer是美国Golden Software公司研制开发的绘图软件,其不仅提供了丰富的网格化和插值方法,还具有强大的绘制等值线等矢量图能力,而且Surfer的还提供了Automation技术,发现可以使用Visual Studio 2010的VB.NET语言开发批量制图的客户端系统,此程序后台调用Surfer的Automation对象,轻松实现Surfer的强大图形绘制功能[1],本文选择Surfer软件的Automation技术去实现水质模拟可视化系统,去处理批量的数据。

1 调用Surfer软件绘图的基本原理

在VB中调用Suffer 8.0及以上版本进行嵌入式编程的原理类似于调用ActiveX控件编程。Suffer 8.0及以上版本采用了Automation方法来公开其接口,提供了不同种类的ActiveX Automation对象,它们几乎覆盖了Suffer 8.0及以上版本的所有功能[2]。

开发人员在VB程序中创建、调用它所提供的Automation对象,用以实现相应的数据可视化功能。更准确地说这种编程方法是一种面向对象的嵌入式编程方法。VB编程人员开发嵌入Suffer应用程序的过程主要包括两部分工作:一是按照以往的经验和习惯编写程序的主框架代码,即核心控制模块和显示控制模块;二是在完成主体代码后,参考Suffer提供的Automation对象,编写制作可视化产品的调用Suffer嵌入代码模块[3]。

2 系统设计

Surfer 8.0及以上版本在绘制等值线图时一共需要导入3种数据文件:包含等值线数据的DAT文件、图形边界的空白文件和底图文件(*.BLN),其主要绘制过程可分为导入、网格化、空白和叠合,操作流程如图1所示。利用Surfer绘图软件所提供的Automation方法的调用来实现数据批量处理。批量处理是利用VB Scripter编程语言来实现,调用Surfer 8.0提供的接口对象来实现批量绘图功能[4-5]。

3 系统技术实现以及关键代码

Surfer软件Automation技术的推出为实现VB和Surfer接口提供了可能。在VB应用程序中,可以给Surfer任何对象的属性赋值[6-7]。通过赋与不同的参数值改变对象的状态,程序执行过程中通过参数控制图形的输出。因此,在Surfer系统中进行的一系列手工操作,完全可以用外部程序中的一段代码代替,从而实现了Surfer自动绘图功能。

3.1 原始数据的批量处理

根据Surfer需要的文本格式设置Excel表格,不同介质为不同Excel表格,但是数据格式都是设置为站位、经度、纬度、要素值(1-n个要素),尤其要素值名称不能重复。详细格式如表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文件

網格化是把以XYZ数据文件格式表示的、通常是不规则分布的原始数据点,经过数学处理,构筑一个规则的空间矩形网格的过程。调用Surfer的应用(Application)对象的GridData方法[8]。

Set SurferApp =CreateObject(“surfer.Application”) '创建Surfer实例

path= GetFilePath("","txt","","")'获取参与图形绘制的txt文件所在的路径

If Path ="" Then End

Path=Left(Path,InStrRev(Path,"\"))

data=Dir(path+"*.txt")'生成grd文件的完整路径,以供调用

While data<>"" '循环开始语句,批处理核心代码

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 批量绘置等值线图

首先创建Surfer的应用(Application)对象,打开一个已经创建的底图文件srf,然后获得grd文件和文件路径,开始循环绘制等值线图,导出每个要素的srf文件。

核心代码如下:

Set levels=ContourMapFrame.Levels

n=levels.Count '对象levels的等级总数

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)

因为批处理没法完全代替人工所有的操作,所以需要把每个要素的等值线图生成srf文件,以便对图层进行一些小的调整,以达到自己的要的效果。

3.4 图形的输出与自动显示

将图件导出,需要用到Surfer的应用(Application)对象的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 结语

利用VB编程对海洋数据进行处理,实现向Surfer软件数据文件的自动转换,并用VB对Surfer软件二次开发绘图函数,实现海洋要素的等值线图、流场矢量图等值线图等图形的绘制,以及展望未来要实现的功能,动态显示模型。将模拟结果通过可视化的手段直观地显示出来,有利于观察和分析模拟结果。通过VB编制绘图界面,绘图任务简单明了,在绘图界面上点击各种功能按钮即可进行绘图,并用combo控件实现在一个接口程序中多种图形的批量绘制,减免不必要的重复编程与操作,节省一定的人力和时间。

参考文献

[1] 贾宏元,赵光平,孙银川,等.基于Surfer Automation对象技术的等值线自动绘图方法研究与应用[J].计算机系统应用,2006,15(7):21-24.

[2] 张新宜,张端好.利用VB对Surfer软件二次开发实现降雨量图自动绘制[J].气象水文海洋仪器,2010(1):24-27.

[3] 侯春秋,李泽琴,巫晓兵,等.VB和Surfer Automation技术在地球化学勘查中的应用[J].物探化探计算技术, 2010,32(5):555-570.

[4] 王冠琳,胡筱敏,熊学军,等.使用Surfer Automation实现海洋要素等值线图的批量绘制[J].海洋技术,2007,26 (2):70-75.

[5] 尼建军,张学宏.Surfer7.0嵌入VB6.0编程实现水文数据快速可视化[J].海洋测绘,2005,25(1):64-66.

[6] 姜麗杰.VB与Excel数据导人导出的研究与实现[J].辽宁师专学报,2012,14(1):43-45.

[7] 宣瑞卿,朱介寿,郑沂森.C++与Surfer的接口技术及其应用[J].计算机应用,2004(6):364-365.

[8] 刘峰.应用Kriging算法实现气象资料空间插值[J].气象科技,2004,32(2):110-115.

[9] 张丽莉,吴健生.综合利用VB与Surfer实现地学三维曲面的动态显示[J].计算机工程与应用,2003(14):140-141.