摘 要:本文针对不同的软件进行道路断面设计时对测量人员提出的断面格式要求,研究了鸿业、纬地和CASS三种软件断面数据格式,分析了各种断面数据格式的特点以及不同之处,并基于VB设计断面格式相互转换的程序,从而实现了不同软件平台的数据资源共享。
关键词:道路断面;数据格式;转换;程序设计;Visual Basic 6.0
由于不同软件采用了不同的空间数据格式,不同的地物编码系统,使得不同软件之间的数据交换存在困难,给日常的测绘生产带来诸多不便,此外各领域在共同协作中进行信息共享也存在障碍,导致空间数据利用率较低,数据重复采集和不兼容现象时有发生,因此断面数据格式转换程序成为一项迫切的任务,而且由于不同软件在应用时对数据的需求的不同,进行转换可以更好的利用断面数据生成断面图形文件,适用于工程实例中并在各软件中生成断面线图。实现南方CASS横断面数据向纬地、鸿业横断面数据的转换,将使用户可以充分的利用南方CASS的横断面测绘数据,快速有效的为纬地、鸿业道路辅助设计系统提供数据源,极大地提高了工作效率。
1 软件平台和数据格式分析
1.软件简介
南方CASS是基于AutoCAD平台开发的数字地形测图软件,具有完善的地形测图和编辑功能,可以进行多种图形格式的转换和数据交换,适用于各类用户,是我国一款优秀的测图软件。
纬地道路交通辅助设计系统(HintCAD)是基于AutoCAD平臺开发的道路辅助设计系统,具有公路路线设计、互通立交设计、三维数字地面模型应用、公路全三维建模等功能,适用于不同级别公路主线、城市道路等的几何设计。
鸿业市政道路软件是鸿业科技开发的系列CAD软件的产品之一,是一款专业的市政道路设计软件,是国内最早研制并推出的专业市政道路类软件。
2.数据格式分析研究
断面数据文件常用的数据存储格式有南方CASS的*.hdm(或者*.txt)格式、纬地的*.hdm格式和鸿业的*.hdm或bghn格式。
(1)南方CASS断面数据格式
南方CASS横断面数据文件包括桩号、断面顺序号、断面点到中桩的距离和高程等,其数据格式如下:
BEGIN,桩号:断面顺序号
左距离1,高程1
左距离2,高程2
…………
0.0,高程(中桩)
…………
右距离2,高程2
右距离1,高程1
第一行的BEGIN为一个断面的起始标志,桩号指的是该断面的中桩编号,下面每行为断面点到中桩的距离和高程,其中距离为0的点是中桩。[3]
(2)纬地断面数据格式
纬地断面数据中,当高程模式为相对中桩时;平距指的是该点距离中桩的距离;高程为该点相对中桩的高程。当高程模式为相对前点时:平距指的是该点距离前一个高程点的距离;高程为该点相对前一个高程点的相对高程。因此纬地断面数据有相对中桩与相对前点两种格式。本文采用数据格式如下:
桩号
左边断面点数 平距 高差 平距 高差
右边断面点数 平距 高差 平距 高差
纬地断面以相对前点数据文件格式说明为:第一行为桩号;第二行为左边断面,第一个数据为左边断面点数,后面每一对数据为相对前点(或者相对中桩)的距离和高差;第三行为右边断面,后面表示和左边断面一样。[3]
在此程序设计中,为了简单方便起见,选择相对中桩距离和高差数据进行转换。
(3)鸿业断面数据格式
鸿业市政道路设计软件包含很多种文件,比如纵断面自然标高文件(*.bgz)数据格式为:桩号 自然标高;纵断面设计标高文件(*.bgs)去掉括号,其余格式和以前的文本格式相同,数据格式为:桩号 设计标高 竖曲线半径值;横断面自然标高文件(*.bghn)和用横断自然标高输入工具打开后的效果大体相同,只是左侧的距离需要输入负号。文本文件数据格式为:桩号 中桩高程 左侧平距 左侧平距位置的高程 右侧平距 右侧平距位置的高程(每一行为一个桩号的数据,左右侧数据可有多个。)
在本程序中,综合考虑到南方CASS以及纬地道路交通辅助设计系统数据格式,采用的是横断面自然标高文件作为鸿业市政道路设计软件代表格式文件用于进行相互转换。
2 程序算法与思路
1.相互转换程序设计原理
在充分了解CASS交换文件的记录格式和鸿业、纬地、CASS三种不同测图软件断面数据格式后,转换目的就变得非常明确。
三者的主要区别在于数据文件的构成对象以及其构成对象的顺序不同。CASS断面数据由桩号、断面顺序号、断面点到中桩的距离和高程等对象构成。纬地断面数据由桩号、左(右)边断面点数 、断面点到中桩的距离和高程等对象构成。鸿业断面数据由桩号 、中桩高程、左(右)侧平距、左(右)侧平距位置的高程等对象构成。
因此在数据文件的相互转换中主要是注意其相应构成对象的获取及相关顺序。
2.需求分析
本文针对不同软件对于不同数据格式转换的需求,对南方CASS、鸿业市政道路设计系统、纬地三维道路CAD系统三种性能较为优越并且应用较为普遍的数字测图软件,基于Visual Basic 6.0设计编写程序,进行断面数据格式转换,并生成对应的Txt文档文件或者是Hdm断面文件,着力解决当前各种数字测图软件数据不统一的问题,大幅提高测量数据处理的工作效率,实现测量内业的一体化、快速化、规范化。
3 程序设计与实现
基于上述数据转换思路,下面介绍其具体的转换过程和方法,程序的编制,相应文件的读取与生成。
1.功能模块设计
本文基于Visual Basic 6.0环境设计的程序,主要包括三个功能模块。分别为:数据导入与输出模块设计,数据转换模块设计。
(1)数据导入与输出模块设计
数据导入模块,主要是通过设计的程序,点击打开数据文件的命令按钮,选择好并打开待转换的数据文件,通过主界面显示出来的文件内容以及数据文件路径,让程序运行者也能对相应软件的数据文件有一个大致的了解。
数据输出模块,也是通过设計的代码实现,点击保存数据文件的命令按钮,与上文数据导入功能类似,通过显示出来的数据文件,除了可以让程序运行者也能对相应软件的数据文件有一个大致的了解之外,也能对数据进行检查,看转换是否成功。
数据输入输出流程如图1所示。
(2)转换模块设计
数据转换模块的设计在上文相互转换程序设计原理中已说明,,基于三者之间的区别与联系,进行代码设计,并通过主界面上的相关说明使得设计的程序能有方向的选择转换数据格式。数据格式转换如图2。
2.算法分析
本文核心的算法为格式转换,针对CASS标准格式、鸿业横断格式以及纬地横断格式之间的相互转换。格式转换具体步骤如下:
1.读取数据文件,数据分别存储到不同数组。
2.选择数据输入格式、数据输出格式。
3.根据选择的数据转换格式做相应的转换,数据分布存储到不同数组。
4.将转换后的数据写入文件。
5.保存文件。
本文中主要涉及到的函数为格式转换的函数,用CASS数据转换为纬地数据举例说明,其功能函数如下:
'CASS转纬地
Public Function cassTOwd(filename As String) As String
'CASS转纬地每次都要执行这一段代码才能提取中桩的数据,,,,不然就会下标越界
Dim txt As String
Open filename For Binary As #6
'打开二进制文件
txt = Space(LOF(6))
'一次读入内存
Get 6, , txt
'读文件
Close
txt = Replace(txt, “:”, vbCrLf)
'“,“”替换成回车加换行
Dim arr() As String, temparr() As String
Dim begins() As cass
arr = Split(txt, “BEGIN”)
'按BEGIN分割
arr = Filter(arr, “.”)
'筛选桩号以及相应的距离和其高程
ReDim begins(UBound(arr))
'重新定义数组大小,UBound数组维可用的最大下标
ReDim Preserve medie(UBound(arr))
For i = 0 To UBound(arr)
temparr = Split(arr(i), vbCrLf)
'分行存储
temparr = Filter(temparr, “,”)
'筛选距离及桩号
begins(i).heads = Replace(temparr(0), “,”, “”)
'桩号
begins(i).Order = Val(temparr(1))
'断面顺序号
ReDim begins(i).dots(UBound(temparr) - 1)
For j = 1 To UBound(temparr)
xyarr = Split(temparr(j), “,”)
begins(i).dots(j - 1).x = xyarr(0)
'距离
begins(i).dots(j - 1).y = xyarr(1)
'高程
If j = (UBound(temparr) + 1) / 2 Then medie(i) = xyarr(1)
'中桩
Next
Next
tags = “HINTCAD5.83_HDM_SHUJU” & vbCrLf
For i = 0 To UBound(begins)
tags = tags & String(1, vbTab) & begins(i).heads & vbCrLf
n = UBound(begins(i).dots)
tags = tags & vbTab & vbTab & (n) / 2 & String(2, vbTab)
For j = n / 2 - 1 To 0 Step -1
tags = tags & Format(begins(i).dots(n / 2).x - begins(i).dots(j).x, “0.0000”) & String(2, vbTab)
'CASS文件左距离带有负号
'该点距离中桩的距离
'字符串格式化成0.000的格式
tags = tags & Format(begins(i).dots(j).y - begins(i).dots(n / 2).y, “0.0000”) & String(2, vbTab)
'该点相对中桩的高程
3.主要控件
由于本程序主要涉及输入、输出、转换三大功能,因此主要控件的属性下表1所示:
4.程序应用实例
运行程序,点击打开按钮,调入南方CASS横断面文件,然后点击转换按钮,选择保存为纬地/鸿业横断面数据格式,保存数据,最后生成可执行EXE文件。
(1) CASS格式转换
运行“相互转换程序”,打开南方CASS横断面文件,选择转换文件格式保存为纬地或鸿业横断面数据格式,最后生成转换后数据文件。
需注意的是,由于纬地本身数据格式不包含中桩文件,所以转换为其他格式时无法调取中桩数据便实现不了转换。
在CASS转换为纬地数据时将丢失的中桩高程可通过具体函数保存到某一变量中,以便保存到一个临时文件中,等待下次纬地转回到其他带有中桩高程的格式文件时调用。以CASS转换为鸿业格式数据为例,转换结果如下图3所示:
(2)纬地格式转换
当纬地格式数据转换为CASS时需要有中桩文件。转换需将左右断面数和进行计算,源文件内容按行放到一个数组备用,再将中桩文内容按行读取到一个数组备用,然后将BEGIN第一行、源文件内容和中桩文件合并读入,实现字符串截取再组合。以纬地转换为CASS格式数据为例,转换结果如下图4所示:
(3)鸿业格式转换
当最基础的CASS格式断面数据转换成鸿业格式数据和纬地格式数据后,鸿业转换CASS时需将总桩数、文件总行数和断面数定义统计,检查是否正确,同时创建一个辅助数组便于插入0.000中桩高程时使用,按照回车换行来分分隔成数组,读入BEGIN第一行和0.000中樁高程所在行,删除纬地格式数据中单独中桩高程,读入左距离及高程、右距离及高程即可。以鸿业转换为CASS格式数据为例,转换结果如下图5所示:
4 总结
实现三种系统间数据的相互无损转换和共享,可提高测绘生产的效率,避免数据的重复采集,具有很强的实用性,将使用户可以充分的利用南方CASS、鸿业以及纬地的断面测绘数据,快速有效的为道路辅助设计系统提供数据源。
本程序直接对数据文件进行操作,且处理的数据多样性、数据自动提取、处理绘制等功能,能够在实际的测量数据处理过程中,快速高效的处理软件的原始数据文件,提高测量工作的实际效率,节省人力物力,缩短工作时间,从而达到最好的程序设计效果。
参考文献
[1]唐争气,陈正阳. 基于Visual LISP全路线横断面数据自动提取[J]. 湖南城市学院学报(自然科学版),2013,02:28-30.
[2]邓小军,姚永仲,周丽英,常利生. 南方CASS到MAPGIS数据转换的实现及应用[J]. 地矿测绘,2008,01:44-46.
[3]谢爱萍. 南方CASS测量数据向纬地横断面数据转换方法的研究[J]. 矿山测量,2015,03:1-3+6.
[4]李红玥,张献洲,李永树. 常用GIS数据转换方式的比较研究[J]. 铁路航测,2003,01:8-11.
[5]周卫娟,王兰兴. 空间数据转换方法探讨[J]. 江苏测绘,2002,04:35-38.
[6]邵华. 基于宏命令语言的空间数据转换与质量控制研究[D].西南大学,2009.
[7]朱志强. 空间矢量数据格式转换应用研究[D].合肥工业大学,2006.
[8]于雪芹,李建松,钱自红,张涛. 基于GML的空间数据转换方法研究[J]. 地理空间信息,2005,05:23-25.
[9]徐芝英,胡云锋,刘越,艳燕. 空间尺度转换数据精度评价的准则和方法[J]. 地理科学进展,2012,12:1574-1582.
[10]李赢. 空间数据格式转换方法的研究[J].职教研究,2009,03:65-68.
作者简介
陈林(1981-),湖南华容,工程师,注册测绘师,地理信息测绘院副院长,工作年限13年,主要从事工程测量和地理信息数据建库工作生产和管理工作。学历本科,毕业于重庆交通大学,土木工程系。