郭文彬
(北京华地四维勘测技术有限公司,北京 100096)
Microsoft Visual Basic(VB)是一种由Microsoft公司开发的结构化的、模块化的、面向对象的、包含协助开发环境的事件驱动为机制的可视化程序设计语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易地使用DAO、RDO、ADO连接数据库,或者轻松地创建ActiveX控件。程序员可以轻松地使用VB提供的组件快速建立一个应用程序[1]。
Surfer是美国Golden Software公司编制的一款以画三维图(等高线,image map,3d surface)的软件。该软件具有强大插值功能和绘制图件能力,是处理XYZ数据的首选软件。可以轻松制作基面图、数据点位图、分类数据图、等值线图、线框图、地形地貌图、趋势图、矢量图以及三维表面图等;提供十几种数据网格化方法,包含几乎所有流行的数据统计计算方法;提供各种流行图形图像文件格式的输入输出接口以及各大GIS软件文件格式的输入输出接口,大大方便了文件和数据的交流和交换;提供新版的脚本编辑引擎,自动化功能得到极大加强[2]。
本文通过VB和Surfer编程,结合工程中的数据特点,编制了Surfer自动成图工具,实现了等值线图的自动绘制。自动生成的等值线图如图1所示,程序界面如图2所示。
图1 等值线图
图2 程序界图
Surfer的程序结构是采用ActiveX组件技术构建的,可以采用各种编程语言如VB操作Surfer软件,并调用其对象的属性和方法实现自动绘制各种图形的功能。Surfer的对象层次结构如图3所示,其中最顶层的对象为Application对象,即Surfer本身,下面有四个直接对象:Documents Collection,Windows,Grid 和 VarioComponent。Documents Collection包含多级子对象,其中PlotDocument所包含的Shapes Collection是所有图形的集合以及符号和文本的集合。在Surfer中等值线图Contour Map也是图形的一种[3-4]。
Surfer的等值线自动成图就是通过调用这些对象的方法和属性来实现的。
图3 Surfer的对象层次结构图
使用Surfer软件绘制图形主要包括以下几个步骤:
①选择数据文件,根据工程的特点选择对应的3列数据,其中第一列为对应图形的X坐标值,第二列为对应图形的Y坐标值,第三列为高程或者其他属性值。
②选择合适的插值方法对所需要的数据进行网格化处理,生成对应的grd格式文件。
③根据已有的grd网格文件生成等值线图。
④对所绘制的等值线图进行颜色填充、白化处理以及标注等美化处理。
⑤把地图和等值线图、白化叠加,完成图形绘制。
本文Surfer自动化成图也是基于上述Surfer绘图的基本步骤来实现的。
对Surfer数据成图的过程和Surfer的对象模型有了清楚的了解后,就可以编写Surfer自动化成图的代码了。主要过程如下,显示部分代码[5-6]。
//定义Surfer对象和变量
Dim srf As New Surfer.Application
Dim plotDoc AsSurfer.IPlotDocument
Dim mapFrame AsSurfer.IMapFrame
Dim mapbase AsSurfer.IBaseMap
Dim mdbmapFrame As Surfer.IMapFrame
Dim mdbmapbase As Surfer.IBaseMap
Dim gcmapFrame AsSurfer.IMapFrame
Dim gcmapbase AsSurfer.IBaseMap
Dim mapContour As Surfer.IContourMap
Dim titletextAs Surfer.IText
Dim inFile,strfilename As String
Dim outFile,filemanyaddress As String
Dim intPos,i As Integer
Dim baseName As String
Dim GridFile As String
Dim outGridFile As String
Dim inFileName As String
Dim FilesAs Variant
Dim x,y AsDouble
Dim AxisAs Surfer.IAxis
//选择输入、输出文件和路径
With CommonDialog1
.MaxFileSize=32767
.DialogTitle=“打开文件”
.CancelError=False
.Filter=“TXT文件|*.txt|DAT文件|*.dat|所有文件(*.*)|*.*”
.Flags=cdlOFNAllowMultiselectOr cdlOFNExplorer
.ShowOpen
Files=Split(filemanyaddress,Chr(0))
For i=1 To UBound(Files)Step 1
Files(i)=Files(0)&“”&Files(i)
Next i
……
//网格化数据
srf.GridData DataFile:=strfilename,xCol:=2,yCol:=5,zCol:=4,yMin:=yminy,yMax:=ymaxy,xMin:=y,xMax:=x,NumRows:=((ymaxy-yminy)/ydist+1),NumCols:=((x-y)/xdist+1),Algorithm:=srfKriging,showreport:=False, outgrid: =outFile, OutFmt: =srfGridFmtS7,dupmethod:=srfDupNone
SetplotDoc=srf.Documents.Add(srfDocPlot)
//绘制等值线
Set map Frame=plotDoc.Shapes.AddContourMap(outFile)
SetmapContour=mapFrame.Overlays(1)
IfCheck1.Value=1 Then
mapContour.Levels.LoadFile(Text11.Text)
End If
mapContour.FillContours=True
mapContour.LabelFont.Size=dgxsize
mapContour.LabelFont.Face=Text9.Text
mapContour.SmoothContours=4
mapContour.SmoothContours=srfConSmoothHigh
//白化处理
IfCheck2.Value=1 Then
Set mapFrame=plotDoc.Shapes.AddBaseMap(Text12.Text&inFileName&".bln")
Setmapbase=mapFrame.Overlays(1)
mapbase.Line.Width=gcblnsize
End If
IfCheck3.Value=1 Then
Set mapFrame=plotDoc.Shapes.AddBaseMap(Text13.Text&inFileName&“.bln”)
Setmapbase=mapFrame.Overlays(1)
mapbase.Line.Width=mdbblnsize
End If
……
//添加标题和保存Surfer图形
Set titletext=plotDoc.Shapes.AddText(x:=(xpage/2-2),y:=(ypage-1),Text:=inFileName&“线视电阻率拟断面图”)
titletext.Font.Face=Text7.Text
titletext.Font.Size=titlesize
plotDoc.SaveAsbaseName&“.srf”
srf.ScreenUpdating=True
srf.Documents.CloseAllsrfSaveChangesNo
srf.Quit
到此,完成了Surfer的自动化成图。
本文通过利用VB和Surfer实现了自动绘制等值线图,同时借助于其强大的数据分析和绘图功能可以应用到其他领域,同时发现可以修改其配置文件surfer.set实现更多更好的功能,同时也更加简化。
[1]Microsoft Corporation微软(中国)有限公司.Visual Basic6.0中文版程序号指南[R].北京:希望电脑公司出品,1998.
[2]杨朝辉,党立华.基于Surfer Automation技术的三维立体渲染图的绘制[J].海洋测绘,2003(26):47-49.
[3]熊文兵.用Surfer7.0绘制气象等值线图[J].广西扩展名,2003(43):55-57.
[4]陈明,何门贵.利用Grapher绘制彩色渐变剖面平面图[J].物探与化探,2008,32(2):196-198.
[5]周阳,黄浩云,李志强,等.基于C#与Surfer Automation完成大气污染扩散等值线自动化生成[J].环境科学与管理,2011,36(1):31-34.
[6]黄梦龙.基于Surfer自动化的等值线图实时绘制与网络发布方法[J].测绘与空间地理信息,2012,12(35):176-180.