2004年厦门市气象局新一代自动气象站改造完成, 但新的自动站数据查询软件仍然以表格方式查询, 缺乏图形显示的直观性。surfer8.0中文版是美国Golden公司自主研究开发的制作等高线和三维地形立体图的软件。surfer8.0具有很强的图形显示功能, 同时surfer automation提供了大量的ActiveX对象, VB6.0可方便地对surfer automation ActiveX对象进行调用, 这使雨量图形可视化编程成为可能。
1 基本原理Surfer 8.0的最主要的功能是绘制等高线图, 对要求绘制等高线的数据有特殊的格式要求, 即首先要将数据文件转换成Surf-er8.0认识的grd文件格式, 才能做等高线绘制, 然后在等高线图上加上背景地图(本地的地形图)[1]。由于自动站的设点不可能按网格化的方式来进行布点, 采集到的数据在作图过程中要进行插值计算。最后在等高线之间填上相对应的雨量值的颜色。
在VB6.0中对Surfer 8.0进行嵌入式编程的原理类似于调用ActiveX对象编程。Surfer 8.0采用了Automation方法来公开其接口, 提供了近60种不同种类的Ac-tiveX Automation对象, 它们几乎覆盖了Surfer 8.0的所有功能。在安装Surfer 8.0之后, 开发人员就可以在VB程序中创建、调用它所提供的Automation对象, 用以实现相应的数据可视化功能。更准确地说这种编程方法是一种面向对象的嵌入式编程方法。
2 模块化结构设计采用功能模块化结构设计, 每个模块都被独立地实现, 模块在功能上独立, 可根据用户需求灵活配置。该应用软件通过调用数据库中的自动站雨量资料实现图形可视化, 程序包括的模块见图 1。
该模块使用VB6.0的ADO(AcitveX Data Object)对象实现数据库的连接与数据调用, ADO作为最新的数据库访问模式, 同传统的数据对象层次(DAO和RDO)不同, ADO可以独立创建, 如可以只创建一个“Connection”对象, 但是可以有多个独立的“Recordset”对象来使用它。不同类型的自动站观测仪器, 所采集的雨量资料存贮于多个数据库表中。在调用时段雨量数据时, 通过设置不同的参数变量, 取出各个站的雨量累加值, 并将数据输出至surfer支持的文本格式数据文件中。
2.2 图形绘制模块该模块调用surfer automation ActiveX对象, 实现自动站离散站点数据的网格化, 并将网格数据白化(将地图边界以外的数据重设为空值)。由于网点数据的不均匀, 采集到的数据要进行插值计算。Surfer 8.0提供了加权反距离、克里格、最小曲率、改进谢别德、自然邻点、最近邻点、多项式回归、径向基函数、带线性插值的三角剖分、移动平均、数据度量、局部多项式等12种网格化方法, 软件选取效果较好的三种方法:加权反距离法、克里格、最小曲率法。网格化只需调用application对象的griddata方法, 并设置相应的参数即可实现。数据等值线绘制共分九个层次, 每个层次的值代表雨量数据的大小, 等值线的取值量级和颜色可根据实际需要进行调整。在加上背景地图时, 先对当地行政地图做数据化处理, 即取行政地图边界线的经纬度, 取的点数越多, 描绘出来的数字地图就越准确。
2.3 显示控制模块该模块提供应用程序与后台数据库的连接界面, 并可在线测试数据库的工作情况。通过对时间段的选择, 即可显示每分钟的实时雨量, 也可显示历史上任一时段的雨量分布。在编辑菜单选项中, 可随时订正自动雨量站的经纬度、雨量值, 或添加新增雨量站并重新绘制图形。用户可以对网格化方法以及等值线等级进行设置, 可以将图形输出成多种图像格式(如:gif、bmp、jpg、emf、jpeg、png等)进行保存。
2.4 打印输出模块利用VB为用户提供的Windows公用标准对话框CommonDialog控件, 可实现打印屏幕上显示出来的图形内容。需要解决的是属性匹配与窗体缩放问题。具体过程是:使用打印机的ScaleX和ScaleY方法, 获取以twip为单位的打印机尺寸, 再利用窗体的ScaleX和ScaleY方法将这些尺寸转换为窗体中的坐标系统, 从而实现以窗体的坐标系统提供打印机可打印区域大小的目的。然后, 用这些尺寸作为打印机中新的Scale-Width和ScaleHeight, 即可实现属性匹配。当需要扩大或缩小窗体的大小时, 要确定对象被缩放的系数。除了在软件上直接打印图形外, 还可以通过其它图形显示软件打印保存过的图像。
以上四个模块之间的相互关系见图 1。用户通过显示控制模块向数据调用模块发出请求, 数据调用模块根据用户需求检索数据库中的雨量数据, 并将数据输出为surfer支持的格式数据文件。图形绘制模块根据用户对图形要素的设置进行绘图, surfer可以将图形直接输出成各种图像文件; 也可以将图形拷贝至clipboard, 再由VB的savepicture方法输出图像, 通过打印输出模块把图像打印出来。
3 关键性技术的实现在编写嵌入Surfer对象的程序代码时, 首先要创建Surfer的应用(Application)对象, 它是这种编程方法的关键; 其次, 根据数据可视化需求, 调用对象的相应方法, 制作图形元产品; 最后, 将最终的可视化结果拷贝至系统粘贴板中, 由应用程序的显示模块调用显示。
以下说明利用VB6.0调用Sufer8.0进行嵌入式编程的代码实现过程。
3.1 创建surfer8.0应用程序对象Dim surfapp as object
Set surfapp=creatobject
(“surfer.application”)
其中CreateObject是Visual Basic提供的一个方法, 它创建并返回一个对ActiveX对象的引用。CreateObject方法在系统注册表里查找“Sufer.Application”项, 并自动激活Sufer服务。
3.2 创建各种图形对象(1) 首先建立图形文档并建立shaps对象
Set docs=surfapp.documents
Set plotdoc=docs.add(doctype:=1)
Set shapes=plotdoc.shapes
(2) 用shapes对象的addcontourmap方法建立等值线图对象
Set mapframe=shapes.addcontourmap (gridfilename:=grd_file)
Grd_file是surfer支持的以*.grd为后缀的格点数据格式, 要得到这种格式的数据可以用surfer8.0应用程序对象的gridda-ta方法对离散的站点资料进行网格化, 该方法提供了12种不同的网格方法, 在应用程序中选择了局部多项式加权反距离法、克里格、最小曲率法三种效果较好的方法供用户使用。
(3) 用shapes对象的addbasemap方法建立基面图对象为图形添加地图背景
Set mapframe=shapes.addbasemap (importfilename:=mapfile)
其中mapfile是surfer8.0支持的地图边界文件, 这里选用*.bln格式边界文件。
(4) 用shapes对象的addpostmap方法建立张贴图对象为图形添加雨量及站名标注
Set mapframe=shapes.addpostmap (datafilename=stn_file)
Surfer automation为用户提供了多种方法使其可以设置各种图形对象的属性。
3.3 复制图形结果到系统Clipboard将已制作的功能部件复制到系统粘贴板(Clipboard)
Shapes.SelectAll
Set selection=plotdoc.Selection
Selection.copy
将系统粘贴板中的图形元产品拷贝至应用程序的显示控件PictureBox中
PictureBox.Picture=
Clipboard.GetData(2)
至此已经完成了数据等值线图形制作的主要工作。如果需要保存数据的可视化结果, Sufer也提供了输出图形文件的功能, 而且支持jpg、bmp、png、dxf等多种图形格式(以上只列出了嵌入代码模块中的一些核心部分)。从数据的调用到图形的绘制, 需应用到更多的程序设计。
4 小结与表格方式查询相比, 自动站雨量资料的图形方式的查询在直观性方面有较大优势。日常业务中, 它有利于预报员及时了解局地天气细微变化, 提高预报的准确率; 台风、暴雨时, 它有利于各级领导随时掌握厦门地区降雨情况, 及时采取正确的防灾措施; 人工增雨作业中, 它有利于作业指挥和作业人员根据雨情变化, 适时发布正确的作业指令和评估作业效果。随着今后自动站数量的增加, 将越来越精确地反映本地区的实际降水情况。同时, 只要修改数据调用参数, 也可完成自动站其它要素的图形显示。
[1] |
尼建军, 张学宏. surfer7.0嵌入VB6.0编程实现水文数据快速可视化[J]. 海洋测绘, 2005, 25(1): 64-66. |