用Surfer和Vb实现区域自动站等值线自动绘制李湘云崔庆标(西双版纳州气象台666100)摘要对Surfer功能深入研究后发现,引用Vb与Sufer联合编程,并结合区域自动站数据库,可以实现区域自动站雨量等气象数据的填图、等值线绘制及色彩填充,以直观可视的图形方式表现数据。同时与州市(县)界、站点等底图文件叠加显示并输出图形,应用在决策服务产品中,为地方领导和相关部门提供更直观、更准确的气象信息,为领导决策提供科学依据。关键词:SurferVb等值线自动绘图1引言在气象数据处理和应用工作中,需要绘制大量的气象要素图片,随着气象事业的发展,预报产品不断丰富,服务方式日趋多样化,如影视制作、气象网站等,这在很多情况下需要以图形替代以往的文字、表格方式,从而直观地表达气象信息,适应受众习惯。目前很多用于气象业务科研应用的图形处理系统,如Micaps、Grads、Surfer、Metlab等,在这些软件中,通过Micaps实现图形化显示,是气象业务中通用的方法,但Micaps图形的格式一般软件无法识别。Grads是气象专用软件,但是在Dos环境下开发而成,界面不友好、而且只能读二进制数据,需要自己编程实现,难度较高。Metlab功能强大,想要深入了解如何使用,计算机水平要求较高。Surfer是美国GoldenSoftware公司开发的专业软件,最新的Surfer8.0版本添加了Com组件,任何语言只需简单地引用即可进行开发,是一种较为现代化的软件。而且只要有一定的经纬度数据,Surfer就可绘出任意地域底图,这就为择用诸多地理信息系统数据提供了方便。国内对于Surfer8.0的研究涉及环境、地理、气象、水文等多个领域,取得了一定的成果。如梁亮[1]、曾志雄[2]等如何使用Surfer8.0绘制气象等值线图;陆志波[3]等人研究了Surfer8.0在环境评价和规划中的应用;毛兴华[4]等将MapInfo和Surfer结合绘制等值线;董舒[5]做了Surfer软件在绘制水下地形图中的应用。该软件使用方便、简单易学,有着强大的绘图功能,常用的等值线图、线框图、地形地貌图和三维表面图等都可以借助其轻松完成。因此用Surfer生成气象图形,是当今地市级气象部门较为理想的选择。西双版纳区域加密自动气象站于2007年底建设完成,现有两要素区域自动站45个,但自动站数据查询仍以表格查询为主,缺乏图形显示的直观性。本文通过实例详细说明如何将Surfer强大的绘图功能与Vb编制交互界面程序的优势结合,实现区域自动站雨量资料的填图、数据插值、等值线绘图及色彩填充,并叠加了利用Mapinfo生成的区域矢量底图,将图形信息应用于决策服务,为领导决策提供及时、科学、直观的产品。2Surfer8.0软件简介2.1软件运行环境及特点Surfer8.0是美国GoldenSoftware公司的系列绘图软件之一,该软件简单易学,可以在几分钟内学会主要内容,且其自带的英文帮助,对如何使用Surfer解释的很详细。其中的tutorial教程更是清晰的介绍了Surfer的简单应用,应该说Surfer软件自带的帮助文件是相当完美且容易阅读的,只要学过英语的人都可以很快上手。Surfer的安装比较简单,只要按其提示缺省安装即可。其安装软件的大小不到30M,一般的计算机硬件基本能够顺利使用该软件。Surfer是具有插值功能的绘图软件,因此,即使数据是不等间距的,依然可以用它作图。Surfer的主要功能是绘制等值线图,此外它还可以绘制张贴图,分类张贴图和三维表面图等形式的图形。Surfer8.0提供了12种内插方法,能迅速地将离散点的测量数据通过插值转换为连续的数据曲面。Surfer8.0中的ActiveX自动化所提供的编程接口,很容易用各种ActiveX客户编程语言(如Vb、Dehphi、C#)来定制Surfer。2.2绘图流程应用Surfer软件绘制图形,首先要根据不同的作图目的,提供合适格式的数据文件格式。其中,最基本的格式是ASCII码形式的XYZ数据格式。有了原始数据后,需要用Surfer软件的Grid菜单中的命令对此数据进行网格化,将数据格式转换成Surfer软件作图时识别的格式,然后再由此网格化的数据用Map菜单中的命令绘制相应的各种图形。此外,还可以直接将XYZ数据格式用特定的程序语言将其直接转化为Surfer识别的网格化数据格式,我们称之为ASCII码GRD文件,这样同样可以用此网格文件作图。简单的讲,要想用Surfer软件进行绘图,首先要将原始数据文件整理或转换为Surfer绘图要求的文件格式,这样就可以轻松的做出各种漂亮的图形。3开发过程Surfer8.0除了可以手工绘图外,还可以调用其Script语言,从而自动处理图形,这是Surfer的高级应用,也是批量成图的最简单方法。手工用Surfer去绘制气象等值线图,各种参数的设置都非常繁琐,Surfer软件提供了编程脚本语言CSScripter,可以利用它通过编程方便地控制Surfer的绘图功能。Surfer8.0内置60多种ActiveX对象,其包含关系如图1。通过对ActiveX的对象的编程,可以实现Surfer8.0软件提供的所有绘图功能。在VB6.0中调用Surfer8.0进行嵌入式编程类似于调用ActiveX控件编程,要调用Surfer8.0,就必须先获得Surfer8.0及其下属的对象模型,并把它们赋值给对象变量。在VB6.0中,可以用CreateObject函数创建Application对象。在创建Application对象后,就可以根据前面讲的绘图流程进行下一步的开发了。图1Surfer自动化对象层次Fig.1Surferautomationobjectlayer4应用实例这里介绍西双版纳州区域自动站降水量等值线图自动绘制过程。绘图过程根据前面2.2介绍的绘图流程,总体上可以分为任意时段区域自动站雨量数据获取、Vb调用Surfer绘制等值线、加载采用Mapinfo生成的底图矢量文件和图形输出等几个过程。4.1获取任意时间间隔区域自动站雨量数据等值线的绘制关键是数据的收集,Surfer绘图一般使用三列数据:XYZ,X为经度,Y为纬度,Z为气象要素值。这里采用的数据直接来源于西双版纳州气象局区域自动站数据库。任意时段区域自动站雨量数据由VB自动从数据库中获取,同时用VB把站点经纬度和任意时段区域自动站雨量数据写入文件station.dat,并存到指定文件夹,以便用surfer调取。数据的获取也可以把经纬度值先写入文件station.dat,接下来利用华创数据分析应用终端,选择气象要素数据文件,选取某一任意时间间隔为查询条件,获取该时段内本地区所有区域自动站的雨量信息并以Excel方式输出到指定文件夹(data.xls)中,必须注意数据顺序要与站点资料文件对应一致。4.2Vb调用Surfer绘制等值线Vb具有强大的“所见即所得”图形用户界面和编译功能。由于它支持ActiveX自动化控制协议,因此很容易在二者间建立ActiveX自动化连接,实现Vb应用程序对Surfer绘图功能的调用。代码如下:SetSurferApp=CreateObject(“Surfer.Application”)’注:创建对象,CreateObject是Vb提供的一个方法,它创建并返回一个对ActiveX对象的引用。CreateObject方法在系统注册表里查找“Sufer.Application”项,并自动激活Surfer服务。SurferApp.GridDataDataFile:=*\station.dat,xCol:=1,yCol:=2,zCol:=3,Algorithm:=2,DupMethod:=2,ShowReport:=False,OutGrid:=*\station.grd,xMin:=99.942882,xMax:=101.845122,yMin:=21.146981,yMax:=22.592122’注:接着就是利用VB代码控制Surfer来绘制等值线,生成一个空白的绘图页。用Kriging法将资料内插到网格点上,并定义网格的最大(小)经纬度,Datefile为包含路径的文件名,这里为雨量数据文件,Outgrid为数据插之后的输出文件。SurferApp.GridBlankInGrid:=*\station.grd,BlankFile:=*\bnbj.bln,OutGrid:=*\station.grd’注:用.bln文件白化等值线,去掉边界外的插值,并重新保存,为后面绘制等值线做准备。Setplot=SurferApp.Documents.Add(1)SetContourMapFrame=plot.Shapes.AddContourMap(*\station.grd)’注:生成一个空白的绘图页,并在空白绘图页上生成白化后的等值线图,并指定其文件名为ContourMapFrame。SetContourMap=ContourMapFrame.Overlays(1)ContourMap.Levels.LoadFile(*\降水等级.lvl)’注:降水等级文件可根据实际情况调整,以绘出较为美观的图形。ContourMap.SmoothContours=4ContourMap.ShowColorScale=TrueContourMap.FillContours=True’注:载入等值线等级文件,并平滑等值线,设置显示色标,最后,填充等值线。4.3加载采用Mapinfo生成的底图矢量文件为了更加详细的了解区域内各市县降水分布,为地方领导和各级部门决策提供科学依据,在雨量等值图上加载分县边界十分重要。由于一般图形都是图片格式无法在等值线图上直接加载,笔者根据毛兴华[4]等将MapInfo和Surfer结合绘制等值线一文中介绍的方法将西双版纳州市县界图片文件采用Mapinfo软件进行矢量化,并输出为mif文件,对mif文件进行适当修改得到可以方便加载在等值线图上的bnbj.bln边界文件。加载边界地理信息bln代码如下:SetBasemap=plot.Shapes.addbasemap(ImportFileName:=“*\bnbj.bln”)’注:给等值线图plot加载分县边界数据。Setpostmapframe=plot.Shapes.AddPostMap(datafilename:=*\station.xls,xCol:=1,yCol:=2,LabCol:=3)’注:添加张贴图,生成一个州(市)区域自动站数据填图图层。其中station.xls为自动站数据,第一行为经度,第二行为纬度,第三行为站点名称。Setpostmap1=PostMapFrame.Overlays(1)'注:下面对张贴图的属性进行设置SetMkFormat=postmap1.SymbolWithMkFormat.Size=0.05.Index=12EndWith'注:设置站点符号的大小和形状SetlbFont=postmap1.LabelFontWithlbFont.Face=宋体.Size=8EndWith'注:设置站点名称的字体和大小4.4图形输出Vb中显示图形一般用Picture框或Image框控件的Loadpicture方法实现。Surfer绘制的图形不能直接在Vb程序下显示,可将Surfer图形导出为.gif等Picture框控件所支持的图形文件格式,再用Loadpicture方法实现图形在Picture框中显示。以gif文件为例,将Surfer图形导出的代码如下:Setadtext=plot.Shapes.AddText(x:=1.5,y:=4,Text:=08年8月9日24小时降水图)Withadtext.Font.Face=宋体.Size=14EndWith'注:在图形的空白处加入标注plot.Shapes.SelectAllplot.Select.OverlayMaps’注:将上述所有图层进行合并plot.Expor