羅勝飛,童俊維,李志勇
(郴州市北湖區自然資源事務中心,湖南 郴州)
三維地形模擬作為地形信息的重要組成部分,它逼真地展示了地形的立體形態,并模擬了地表的灰度變化,讓用戶可以直觀地觀察和感受[2]。用戶可以使用不同的需求來對同一個地形形態進行多種三維立體顯示。三維地形模擬成為地理要素空間特征分析的重要工具,可以幫助用戶全面了解研究對象的空間變化特征。許多商業軟件擁有強大的三維立體渲染圖繪制功能,但它們通常只能在特定的軟件環境中使用。用戶開發的很多應用程序需要使用三維立體渲染圖繪制功能,因此如何在專業軟件開發中將該功能二次開發,并成功地集成到客戶應用程序中,成為一個難題。無論是展示三維地形模擬,還是進行準確計算土方量,都離不開一系列核心技術的支持。這些關鍵技術包括三維地形建模、地形簡化、插值、投影變換、紋理映射、光照處理以及DEM計算土方量等技術。這些技術在實現高精度三維地形模擬和土方量計算中發揮著至關重要的作用。現在通過對常用的軟件對三維地形瀏覽、動態顯示和土方量計算的實現情況和效果的比較,本著先進性、實用性、標準化和可擴充性原則,決定用南方CASS對柵格圖形進行矢量化,獲得地形的原始數據,以AutoCAD 為平臺通過VBA 調用Surfer 軟件對地形進行三維地形模擬和三維土方量算。
本系統以AutoCAD 為平臺,運用VBA 調用Surfer軟件實現三維地形模擬和土方量計算[5]。我們首要任務是熟悉Surfer 軟件的土方量計算功能,并掌握Surfer 軟件的Automation 技術,以便通過VBA更好地控制它。必須具備實際的測繪工程經驗,并全面掌握三維地形模擬和土方量計算需求。在使用Surfer 軟件時,可以采用一種高效的方法——“白化”技術,來確定不規則的區域和線路區域。利用“*.bln”文件可以定義一個區域,然后輕松地從已知的DEM數據中提取該區域的DEM數據。利用Surfer 軟件進行土方量計算時,其過程實際上是通過計算不同高度位置上相同區域內DEM的體積差來完成的。在實際工程領域,對于上方的DEM,所需的形狀主要分為曲面DEM、傾斜平面DEM和水平平面DEM,而下方的DEM也具有相同的三種情況。問題可分解為求解不同情況下體積差的和,每種情況都需計算土方量。當上表面為曲面DEM時,下表面可以是曲面DEM、傾斜平面DEM和水平平面DEM。因此,共有9 種不同的土方量計算情況[1]。Surfer 軟件在生成曲面DEM時,會根據測量得到的高程散點進行插值,從而生成具有規則格網的DEM。傾斜平面地形高程模型可以通過格網函數計算得到,而水平平面地形高程模型是一個固定值。需要注意的是,當Surfer 軟件生成曲面DEM時,它使用的數據是有結構的,并且默認格式是“Surfer Worksheet”格式。從網格文件開始,創建直接渲染三維圖像。在Surfer 的后臺程序中進行繪制過程,最終在客戶應用程序界面上顯示繪制結果(參見圖1)。

