一种基于CASS成图系统的河道纵断面绘制改进方法介绍

时间:2022-10-23 05:51:03

一种基于CASS成图系统的河道纵断面绘制改进方法介绍

摘要:南方CASS成图系统可以方便地绘制河道纵断面图,但存在一定的不足之处。本文通过改进CASS里程文件生成方法,实现了纵断面的准确绘制。

关键字:CASS成图;河道;绘制改进;

中图分类号:U448 文献标识码: A

1、概述

南方CASS地形地籍成图软件是基于AutoCAD平台技术的测绘数据处理系统,该软件广泛应用于地形成图、地籍成图、工程测量应用等领域,具有操作简便、效率高的优点。在河道工程测量中,纵断面测量和纵断面图绘制是一项必不可少的工作。

2、南方CASS9.1纵断面绘制

采用南方CASS9.1绘制纵断面图时,比较常用的方法是按以下步骤完成。首先,在河道地形图上,根据河道中心位置,绘制纵断面线,展绘高程点。然后,选择“工程应用--生成里程文件--由复合线生成--普通断面”,自动弹出“断面线上取值”对话框,生成*.hdm里程文件。最后,选择“工程应用--绘制断面图--根据里程文件”,输入里程文件名称,根据实际需要,设置各种参数,生成纵断面图。

图1 断面线上取值对话框

在采用CASS9.1生成里程文件时,会弹出“断面线上取值”对话框,如图1所示。软件按照采样点间距,考虑相交地物和线上结点,生成里程文件。采样点高程通过内插计算获得。

然而,在采用上述方法生成里程文件时,是采用等间距内插计算里程和高程。受采样间距的限制,在高程变化剧烈的部位,部分关键点位的高程可能缺失,导致生成的纵断面失真,从而需要手工修改断面图。如果加密采样间距,情况会有所改善,但是无法完全解决问题,仍然需要手工修改,而且生成的纵断面图数据密集,较不美观。图2中,断面A是利用CASS9.1生成的里程文件制作的断面线,断面B是实际断面线,两者存在明显的差异。

为避免出现断面失真的问题,一种常用的方法是借助LISP脚本,在CAD中手工点取高程点生成hdm里程文件,然后绘制断面图,但是该方法耗时较长、工作量较大。

图2 CASS生成的断面与实际断面比较

3、里程文件生成方法改进

CASS系统中*.hdm里程文件主要包含了里程和高程两个方面的信息,一般而言,只要能生成正确的里程文件,就能在CASS系统中绘制正确的断面图。本文的基本思路是自主计算并生成里程文件,然后借助CASS生成断面图。

3.1 CASS文件格式

CASS高程点数据文件*.dat格式如下:

点号1,编码,X,Y,Z

点号2,编码,X,Y,Z

……

CASS里程文件*.hdm格式如下:

BEGIN,

第1点里程,第1点高程

第2点里程,第2点高程

……

3.2 断面中心线提取

断面中心线可以拆分成一系列直线和圆弧的组合,此处暂不考虑缓和曲线等更复杂的曲线。对于一条直线和一个圆弧,可以分别采用如下格式加以定义。

直线:序号,line,起点X,起点Y,终点X,终点Y

圆弧:序号,arc,圆心X,圆心Y,半径,起点角度,端点角度,起点X,起点Y,终点X,终点Y

借助AutoCAD的list命令,可以查看河道中心线的详细信息:

于端点 X=133867.0185 Y=43644.6782 Z= 0.0000

于端点 X=133987.2637 Y=43525.4753 Z= 0.0000

凸度 0.0929

圆心 X=134022.4648 Y=43560.9842 Z= 0.0000

半径 50.0000

起点角度 225

端点角度 246

于端点 X=134002.5126 Y=43515.1377 Z= 0.0000

于端点 X=134058.1369 Y=43490.9302 Z= 0.0000

……

将list命令输出的信息保存至txt文档中,通过编程整理,分别提取线段的起点、终点坐标,圆弧的圆心坐标、起点角度、端点角度、半径,可以整理成如下格式的断面中心线文件:

1,line,43644.6782,133867.0185,43525.4753,133987.2637

2,arc,43560.9842,134022.4648,50.0000,225,246,43525.4753,133987.2637,43515.1377,134002.5126

3,line,43515.1377,134002.5126,43490.9302,134058.1369

……

在河道断面中心线中,圆弧一般与直线相连,因此圆弧的起点坐标和终点坐标可以分别从上一段直线和下一段直线获取。本文暂不考虑圆弧与圆弧相连的情况。

3.3 里程计算

里程文件计算步骤如下:

(1)读取断面中心线文件,计算每一段直线或圆弧的长度;

(2)读取*.dat格式的高程点数据文件,逐行读取高程点;

