罗胜飞,童俊维,李志勇
(郴州市北湖区自然资源事务中心,湖南 郴州)
三维地形模拟作为地形信息的重要组成部分,它逼真地展示了地形的立体形态,并模拟了地表的灰度变化,让用户可以直观地观察和感受[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 为平台,顺利的通过了调试测试,并在浮邱山的三维地形模拟和区域土方计算中运用了此系统。本系统在功能方面还有进一步扩充的空间,比如:提供更多的原始数据的接口、土方计算提供放坡功能、三维模拟提供更多动态的效果等等。