浅谈如何将多段线中的弧线段折线化
2015-06-24李建勇
陈 艳,李建勇
(1.中国五冶集团有限公司,四川成都610063; 2.四川省第三测绘工程院,四川成都610500 )
浅谈如何将多段线中的弧线段折线化
陈 艳1,李建勇2
(1.中国五冶集团有限公司,四川成都610063; 2.四川省第三测绘工程院,四川成都610500 )
将CAD数字化图中带弧段的多段线实体,用程序进行折线化,不仅可减少数据入库时人工修改的工作量,提高工作效率,同时还可确保多线段实体的准确度和美观性。
数字化图; 弧段; 折线化
1 问题的提出
当下大数据时代已经来临,用户对各类数据的需求也不尽相同, Arcgis以其庞大的数据管理和分析功能逐渐地得到广大用户的认可。但在实际应用中,很多数据生产单位的作业人员更习惯以AutoCAD为平台编辑数字化图形,然后将编辑好的数字化图形通过处理程序批量转换为满足Arcgis所要求的数据格式进行数据管理。在数据格式转换过程中,不可避免地就会出现一个问题,生产人员为了让一些图形的拐角更圆滑和美观,在使用CAD平台下“PL”命令矢量化多线段实体时,会用弧线法生成弧线段,这些弧段在转换到Arcgis平台下后,线段中的弧段被直接拉直,与CAD数字化图比较,在弧段处将会严重失真,在Arcgis平台下选择该线段与其他地物进行关系拓扑,将会产生许多小面或缝隙。
为了避免这种错误发生,许多生产单位禁止作业人员在CAD数字化图中画弧段,在有拐点的部位,人为加很多折线点。这就带来两个问题:(1)作业人员人为增加折线点,增加很多工作量;(2)作业人员加折线点的方法不当,会使弧段部分产生变形,与实际地形不符,图面也不美观(图1)。
图1 手绘带弧段实体的变形
基于上面的弊端,笔者尝试将CAD数字化图里多段线实体中的弧段用程序进行折线化。
2 对多段线实体中的弧段进行分析
下面对CAD数字化图中带弧段的多段线实体进行系统的分析。
CAD数字化图中,最基本的单元是实体,每个实体,对应一个或多个数据表,实体的每个属性,对应着一个子表,如图1中实体的数据表:((-1 . <图元名: 7ef5df88>) (0 . "LWPOLYLINE") (330 . <图元名: 7ef5dcf8>) (5 . "F1") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPolyline") (90 . 7) (70 . 0) (43 . 0.2) (38 . 0.0) (39 . 0.0) (10 602.101 391.989) (40 . 0.2) (41 . 0.2) (42 . 0.0) (10 1201.05 686.605) (40 . 0.2) (41 . 0.2) (42 . 0.0) (10 1340.5 729.998) (40 . 0.2) (41 . 0.2) (42 . 0.0)(10 1501.17 723.031) (40 . 0.2) (41 . 0.2) (42 . 0.0) (10 1591.22 682.867) (40 . 0.2) (41 . 0.2) (42 . 0.0) (10 1655.54 618.606) (40 . 0.2) (41 . 0.2) (42 . 0.0) (10 1689.31 541.492) (40 . 0.2) (41 . 0.2) (42 . 0.0) (210 0.0 0.0 1.0))。每个子表的第一位叫组码,组码10代表着多段线的折线点坐标。其后的组码42代表着该点的凸度,凸度等于该点弧段四分之一圆心角的正切值。当凸度为0,表示该点是弧段的起点;当凸度为负数,弧段沿顺时针方向弯曲;当凸度为正数,弧段沿逆时针方向弯曲。如图2为弧段的相关参数。
图2 弧段的相关参数
图2中,假设AC为多段线的前进方向。其中a为弧段的圆心角;R为弧段的半径。图二中多段线实体的数据表为:((-1 . <图元名: 7ef639b8>) (0 . "LWPOLYLINE") (330 . <图元名: 7ef5dcc0>) (5 . "FC7") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPolyline") (90 . 3) (70 . 0) (43 . 3.0) (38 . 0.0) (39 . 0.0) (10 3462.5 659.869) (40 . 3.0) (41 . 3.0) (42 . 0.0) (10 4061.45 954.485) (40 . 3.0) (41 . 3.0) (42 . -0.391332) (10 4549.71 809.372) (40 . 3.0) (41 . 3.0) (42 . -3.60688) (210 0.0 0.0 1.0))。上数据表中画线部分为B点的凸度,值为负,弧段顺时针方向弯曲。设B点的凸度为td,b=a/4,BC点的二分之一平距为S,则:
b=atan(td);
a=4*b;
R=s/sin(a/2)
通过B、C点的坐标,可以求出FC的距离和S、F点的坐标;根据td、S,可以求出a、R的值;根据S、F点的坐标,可以求出圆心点D的坐标。进而计算DB的方位角,就可以在BC弧段上计算任意多个折线点。以D为圆心,DB为半径,顺时针向DC方向旋转,当旋转一定角度后,就可以求出一个折线点的坐标,当作业人员给定DB旋转的最小角度,称为步距。设步距为m,增加折线点个数为n,则:n=fix(a/m),n为整数。
3 多段线实体中的弧段折线化的实现
基于AutoCAD的二次开发语言VISP编制的折线化程序流程见图3。
将多段线实体中弧段用程序折线化后,整体效果如图4所示。图中的两个实体均被程序折线化了,上面实体处于未选中状态,直观看和原来带弧段的多段线实体一致,下面实
图3 折线化程序流程
体处于选中状态,则能看到新增了很多折线点。
图4 多段线实体中的弧段用程序折线化前后的对比
4 多段线实体中的弧段折线化后的精度分析
弧段折线化前后面的对比如图5所示。图中弧段未折线化的实体面积为463 470 m2,弧段折线化后的面积为463 449 m2,相对误差为1/12546,完全可以忽略不计。此实体折线化的步距为2°,如果要提高精度,还可将步距设置成小于2°。
5 结束语
虽然多段线实体中的弧段折线化后,增加了很多折线点,给共线拓扑构面带来一些困难,但Arcgis平台下专门有线段追踪的功能,当一个图斑实体折线化后,在构相邻图斑的面时,可直接进行线段追踪,不需要逐点捕捉。多段线实体中的弧段折线化方法,解决了目前熟悉CAD操作的生产人员的习惯画弧线的作业方式,且折线化法可行、可用。但长久之计还是要加大生产人员对Arcgis平台的熟练运用,实现在Arcgis平台下数据编辑、管理和分析统计一体化操作。
图5 弧段折线化前后面的对比
TU198+.5
A
[定稿日期]2015-03-23