羅勝飛,童俊維,李志勇
(郴州市北湖區(qū)自然資源事務(wù)中心,湖南 郴州)
三維地形模擬作為地形信息的重要組成部分,它逼真地展示了地形的立體形態(tài),并模擬了地表的灰度變化,讓用戶可以直觀地觀察和感受[2]。用戶可以使用不同的需求來(lái)對(duì)同一個(gè)地形形態(tài)進(jìn)行多種三維立體顯示。三維地形模擬成為地理要素空間特征分析的重要工具,可以幫助用戶全面了解研究對(duì)象的空間變化特征。許多商業(yè)軟件擁有強(qiáng)大的三維立體渲染圖繪制功能,但它們通常只能在特定的軟件環(huán)境中使用。用戶開發(fā)的很多應(yīng)用程序需要使用三維立體渲染圖繪制功能,因此如何在專業(yè)軟件開發(fā)中將該功能二次開發(fā),并成功地集成到客戶應(yīng)用程序中,成為一個(gè)難題。無(wú)論是展示三維地形模擬,還是進(jìn)行準(zhǔn)確計(jì)算土方量,都離不開一系列核心技術(shù)的支持。這些關(guān)鍵技術(shù)包括三維地形建模、地形簡(jiǎn)化、插值、投影變換、紋理映射、光照處理以及DEM計(jì)算土方量等技術(shù)。這些技術(shù)在實(shí)現(xiàn)高精度三維地形模擬和土方量計(jì)算中發(fā)揮著至關(guān)重要的作用?,F(xiàn)在通過(guò)對(duì)常用的軟件對(duì)三維地形瀏覽、動(dòng)態(tài)顯示和土方量計(jì)算的實(shí)現(xiàn)情況和效果的比較,本著先進(jìn)性、實(shí)用性、標(biāo)準(zhǔn)化和可擴(kuò)充性原則,決定用南方CASS對(duì)柵格圖形進(jìn)行矢量化,獲得地形的原始數(shù)據(jù),以AutoCAD 為平臺(tái)通過(guò)VBA 調(diào)用Surfer 軟件對(duì)地形進(jìn)行三維地形模擬和三維土方量算。
本系統(tǒng)以AutoCAD 為平臺(tái),運(yùn)用VBA 調(diào)用Surfer軟件實(shí)現(xiàn)三維地形模擬和土方量計(jì)算[5]。我們首要任務(wù)是熟悉Surfer 軟件的土方量計(jì)算功能,并掌握Surfer 軟件的Automation 技術(shù),以便通過(guò)VBA更好地控制它。必須具備實(shí)際的測(cè)繪工程經(jīng)驗(yàn),并全面掌握三維地形模擬和土方量計(jì)算需求。在使用Surfer 軟件時(shí),可以采用一種高效的方法——“白化”技術(shù),來(lái)確定不規(guī)則的區(qū)域和線路區(qū)域。利用“*.bln”文件可以定義一個(gè)區(qū)域,然后輕松地從已知的DEM數(shù)據(jù)中提取該區(qū)域的DEM數(shù)據(jù)。利用Surfer 軟件進(jìn)行土方量計(jì)算時(shí),其過(guò)程實(shí)際上是通過(guò)計(jì)算不同高度位置上相同區(qū)域內(nèi)DEM的體積差來(lái)完成的。在實(shí)際工程領(lǐng)域,對(duì)于上方的DEM,所需的形狀主要分為曲面DEM、傾斜平面DEM和水平平面DEM,而下方的DEM也具有相同的三種情況。問(wèn)題可分解為求解不同情況下體積差的和,每種情況都需計(jì)算土方量。當(dāng)上表面為曲面DEM時(shí),下表面可以是曲面DEM、傾斜平面DEM和水平平面DEM。因此,共有9 種不同的土方量計(jì)算情況[1]。Surfer 軟件在生成曲面DEM時(shí),會(huì)根據(jù)測(cè)量得到的高程散點(diǎn)進(jìn)行插值,從而生成具有規(guī)則格網(wǎng)的DEM。傾斜平面地形高程模型可以通過(guò)格網(wǎng)函數(shù)計(jì)算得到,而水平平面地形高程模型是一個(gè)固定值。需要注意的是,當(dāng)Surfer 軟件生成曲面DEM時(shí),它使用的數(shù)據(jù)是有結(jié)構(gòu)的,并且默認(rèn)格式是“Surfer Worksheet”格式。從網(wǎng)格文件開始,創(chuàng)建直接渲染三維圖像。在Surfer 的后臺(tái)程序中進(jìn)行繪制過(guò)程,最終在客戶應(yīng)用程序界面上顯示繪制結(jié)果(參見圖1)。
圖1 挖方前地形
值得注意的是VBA 不能直接調(diào)用Surfer 生成的圖形,而是把生成的三維立體渲染圖保存為.bmp 圖,再用圖像框調(diào)用.bmp 圖顯示圖形, 圖像框可以顯示的圖形類型有位圖文件、圖標(biāo)文件等。調(diào)用LoadPicture 函數(shù)來(lái)加載圖形, 圖像框默認(rèn)會(huì)自動(dòng)調(diào)整大小以適應(yīng)圖形的大小[4]。
該系統(tǒng)主要由三大模塊組成:數(shù)據(jù)處理與三維建模、三維顯示與控制以及土方計(jì)算。
(1) 數(shù)據(jù)處理與三維建模模塊:此模塊功能在于它能將存儲(chǔ)在數(shù)據(jù)庫(kù)或文件中的三維點(diǎn)數(shù)據(jù)轉(zhuǎn)換為DEM,同時(shí)也能將等高線數(shù)據(jù)轉(zhuǎn)換為DEM。(2) 三維顯示與控制模塊:該模塊用于展示三維數(shù)據(jù),并能夠疊加圖層以及實(shí)現(xiàn)一系列基本的三維操作,如放大、縮小、平移、拉框放大、拉框縮小、水平旋轉(zhuǎn)場(chǎng)景、升降場(chǎng)景等[3]。(3) 土方計(jì)算模塊:此模塊提供多種填挖方量計(jì)算方式,包括規(guī)劃好的土方量計(jì)算、土方均衡計(jì)算和展示填挖方后的三維地形。
’以下生成曲面DEM
srf.GridData DataFile:=comDlg.FileName, xCol:=3, yCol:=4, zCol:=5, Algorithm:=srfKriging, ShowReport:=False,SearchEnable:=True, KrigStdDevGrid:=GetCurrentDvbFil ePath () & ″臨時(shí)數(shù)據(jù)″ & 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 () & ″臨時(shí)數(shù)據(jù)″& 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 () & ″臨時(shí)數(shù)據(jù)″ & Date & ″wfsj.grd″, OutFmt:=srfGridFmtS7
’以下代碼為生成白化邊界文件
ThisDrawing.Application.ActiveDocument.Utility.GetEntity objPL, Pnt, vbCr & ″選擇白化邊界(閉合的輕量多段線):″
bjdd = GetVertexCount(objPL)
Tqzb bjddx, bjddy, objPL
’調(diào)用提取多段線坐標(biāo)的函數(shù)
Set fso = CreateObject(″Scripting.FileSystemObject″)
Set MyFile = fso.CreateTextFile(GetCurrentDvbFilePath()& ″臨時(shí)數(shù)據(jù)″ & Date & ″.bln″, True)
MyFile.Close,Set fso = Nothing,Set MyFile = Nothing
Open GetCurrentDvbFilePath() & ″臨時(shí)數(shù)據(jù)″ & 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
’以下完成網(wǎng)格數(shù)據(jù)的″白化″
srf.GridBlank InGrid:=comDlg1.FileName, BlankFile:=GetCurrentDvbFilePath () & ″臨時(shí)數(shù)據(jù)″ & Date & ″.bln″, OutGrid:=comDlg2.FileName, OutFmt:=srfGridFmtS7’計(jì)算經(jīng)過(guò)白化處理的上下位置DEM體積差,即土方量。
Dim Results() As Double
srf.GridVolume Upper:=zsmbhsj, Lower:=sjmbhsj,
presults:=Results, ShowReport:=False
’土方量計(jì)算結(jié)果的顯示
Dim simpson38rule As Double
simpson38rule = Results(srfGVSimp38Vol)
Lable1.Caption = ″土方量計(jì)算結(jié)果為:″ + simpson38rule
’顯示模擬三維地形
Dim PlotDoc As Surfer.IPlotDocument
Dim MapFrame As Surfer.IMapFrame
Dim SurfaceMap As Surfer.ISurface ’定義對(duì)象
Set PlotDoc = SurferApp.Documents.Add(1)
Set MapFrame = PlotDoc.Shapes.AddSurface (comDlg.
FileName) ’添加對(duì)象
Set SurfaceMap = MapFrame.Overlays(1) ’設(shè)置對(duì)象
SurfaceMap.ShowBase = True ’設(shè)置底部不顯示
SurfaceMap.BaseFill.color = vbYellow’設(shè)置底部顏色
SurfaceMap.ShowColorScale = True ’設(shè)置比例尺
SurfaceMap.xMeshFreq = 0 ’設(shè)置X表面線顯示的頻率
SurfaceMap.yMeshFreq = 0 ’設(shè)置Y表面線顯示的頻率’設(shè)置光照角度
MapFrame.LightAzimuth = 130 ’設(shè)置光照水平角
MapFrame.LightZenith = 45 ’設(shè)置光照垂直角
MapFrame.LightModel = srfLMSmooth ’設(shè)置光照模式
MapFrame.ViewProjection = srfPerspective ’設(shè)置視角投影
’設(shè)置觀察角度
MapFrame.ViewFOV = Val(qxjd.Text)
MapFrame.ViewRotation = Val(xzjd.Text)
MapFrame.ViewTilt = Val(syjd.Text)
’用戶可以選擇將生成的三維立體渲染圖保存為bmp 圖像,并自行指定所需輸出圖像的尺寸和儲(chǔ)存路徑
PlotDoc.Export FileName:=GetCurrentDvbFilePath() & ″臨時(shí)數(shù)據(jù)″ & Date & ″.bmp″, Options:=″ Defaults= 1,Widtli =600, Height =700, ColorDepth= 24″
Image1.PictureSizeMode = 1
Image1.Picture = LoadPicture (GetCurrentDvbFilePath()& ″臨時(shí)數(shù)據(jù)″ & Date & ″.bmp″)
我們?cè)诟∏裆降娜S地形模擬和區(qū)域土方計(jì)算中運(yùn)用了此系統(tǒng),無(wú)論是在三維地形模擬還是土方計(jì)算,都取得了比較好的效果,為工程的順利開展提供了很好的幫助。
在柵格地形圖光柵插入南方CASS 之前,應(yīng)對(duì)區(qū)域的柵格地形圖的圖幅號(hào)進(jìn)行統(tǒng)計(jì),并在南方CASS 新建一個(gè)圖形文件,在圖上畫出圖幅號(hào)方格網(wǎng)。然后再把所有的光柵地形圖光刪插入,通過(guò)圖像糾正對(duì)光柵地形圖進(jìn)行校正,再把所有的光柵地形圖進(jìn)行拼接,得到整個(gè)地區(qū)的整體柵格地形圖。然后是對(duì)柵格地形圖進(jìn)行矢量化,當(dāng)時(shí)選擇用南方CASS進(jìn)行矢量化,就考慮了南方CASS 的編輯能力是其他矢量化軟件所不能媲美的,再加上南方CASS已經(jīng)有了現(xiàn)成的實(shí)體編碼庫(kù),還有就是,南方CASS有很多對(duì)等高線進(jìn)行處理的功能。綜合以上幾點(diǎn),用南方CASS進(jìn)行柵格地形圖的矢量化工作是很方便,很快捷的。
做完以上的工作后就是利用本系統(tǒng)進(jìn)行處理,有以下步驟:
(1) 導(dǎo)出數(shù)據(jù),按“導(dǎo)出數(shù)據(jù)”按鈕,根據(jù)提示,就可導(dǎo)出散點(diǎn)三維數(shù)據(jù)。(2) 數(shù)據(jù)處理,按“數(shù)據(jù)處理”按鈕,指定散點(diǎn)三維數(shù)據(jù)數(shù)據(jù)文件和指定圖形上的閉合多段線(白化邊界),就可生成Surfer 軟件可識(shí)別的網(wǎng)格數(shù)據(jù)了。(3) 挖方前地形模擬,地形狀態(tài)選擇“挖方前地形”,按“刷新”按鈕,即可在圖片框顯示三維圖形了,見圖1。(4) 土方計(jì)算,按“土方計(jì)算”按鈕,指定圖形上的閉合多段線(挖方邊界),即可計(jì)算出區(qū)域的填挖方和在圖形中生成施工零線,見圖2 和圖3。(5) 挖方后地形模擬,地形狀態(tài)選擇“挖方后地形”,按“刷新”按鈕,即可在圖片框顯示三維圖形了,見圖4。
圖2 土方計(jì)算
圖3 施工零線
圖4 挖方后地形
這個(gè)系統(tǒng)可以快速且簡(jiǎn)便地實(shí)現(xiàn)三維地形模擬和土方量計(jì)算,因此大大提高了工作效率,滿足了實(shí)際工作的緊迫需求。本系統(tǒng)使用了VBA開發(fā)語(yǔ)言的ActiveX技術(shù),并通過(guò)控制Surfer 軟件來(lái)完成計(jì)算程序。因此,要保證本系統(tǒng)正常運(yùn)行,必須在計(jì)算機(jī)上安裝Surfer 軟件,并且用戶需要具備一定的Surfer 軟件操作基礎(chǔ)。本系統(tǒng)在以AutoCAD2006、南方CASS7.0、Surfer11.0 為平臺(tái),順利的通過(guò)了調(diào)試測(cè)試,并在浮邱山的三維地形模擬和區(qū)域土方計(jì)算中運(yùn)用了此系統(tǒng)。本系統(tǒng)在功能方面還有進(jìn)一步擴(kuò)充的空間,比如:提供更多的原始數(shù)據(jù)的接口、土方計(jì)算提供放坡功能、三維模擬提供更多動(dòng)態(tài)的效果等等。