圖1 挖方前地形
值得注意的是VBA 不能直接調用Surfer 生成的圖形,而是把生成的三維立體渲染圖保存為.bmp 圖,再用圖像框調用.bmp 圖顯示圖形, 圖像框可以顯示的圖形類型有位圖文件、圖標文件等。調用LoadPicture 函數來加載圖形, 圖像框默認會自動調整大小以適應圖形的大小[4]。
該系統主要由三大模塊組成:數據處理與三維建模、三維顯示與控制以及土方計算。
(1) 數據處理與三維建模模塊:此模塊功能在于它能將存儲在數據庫或文件中的三維點數據轉換為DEM,同時也能將等高線數據轉換為DEM。(2) 三維顯示與控制模塊:該模塊用于展示三維數據,并能夠疊加圖層以及實現一系列基本的三維操作,如放大、縮小、平移、拉框放大、拉框縮小、水平旋轉場景、升降場景等[3]。(3) 土方計算模塊:此模塊提供多種填挖方量計算方式,包括規劃好的土方量計算、土方均衡計算和展示填挖方后的三維地形。
’以下生成曲面DEM
srf.GridData DataFile:=comDlg.FileName, xCol:=3, yCol:=4, zCol:=5, Algorithm:=srfKriging, ShowReport:=False,SearchEnable:=True, KrigStdDevGrid:=GetCurrentDvbFil ePath () & ″臨時數據″ & Date & ″.grd″, OutGrid:=comDlg1.FileName, OutFmt:=srfGridFmtS7
’以下生成傾斜平面DEM
srf.GridFunction Function:=″z=z1-(((y2-y1)* (z3-z1)-(z2 -z1)*(y3-y1))*(x-x1)+((z2-z1)*(x3-x1)-(x2-x1)*(z3-z1))*(yy1))/((x2-x1)* (z3-z1)-(y2-y1)* (x3-x1))″,xMin:=minbjx,xMax:=maxbjx, xInc:=0.1, yMin:=minbjy, yMax:=maxbjy,yInc:=0.1, OutGrid:=GetCurrentDvbFilePath () & ″臨時數據″& Date & ″wfsj.grd″, OutFmt:=srfGridFmtS7
’以下生成水平平面DEM
srf.GridFunction Function:=″z =sjbg″, xMin:=minbjx,xMax:=maxbjx, xInc:=0.1, yMin:=minbjy, yMax:=maxbjy,yInc:=0.1, OutGrid:=GetCurrentDvbFilePath () & ″臨時數據″ & Date & ″wfsj.grd″, OutFmt:=srfGridFmtS7
’以下代碼為生成白化邊界文件
ThisDrawing.Application.ActiveDocument.Utility.GetEntity objPL, Pnt, vbCr & ″選擇白化邊界(閉合的輕量多段線):″
bjdd = GetVertexCount(objPL)
Tqzb bjddx, bjddy, objPL
’調用提取多段線坐標的函數
Set fso = CreateObject(″Scripting.FileSystemObject″)
Set MyFile = fso.CreateTextFile(GetCurrentDvbFilePath()& ″臨時數據″ & Date & ″.bln″, True)
MyFile.Close,Set fso = Nothing,Set MyFile = Nothing
Open GetCurrentDvbFilePath() & ″臨時數據″ & Date& ″.bln″ For Output As #1
Print #1, bjdd & ″,0″ & ″″″ & ″; 0#; ″ & ″″″
For i = 1 To bjdd Print #1, bjddx (i) & ″,″ &bjddy(i) & ″,″ & 0 Next i Close #1
’以下完成網格數據的″白化″
srf.GridBlank InGrid:=comDlg1.FileName, BlankFile:=GetCurrentDvbFilePath () & ″臨時數據″ & Date & ″.bln″, OutGrid:=comDlg2.FileName, OutFmt:=srfGridFmtS7’計算經過白化處理的上下位置DEM體積差,即土方量。
Dim Results() As Double
srf.GridVolume Upper:=zsmbhsj, Lower:=sjmbhsj,
presults:=Results, ShowReport:=False
’土方量計算結果的顯示
Dim simpson38rule As Double
simpson38rule = Results(srfGVSimp38Vol)
Lable1.Caption = ″土方量計算結果為:″ + simpson38rule
’顯示模擬三維地形
Dim PlotDoc As Surfer.IPlotDocument
Dim MapFrame As Surfer.IMapFrame
Dim SurfaceMap As Surfer.ISurface ’定義對象
Set PlotDoc = SurferApp.Documents.Add(1)
Set MapFrame = PlotDoc.Shapes.AddSurface (comDlg.
FileName) ’添加對象
Set SurfaceMap = MapFrame.Overlays(1) ’設置對象
SurfaceMap.ShowBase = True ’設置底部不顯示
SurfaceMap.BaseFill.color = vbYellow’設置底部顏色
SurfaceMap.ShowColorScale = True ’設置比例尺
SurfaceMap.xMeshFreq = 0 ’設置X表面線顯示的頻率
SurfaceMap.yMeshFreq = 0 ’設置Y表面線顯示的頻率’設置光照角度
MapFrame.LightAzimuth = 130 ’設置光照水平角
MapFrame.LightZenith = 45 ’設置光照垂直角
MapFrame.LightModel = srfLMSmooth ’設置光照模式
MapFrame.ViewProjection = srfPerspective ’設置視角投影
’設置觀察角度
MapFrame.ViewFOV = Val(qxjd.Text)
MapFrame.ViewRotation = Val(xzjd.Text)
MapFrame.ViewTilt = Val(syjd.Text)
’用戶可以選擇將生成的三維立體渲染圖保存為bmp 圖像,并自行指定所需輸出圖像的尺寸和儲存路徑
PlotDoc.Export FileName:=GetCurrentDvbFilePath() & ″臨時數據″ & Date & ″.bmp″, Options:=″ Defaults= 1,Widtli =600, Height =700, ColorDepth= 24″
Image1.PictureSizeMode = 1
Image1.Picture = LoadPicture (GetCurrentDvbFilePath()& ″臨時數據″ & Date & ″.bmp″)
我們在浮邱山的三維地形模擬和區域土方計算中運用了此系統,無論是在三維地形模擬還是土方計算,都取得了比較好的效果,為工程的順利開展提供了很好的幫助。
在柵格地形圖光柵插入南方CASS 之前,應對區域的柵格地形圖的圖幅號進行統計,并在南方CASS 新建一個圖形文件,在圖上畫出圖幅號方格網。然后再把所有的光柵地形圖光刪插入,通過圖像糾正對光柵地形圖進行校正,再把所有的光柵地形圖進行拼接,得到整個地區的整體柵格地形圖。然后是對柵格地形圖進行矢量化,當時選擇用南方CASS進行矢量化,就考慮了南方CASS 的編輯能力是其他矢量化軟件所不能媲美的,再加上南方CASS已經有了現成的實體編碼庫,還有就是,南方CASS有很多對等高線進行處理的功能。綜合以上幾點,用南方CASS進行柵格地形圖的矢量化工作是很方便,很快捷的。
做完以上的工作后就是利用本系統進行處理,有以下步驟:
(1) 導出數據,按“導出數據”按鈕,根據提示,就可導出散點三維數據。(2) 數據處理,按“數據處理”按鈕,指定散點三維數據數據文件和指定圖形上的閉合多段線(白化邊界),就可生成Surfer 軟件可識別的網格數據了。(3) 挖方前地形模擬,地形狀態選擇“挖方前地形”,按“刷新”按鈕,即可在圖片框顯示三維圖形了,見圖1。(4) 土方計算,按“土方計算”按鈕,指定圖形上的閉合多段線(挖方邊界),即可計算出區域的填挖方和在圖形中生成施工零線,見圖2 和圖3。(5) 挖方后地形模擬,地形狀態選擇“挖方后地形”,按“刷新”按鈕,即可在圖片框顯示三維圖形了,見圖4。

圖2 土方計算

圖3 施工零線

圖4 挖方后地形
這個系統可以快速且簡便地實現三維地形模擬和土方量計算,因此大大提高了工作效率,滿足了實際工作的緊迫需求。本系統使用了VBA開發語言的ActiveX技術,并通過控制Surfer 軟件來完成計算程序。因此,要保證本系統正常運行,必須在計算機上安裝Surfer 軟件,并且用戶需要具備一定的Surfer 軟件操作基礎。本系統在以AutoCAD2006、南方CASS7.0、Surfer11.0 為平臺,順利的通過了調試測試,并在浮邱山的三維地形模擬和區域土方計算中運用了此系統。本系統在功能方面還有進一步擴充的空間,比如:提供更多的原始數據的接口、土方計算提供放坡功能、三維模擬提供更多動態的效果等等。