吴立军
((湖北国土资源职业学院,湖北 武汉 430090)
基于VBA实现批量提取横断面数据
吴立军
((湖北国土资源职业学院,湖北 武汉 430090)
随着GPS RTK的普及和使用,野外断面数据采集变得简便、灵活,为快速实现由野外三维坐标格式到断面数据格式,提出了实现批量提取断面数据的方法及VBA相关代码,使内业计算变得简单而准确。
断面数据;VBA;批量提取
由于GPS RTK数据采集十分简便、灵活,所以现在无论是道路建设,还是水利工程,这些要求测量纵横断面的地方,在确定精度满足设计要求的情况下,一般都会选用这一方法来采集断面数据。本文提出了批量提取全线路横断面数据生成里程文件的实现方法及VBA相关代码,即在提取数据之前,先绘纵断面线(线型为“LWPolyline”);根据项目要求按一定的间距批量绘制横断面线,图层为“dmx”,线型为“Line”;展绘野外采集的数据,作适当的完善之后,运行程序(图1)。
图1 操作界面图Fig.1 Schematic diagram of section points projection
程序结构见图2所示。
图2 程序结构图Fig.2 Structure diagram of program
ThisDrawing.Utility.GetEntity ent,pnt, ‘选择纵断面线[1]:
Set SSLn=ThisDrawing.SelectionSets.Add("SSLn") ‘创建一个选择集
If err Then Set SSLn=ThisDrawing.SelectionSets.Add("SSLn ")
SSLn.Clear
gpCode(0)=-4
dValue(0)=" gpCode(1)=0 dValue(1)="line" ‘横断面线为line gpCode(2)=8 dValue(2)="dmx" ‘断面线图层为"dmx" gpCode(3)=-4 dValue(3)="AND>" SSLn.Select acSelectionSetAll,,,gpCode,dValue ‘选择了图面上所有的横断面线 For Each objlin In SSLn Set line1=objlin Intpoints=Ent.IntersectWith(line1,acExtendNone) ‘求断面线与纵断面线交点 If UBound(Intpoints)=-1 Then GoTo LinNext ‘判断是否相交 JDist=ObjCurve.GetDistanceAtPoint(Intpoints) ‘求横断面与纵断面线之交点到纵断面起点距离,即每条横断面对应的里程。 由直线起点、终点坐标及直线的角度,并根据野外点的离散程度,选择一个合适的偏移距离OffDist(例如0.5 m)计算出一个矩形选择框的四个坐标。 OffDist=Val(TextBox6.text) ‘选择离散程度 例如0.5 m LAng=line1.Angle + 3.1 415 926 / 2 Coord(0)=SP(0)+OffDist * Cos(LAng) Coord(1)=SP(1)+ OffDist * Sin(LAng) Coord(2)=0 Coord(3)=EP(0)+OffDist*Cos(LAng) Coord(4)=EP(1)+ OffDist * Sin(LAng) Coord(5)=0 Coord(6)=EP(0)-OffDist*Cos(LAng) Coord(7)=EP(1)-OffDist*Sin(LAng) Coord(8)=0 Coord(9)=SP(0)-OffDist*Cos(LAng) Coord(10)=SP(1)-OffDist*Sin(LAng) Coord(11)=0 用上述选择框,结合下面的选择条件,选择每条横断面附近(左右偏移0.5 m)的高程块,形成一个选择集。 Set SSBk=ThisDrawing.SelectionSets.Add("SSBk ") ‘创建一个选择集 If err Then Set SSBk=ThisDrawing.SelectionSets.Add("SSBk ") SSBk.Clear ftype(0)=-4 fdata(0)=" ftype(1)=0 fdata(1)="Insert" ‘选择对象为块 ftype(2)=8 fdata(2)="GCD" ‘选择对象图层为GCD ftype(3)=-4 fdata(3)="AND>" SSBk.SelectByPolygon acSelectionSetCrossingPolygon,Coord,ftype,fdata ‘选择了断面线两侧附近的高程点。 野外采集的数据点不一定都在横断面线上(图3),因此在内业处理过程中,将横断面线两侧一定距离(如0.5 m)范围内的点(P1、P2、P3,……)投影到直线上,用垂足(Q1、Q2、Q3,……)坐标计算平距,保证了断面点平距的准确。 图3 断面点投影示意图Fig.3 Projection schematic diagram of section points 在一定范围内,可假定Q1点的高程近似等于P1点的高程(HQ≈HP),用下面这段代码实现此功能。 For Each Obj In SSBk Set pointXB=Obj Pt(0)=pointXB.insertionPoint(0) ‘高程块的坐标 Pt(1)=pointXB.insertionPoint(1) ‘高程块的坐标 Pt(2)=0 ‘高程块的坐标 Fp(0)=pt(0)+ Cos(LAng+ pi / 2) Fp(1)=pt(1)+ Sin(LAng+ pi / 2) Fp(2)=0 Set Lineobj=ThisDrawing.ModelSpace.AddLine(Pt,Fp) ‘生成一条过高程点且与横断面线垂直的直线。 returnPnt=Lineobj.IntersectWith(objline,acExtendThisEntity) ‘求垂足坐标 Qt(0)=returnPnt(0) Qt(1)=returnPnt(1) Qt(2)=pointXB.insertionPoint(2) …… ‘对各断面点进行排序,生成相应的断面格式文件。 Next ‘高程点处理循环体 LinNext: ‘ Next ‘横断面线处理循环体 BEGIN,0∶1 -29.999,38.610 -10.877,37.560 -3.927,36.480 0.000,35.069 4.364,38.710 30.001,39.430 BEGIN,20∶2 -30.000,35.330 -6.069,36.620 0.000,34.180 3.760,35.780 30.000,37.540 BEGIN,40∶3 -30.000,35.110 -5.139,35.390 0.000,34.530 4.490,34.870 30.000,35.700 BEGIN,60∶4 -30.000,36.190 -5.483,35.050 0.000,34.610 5.060,34.920 30.000,34.970 …… 编程后横断面数据处理变得非常简单,执行程序前用户需在程序设置对话框中输入偏移宽度,然后执行程序并选择纵断面线,等待数秒钟后就可生成断面里程文件,减少了大量手工输入工作量和计算量,确保了成果的正确。 [1] 张帆,郑立楷,王华杰 .AutoCAD VBA开发精彩实例教程[M] .北京:清华大学出版社,2004. (责任编辑:陈文宝) Batch Extraction of Cross-section Data Based on the VBA WU Lijun (HubeiLandResourcesVocationalCollege,Wuhan,Hubei430090) With the popularity and use of total station and GPS RTK,the acquisition of cross-section data has become more simple and flexible. How to simplify the processing of convert the 3D coordinate field data to cross-section data? In this paper,a method and the related VBA scripts has been raised for batch extraction of cross-section data,to do simple and exact computation for the office work. cross-section data; VBA; batch extraction 2016-08-29;改回日期:2016-10-12 吴立军(1964-),男,副教授,测绘工程专业,从事数字化成图的教学和研究。E-mail:394343007@qq.com TB22 B 1671-1211(2016)06-1012-03 10.16536/j.cnki.issn.1671-1211.2016.06.041 数字出版网址:http://www.cnki.net/kcms/detail/42.1736.X.20161109.1112.018.html 数字出版日期:2016-11-09 11:123 断面格式文件为CASS格式
4 结论