基于VBA的道路横断面高程点提取方法研究
2018-03-15欧阳平
欧阳平
(漳州市测绘设计研究院,福建 漳州 363000)
1 引 言
现代经济发展迅速,旧有道路标准已经不能适应现代交通、物流的需要,新修道路及旧有道路的更新都需要测绘提供准确的道路纵横断面数据,而不同道路设计软件所要求的纵横断面数据格式不一。南方CASS一类常用测图软件并不能直接生成常用道路设计软件所需格式断面数据。道路横断面高程点很多,纯手工编辑道路设计所需断面数据,工作量大且容易出错。本文以常用的纬地道路辅助设计系统(HintCAD)所要求的横断面数据格式为例(纵断面比较简单,在此不与描述),利用AutoCAD的VBA编程语言进行二次开发来实现半自动提取高程点及平距,使得工作起来事半功倍,准确快捷[1]。
2 编程思路
在实际工作中,我们需要测绘出道路各个横断面上的实际高程,沿道路中心线的里程增加方向,左侧高程点到中桩点的平距(通过两点的坐标反算得到[2])为负,右侧高程点到中桩点的平距为正,并按照从左到右的顺序依次排序,将高程点高程及相应平距输入到表格中,一个横断面为一行,格式如表1横断面高程表(纬地道路辅助设计系统要求格式之一)所示。为了方便阐述程序的编写过程,将分为以下几个步骤分别说明:
(1)读取一个中桩号,并在图上点选中桩位置的高程点;
(2)框选左侧横断面上的高程点,并根据距中桩点的位置远近进行降序,并在距离值前加上负号;
(3)框选右侧横断面上的高程点,并根据距中桩点的位置远近进行升序排列,将成果依次输入Excel表格中,如表1所示。
横断面高程表 表1
3 程序实现
3.1 程序设计流程
首先在启动程序之后自动加载菜单,其界面如图1所示。点选道路横断面高程点提取子菜单后,弹出图2窗口,设置好成果保存路径,即可进行高程点提取工作。
图1 菜单界面
图2 主程序界面
主程序运行流程如图3所示:
图3 主程序运行流程图
3.2 主要步骤及程序源码
AutoCAD二次开发语言有VBA、LISP以及Object-ARX等,VBA及其环境易于学习和使用,它是一个面向对象的编程环境,提供了丰富的开发工程。VBA工程可以是独立的,也可以嵌入到图形中,为开发人员提供了非常灵活的方式来发布程序[3],下面给出本程序的部分VBA源代码。
(1)选择高程点并将结果写入Excel中[4]
Set sSet = ThisDrawing.Application.ActiveDocument.SelectionSets.Add("GCDZDM")
dxf_code(0) = 2: dxf_value(0) = "GC200"
ThisDrawing.Application.ActiveDocument.Utility.Prompt ("请选择左边的高程点:" & vbCr)
sSet.SelectOnScreen dxf_code,dxf_value
If sSet.Count > 0 Then
ReDim DISTANDGCD(sSet.Count - 1,1)
numofssetcount = sSet.Count
End If
i = 0
For Each objEnt In sSet
xyz(0) = objEnt.InsertionPoint(0)
xyz(1) = objEnt.InsertionPoint(1)
xyz(2) = objEnt.InsertionPoint(2)
DISTANDGCD(i,0) = dist(pointMid,xyz)
DISTANDGCD(i,1) = xyz(2)
i = i + 1
Next
'对数组排序
Call QuickSortDecend (DISTANDGCD(),0,sSet.Count - 1)
'将数组写进excel中
xlsheet.Cells(num,1) = strlicheng
xlsheet.Cells(num,2) = pointMid(2)
For i = 0 To sSet.Count - 1
xlsheet.Cells(num,2 * i + 3) = -DISTANDGCD(i,0)
xlsheet.Cells(num,2 * i + 4) = DISTANDGCD(i,1)
Next
sSet.Delete
(2)对平距进行降序排列函数[5]
Sub QuickSortDecend(MyArray() As Variant,L,R)
Dim i As Integer,j As Integer,X As Single,Y As Single,M As Single
i = L
j = R
'找出数组的中点
M = MyArray((L + R) / 2,0)
While (i <= j)
'找出比中点大的数
While (MyArray(i,0) > M And i < R)
i = i + 1
Wend
'找出比中点小的数
While (M > MyArray(j,0) And j > L)
j = j - 1
Wend
'互换这两个数
If (i <= j) Then
X = MyArray(i,0)
Y = MyArray(i,1)
MyArray(i,0) = MyArray(j,0)
MyArray(i,1) = MyArray(j,1)
MyArray(j,0) = X
MyArray(j,1) = Y
i = i + 1
j = j - 1
End If
Wend
'未完成时递归调用
If (L < j) Then Call QuickSortDecend(MyArray(),L,j)
If (i < R) Then Call QuickSortDecend(MyArray(),i,R)
End Sub
3.3 应用实例
图4为某古城内道路改造工程现有道路实测横断面高程图(部分),此图不能被纬地道路辅助设计系统直接读取、使用,需把实测高程点转换为其自定义格式Excel表后读取使用。
图4 横断面高程图
运行本程序后横断面高程点转换为表2。
横断面高程表(成果) 表2
4 结 论
(1)本插件在本院多条道路改造项目的原始横断面数据提取中投入使用,节省了时间及人力,取得了一定的经济效益。
(2)本插件运行仍需手工输入道路设计里程,选取断面高程点,后期优化方向是自动识别里程,读取高程点,判断道路方向及平距的正负。
(3)本插件仅仅针对纬地道路辅助设计系统读取原始地面横断面使用,针对不同软件需进行调整,输出不同格式。
[1] 李文柱. AutoCAD VBA二次开发在道路横断面数据处理中的应用[J]. 城市勘测,2008(3):127~129.
[2] 吴献丰. 道路横断面文件自动生成程序开发与实现[J]. 城市勘测,2013(3):150~151,154.
[3] 刘军,王小维. 基于AutoCAD地形高程基准转化程序设计[J]. 城市勘测,2015(1):116~118.
[4] 潘瑜. Visual Basic程序设计[M]. 北京:科学出版社,2006.
[5] 高春艳,李俊民,刘彬彬. Visual Basic应用开发完全手册[M]. 北京:人民邮电出版社,2006.