郭文彬
(北京華地四維勘測技術有限公司,北京 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.