基于VB 的EPS 脚本技术在铁路地形图中的应用
2020-12-17张文腾
张文腾
(中国铁路设计集团有限公司,天津 300251)
铁路勘测是铁路设计的先行工序,地形测量与地形图绘制是其中一项重要的基础工作。 目前,铁路1 ∶2 000 地形图采集与编辑多采用EPS 平台,选用该平台的原因有:①平台具有强劲的三维显示和图形表现能力,可支持最新的裸眼三维测图编辑模式,在该模式下,数据获取和成果完成效率较传统方法都有较大提升;②支持C++、C#等编程语言以及VBScript/JSript等脚本语言开发。
根据CH/T 9020.1-2013《基础地理信息数字成果1 ∶500 1 ∶1 000 1 ∶2 000 生产技术规程》相关规定,地貌类要素应反映不同地貌类型的特点,正确表达细部地貌的形态特征,与其他要素关系合理。 因此,在处理等高线和地貌类要素(如斜坡和陡坎)与一般常规地物要素(如居民地、道路和河流等)相对关系时,必须将等高线打断并进行相应的捕捉处理。 传统方法为人工判读并进行裁剪打断操作,其效率、准确度均较低;此外,在地形图编辑时,需要返回EPS 三维测图模块内,根据DEM 重新采集高程,工作量较大。 上述问题均对地形图成果产出效率影响较大。
在1 ∶2 000 图编辑过程中,基于VBScript 进行脚本开发,能够批量对等高线进行裁剪,节省人工成本和时间成本;同时能对高程点高程进行修正,减少工序从而提升效率。 已有许多学者进行了相关研究,李奇等基于EPS 平台进行1 ∶500 地形图缩编为1 ∶2 000 地形图的研究[1-2];郭梦炽对道路的注记转化为道路属性进行了研究,其后通过脚本技术完成了该操作的批量化[3];李玉芳等以水系方向为研究对象进行脚本开发自动检查流向正确性的研究与应用[4-5];孙大龙根据地形图入库建设项目的要求,使用EPS 脚本技术进行CAD 注记数据转化为GIS 属性的操作[6];覃豪杰基于脚本技术完成平台内数据无损转化[7];张子林基于VBScript 进行EPS 内勘测定界自动化的研究[8];王鹏对DLG 入库一体化操作进行相关研究,并利用相关脚本函数完成一些功能的自动化[9];彭永峰等利用VBScript 脚本技术实现房屋阳台部分的绘制和地下管线数据的特定检查工作[10-11]。 以下基于前人的研究成果,针对1 ∶2 000 地形图编辑整饰进行开发设计。
研究具体思路为:①整理研究EPS VBScript 的基本原理与编码方法;②介绍两个功能的相应原理与源代码;③进行1 ∶2 000 地形图实例应用,验证其效果。
1 EPS 脚本语言VBScript
1.1 脚本语言的基本规则
该平台采用VBScript 语言,支持普通用户和第三方进行各类二次开发,在平台上可以完成诸如数据清整,转换和入库等处理操作,兼容性较好。
在平台的句法逻辑中,SSProcess 是平台主环境下预先设定完成的Entrance 对象,是与平台任何环境下的其他所有函数与功能连接交互的主通道,其重要性不言而喻。 其对应函数功能几乎包括所有系统环境内所需,如选择集指定操作,不同角度与视图下图形编辑操作,不同数据格式的转换操作和系统环境内操作命令响应设定等。 平台内所有的脚本程序主要包括两个大类:Modular 脚本和Modeless 脚本。 两者的相同之处是脚本程序终结语句一致,以系统默认的自定方式结束; 不同之处主要体现在Modeless 脚本多以OnInitScript()作为起始函数,再进行其他相关操作,这是由于Modeless 脚本需要和主视图窗口进行连接,以便后续在视图窗口内完成消息的响应功能,包括鼠标、按键和其他指示命令等;同时,还需要标准可视化窗口来保证用户对于特定参数的自定义需求。 因此,除起始入口函数外,还必须定义OnExitScript、OnOK 和OnCancel 等响应函数[12]。 而Modular 脚本较为方便,按照平台环境给定的默认方法即可运行。
1.2 脚本语言的功能模块
功能模块是为用户可以更高效地完成脚本而编写,将一部分已经存在的设定对象写成类似于库的形式。 这样做的好处是当用户需要相关功能时,无需再进行单独定义,这些主要的依据方式是“模块主名称.指定命令名称”来完成调用模块对象[13]。 常见的功能模块有SSEdit 修改平台模块、SScript 脚本处理模块、SSCheck 数据监理模块和SSDateBase 数据库模块等。部分功能模块的功能分类及其包含的一些函数命令见表1。
表1 脚本语言常用功能与实例
1.3 脚本语言的编码方法
EPS 内脚本的编码方法基本符合一般程序语言的编码方法,但仍有一些特征函数与方法需要特别注意,主要包括如下内容。
(1)任何脚本的入口函数均为OnClick(),这是一个脚本启动递进的方式,不可或缺。
(2)BeforeSaveImportData()函数作为系统消息函数,所有脚本函数都需要调用; 同时,该函数作为数据库访问指示函数,在导入外部数据时,需要进行调用激活,使得数据库能够正常被访问。
(3) 坐标投影换算入口函数
TransCoord XYZ ( ByVal planeSysName, ByVal heightSysName, ByVal reverse, ByVal transxy, ByVal transz,ByRef x, ByRef y, ByRef z)
(4)在某个脚本程序中完全支持运行外部其他脚本程序,可通过预先设置好的调用方式使用外部脚本程序。
2 等高线批量裁剪
2.1 基本原理
地貌要素是指地貌形态的各个组成部分,地貌要素各不相同,如山地要素有山顶、山坡和山麓等;阶地要素有阶地面、阶地斜坡或陡壁等;地貌最常用的表示方法有等高线法、分层设色法和晕渲法[14]。 在铁路地形图中,一般采用等高线法表示地区地形与地貌,还会使用各种类型的坎线、坡线和沟渠线等来表示区域内具体地貌状态[15]。
在使用EPS 进行地形图采集时,需要使用不同类型地貌符号来完成特征表示,这些地貌符号要素与等高线的性状相近,当等高线与这些要素发生位置重叠时,就需要进行打断与裁剪等处理。
为提升效率,可使用脚本开发筛选功能来完成这个操作,快速将等高线与地貌要素符号的重叠部分进行裁剪。
2.2 主要源码说明
脚本分为两个部分,一个是针对面状地貌,另一个是针对单独的坎线(坎编码)。 当进行编辑的时候,需要将其分开;按照制图要求与习惯,常用的面状地物有:未加固斜坡面,未加固人工斜坡面,田坎、路堑、沟堑和路堤等。 将其读取后,应设定需要编辑的地物面编码和图层,同时定义裁剪距离参数jl,源码如下。
res=SSProcess. ShowInputParameterDlg ("输入参数")
if res=0 then
'符号化刷新
SSProcess. ObjectDeal objID, " AddToSelection","", result
SSProcess. ObjectDeal 0," FreeSelection ObjectDisplayList", "", result
exit Sub
end if
bm = SSProcess. GetInputParameter ( " 裁剪面编码")
jl=SSProcess.GetInputParameter ("裁剪距离")
定义完成之后,将所需地物编码加入选择集中,再提出裁剪操作的判定条件,当面状地物区域内包括采集好的等高线时,可执行裁剪操作,裁剪距离通过jl参数传入,直到遍历该工程文件内所有面状地物编码,主要代码如下。
SSProcess. SetSelectCondition " SSObj _ Code","=", bm'范围面编码
SSProcess.SelectFilter
count=SSProcess.GetSelGeoCount
For i=0 To count-1
idss(i)= SSProcess. GetSelGeoValue(i," SSObj_ID")
Next
For i=0 To count-1
SSProcess. SetSelectCondition " SSObj _Type","=","LINE"
SSProcess. SetSelectCondition " SSObj _Code","=","7101012,7101022" '等高线编码编码
对于田坎等几种制图中常用的陡坎类线状地物,在裁剪编辑时,需要注意对坎毛方向的定义,这样裁剪出来的结果不会因为没有对该元素进行判读而产生歧义。 对于坎毛线,可使用定义距离平行线的方法来处理,方向则定义线前进方向左侧为0,右侧为1,具体代码如下。
id1 = SSProcess. LineParallelDist ( id0, dist,direction,0,1)
darwarea id0,id1
SSProcess.DeleteObject id1
Next
For i=0 To k-1
SSProcess.ClearSelection
SSProcess.ClearSelectCondition
SSProcess. SetSelectCondition " SSObj _Code","=",clipcodes
SSProcess.SelectFilter
SSProcess.SelectionObjClip idstrs(i),0,0.001
SSProcess.DeleteObject idstrs(i)
Next
其中,darwarea 是针对坎毛中间部分的一个界定,在制图标准中,这部分的等高线被坎线部分打断之后,也需要进行编辑。 因此,重新定义了该函数的编辑操作,具体代码如下。
pc0 = SSProcess. GetObjectAttr ( id0," SSObj _PointCount")
pc1 = SSProcess. GetObjectAttr ( id1," SSObj _PointCount")
SSProcess.CreateNewObjByCode 2
For i=0 To pc0-1
SSProcess. GetObjectPoint id0, i,x,y,z, ptype,name
SSProcess.AddNewObjPoint x,y,0,0,""
Next
For i=pc1-1 To 0 step-1
SSProcess. GetObjectPoint id1, i,x,y,z, ptype,name
SSProcess.AddNewObjPoint x,y,0,0,""
Next
SSProcess. GetObjectPoint
id0,
0, x, y, z,ptype, name
SSProcess.AddNewObjPoint x,y,0,0,""
2.3 程序运行与实例
参照之前的代码与功能分析,得到相应的脚本程序后,选择某铁路项目1 ∶2 000 地形图成果进行检验。 该项目为高速铁路,线路位于山东省东部地区,设计时速为350 km,地形整体较为平坦,但局部起伏较大。 为方便比对,在脚本运行的同时,也通过人工编辑的方法进行相同操作,以获取人工编辑效率作为对比。
所选地区制图面积为1.56 km2,地形起伏较为明显,故等高线密度较高,并且存在诸多斜坡与陡坎地形,地形图编辑工作量较大,部分情况如图1 所示。
图1 某铁路项目地形图部分成果
通过实际编辑操作,发现人工编辑所使用的时间较长,且出现4 处等高线未捕捉到位的情况,这是因为使用了打断功能后,未进行二次捕捉操作,根据制图规范和成果要求,该类问题应按照错误处理,如图2。
而通过脚本运行完成等高线批量操作,所消耗时长较短,同时可在脚本程序对话框内自定义统一的裁剪距离,如图3 所示。 处理结果准确度较高,完成后未发现存在错误(见图4、图5)。
3 高程点修正
图2 人工编辑后不准确问题
图3 裁剪范围面脚本运行界面
图4 裁剪范围面脚本运行前
图5 裁剪范围面脚本运行后
3.1 基本原理
在地形图编辑工序中,高程点修正是非常重要的一个步骤,高程准确与否,直接影响区域内等高线与地形表达的正确性。 在检查高程数值后,传统方法不仅需要重新加载该地区的DEM 数据,还需要重新判断该点的位置与实际高程值,当出现整体系统性误差时,编辑人员需逐个改正,消耗了大量的人力与时间;在EPS中,通过脚本程序,编辑人员可以按照自定义区域选中需要改正的高程点,并进行统一修正操作,极大提升了编图效率。
3.2 主要源码说明
定义geocount 进行地物选择集的个数判断,即确定所需要进行操作的高程点,保证脚本运行的严谨性。
定义EleChange 获取所输入的高程改正值,参数为自行输入,正数代表高程增加,负数代表高程下降,同时对地物编码为7201001(高程点)进行遍历,对其Z 值进行运算操作,当选择集内所有高程点都进行了改正操作之后,脚本跳出循环结束,具体代码如下。
geocount=SSProcess.GetSelGeoCount
if geocount=0 then
msgbox "请先选择地物"
exit sub
end if
count=0
SSProcess.ClearInputParameter
SSProcess. AddInputParameter "变化高程", "",0, "", "增加填正值,降低填负值"
SSProcess.AddInputParameter "", "",0, "", ""
res=SSProcess. ShowInputParameterDlg ("设置变化高程")
If res=0 Then
msgbox "放弃处理"
Exit Sub
End If
EleChange=SSProcess. GetInputParameter ("变化高程")
for i=0 to geocount-1
code = SSprocess. GetSelGeoValue ( i," SSObj _Code")
if code="7201001" then
ID=SSprocess. GetSelGeoValue(i,"SSObj_ID")Z=SSprocess.GetSelGeoValue(i,"SSObj_Z")
Z=Cdbl(Z)+Cdbl(EleChange)
SSProcess.SetObjectAttr ID, "SSObj_Z", Z
count=count+1
4 程序运行与实例
在该项目内选择一个高程点较为密集的测区,进行实际应用测试。 测区内共有高程点212 个,若采用传统人工编辑的方法,需要结合项目的DEM 情况对测区内的高程点进行逐个操作,效率非常低下;若采用脚本进行操作,只需要几秒即可完成该区域内高程点的修正。 由图6 可以看出,在弹出的对话框内可以输入改正值,并对选择集内的高程点进行改正,点击确定之后,高程值也发生对应的变化,如图7、图8 所示。
图6 高程点改正脚本界面
图7 高程点改正脚本运行前(单位:m)
图8 高程点改正脚本运行后(单位:m)
5 结论
(1)利用VB 脚本对EPS 软件内所绘制的地形图进行批量编辑操作,较传统人工方法效率提升显著,是一种行之有效的方法。
(2)按照各种地物的不同属性与字段进行分类,同时在脚本中进行针对性操作的方法更加合理。
(3)Modular 和Modeless 脚本的结合使用对解决EPS 中地形图编辑问题具有一定的参考价值。