(3)判断高程点位于断面中心线的哪一条直线(或圆弧)上,计算高程点到该直线(或圆弧)起点的直线(或圆弧)长度,并累加该直线(或圆弧)起点之前的所有直线、圆弧的长度,从而得到该高程点的里程;

(4)重复第2、3步直至高程点数据文件读取完毕;

(5)输出里程文件。

4 算法实现

采用C++语言编程,部分算法如下。

4.1 定义数据结构

分别定义直线、圆弧和坐标点数据结构如下。

//直线段

typedef struct

{int SN;double X1; double Y1; double X2;double Y2; double Len;} zdm_Line;

//圆弧

typedef struct

{int SN; double PX; double PY; double X1; double Y1; double X2; double Y2; double r; double Len;} zdm_Arc;

//坐标点

typedef struct

{CString PtName;double X;double Y;double Z;}zdm_Point;

4.2 直线长度计算

定义直线长度计算函数GetLineLength,代码如下。

double GetLineLength(zdm_Line l,zdm_Point P)

{

zdm_Point CZ;

CZ=GetLineCZ(P,l);//获取点到直线的垂足

double len;

if(CZ.PtName=="TRUE")//判断垂足是否在直线上

len=sqrt((CZ.X-l.X1)*(CZ.X-l.X1)+(CZ.Y-l.Y1)*(CZ.Y-l.Y1));

else

len=-1.0;

return len;

}

定义垂足计算函数GetLineCZ,代码如下。

zdm_Point GetLineCZ(zdm_Point P,zdm_Line l)//计算垂足的坐标并返回

{

zdm_Point CZ;

double k;

//考虑斜率为无穷大的情况

if(abs(l.X2-l.X1)>0.0001)

{

k=(l.Y2-l.Y1)/(l.X2-l.X1);

double temp=1.0/(k*k+1);

CZ.X=(k*k*l.X1+k*(P.Y-l.Y1)+P.X)*temp;

CZ.Y=k*(CZ.X-l.X1)+l.Y1;

}

else

{

CZ.X=l.X1;

CZ.Y=P.Y;

}

if((CZ.X-l.X1)*(CZ.X-l.X2)

CZ.PtName="TRUE";

//设置模糊度判断CZ是否在直线上

else if(abs(CZ.X-l.X1)

CZ.PtName="TRUE";

else if(abs(CZ.X-l.X2)

CZ.PtName="TRUE";

else

CZ.PtName="FALSE";

return CZ;

}

4.3 圆弧长度计算

定义圆弧长度计算函数GetArcLength,代码如下。

double GetArcLength(zdm_Arc a,zdm_Point P)

{

//判断点是否在圆弧上

zdm_Line arcLine;

arcLine.X1=a.X1;

arcLine.Y1=a.Y1;

arcLine.X2=a.X2;

arcLine.Y2=a.Y2;

zdm_Point arcLine_CZ;

arcLine_CZ=GetLineCZ(P,arcLine);

if(arcLine_CZ.PtName=="FALSE")

return -1.0;

//计算点到圆心的直线与圆的交点

double k;

double dx,dy;

zdm_Point CZ;

if(abs(P.X-a.PX)>0.0001)

{

k=(P.Y-a.PY)/(P.X-a.PX);

dx=a.r/sqrt(k*k+1);

if(P.X

dx=-dx;

dy=k*dx;

CZ.X=a.PX+dx;

CZ.Y=a.PY+dy;

}

else

{

CZ.X=a.PX;

if(P.Y>a.PY)

CZ.Y=a.PY+a.r;

else

CZ.Y=a.PY-a.r;

}

//计算交点到弧段起点间的弧段长度

double sin_alpha,theta,arclen;

sin_alpha=sqrt(pow(CZ.X-a.X1,2)+pow(CZ.Y-a.Y1,2));

sin_alpha=sin_alpha*0.5/a.r;

theta=2*asin(sin_alpha);

arclen=theta*a.r;

return arclen;

}

5.结论

本文通过改进里程文件生成方法,保证了里程文件的正确性。通过借助VC++编程,实现了里程文件的自动生成,提高了工作效率。开发的程序经实验数据验证,效果良好。

参考文献:

[1] 利用CASS成图系统绘制河道断面图的方法,马春秋,矿山测量,2010年2月第1期;

[2] 关于自动生成CASS断面里程文件的探索,龚善荣,矿山测量,2006年9月第3期;

[3]CASS成图系统绘断面图的2种方法,秦庆红,西北水电,2007年第1期

[4]利用CASS系统绘制河道断面图的两种方法之比较,程媛,科技向导,2010年第7期(下)。

上一篇:针对高校学生管理模式的创新探究 下一篇:园林绿化建设中的施工监理要点分析