济业70 高程点拟合断面及断面转换高程点软件讲解Word格式文档下载.docx
《济业70 高程点拟合断面及断面转换高程点软件讲解Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《济业70 高程点拟合断面及断面转换高程点软件讲解Word格式文档下载.docx(18页珍藏版)》请在冰点文库上搜索。
当地形图上高程点不足时,可以使用本功能一,将断面数据转换成高程点,当地形点较多,采用功能二直接进行断面拟合,尤其在隧道口地形和断面测量过程中,以往需要进行断面(一般要求5m一个断面)和地形测量(1:
500)两项工作,现在采用此软件可以断面点转换成高程点,或者直接利用高程点进行断面拟合,只需进行好一项工作即可。
二、软件特色
1、本软件采用VC6.0语言,采用易于交互操作的对话框模板和MSFlexGrid控件,在MFC开发环境下进行编程,软件的数据导入、计算的结果、均可直接在图表中呈现,做到所见即所得,便于数据的检查和核对,整个软件的界面简洁直观,功能清晰、易学易用。
2、本软件集地形高程点拟合断面和断面数据转换成地形高程点两个功能于一体,在两个功能中,通过算法设计,测量中桩里程、设计中桩里程和既有断面里程相互之间可以自动匹配,不论测量中桩点、设计中桩点的顺序和多少,均能自动寻找和匹配。
并且当设计中桩里程没有断面里程点时,可以根据设计中桩点的里程、坐标,自动计算出断面点的里程和坐标。
3、本软件的难点在于如何使用地形高程点进行断面拟合,采用自定义格网确定每个断面点的拟合区域,然后采用距离定权逐点进行断面点的高程和到中桩点的距离拟合,优点是在拟合范围内不遗漏点,但是算法较复杂,尤其是确定每个格网内有哪些待拟合点,拟合格网示意图如下:
示意图一:
拟合格网
三、软件编程实现
1、利用VisualC++6.0软件中的MFCAppWizard创建MFC应用软件框架,采用对话框的应用程序结构进行可视化编程,将复杂的计算隐藏在文档中,实现文件数据的交换,以达到软件界面简洁直观、友好易用的目的。
软件界面如下图所示:
其中左侧是软件功能实现按钮以及格网数据设置区,右侧是测量数据导入的显示、计算结果的显示,保存的数据格式的显示。
2、算法思想:
2.1首先确定我们需要实现的目标,能够利用高程点拟合出指定里程的断面和将已知断面数据转换成坐标高程点。
为此,采用文件输入输出格式,设置专门的参数设置区域,利用编辑框进行参数设置,根据软件实现的两个功能,和两个功能实现过程中的关联和差异处,分共用功能按钮区和各自的专用功能按钮区三个功能区块,使软件界面能够一目了然。
在文件输入和输出过程中,规定好数据的输入、输出格式。
在ClassView中新增加一个数据读入读出类个类FreadCouSave,它具有导入、显示、修改、保存数据文件的功能,为了在视类展示和编辑数据,采用CEditMSFlexGrid控件,并对其进行二次开发,为按钮增加相关的函数和变量,具体函数示意如下:
2.2,关键算法介绍和程序实现
实现本程序难点主要有两部分,一个是两个功能均需要读入三个数据文件,在不同文件之间如何自动匹配同一个断面里程点,例如,在功能二中,先点击“读入既有横断面数据”后,获得我们想转换的所有断面里程。
然后点击“读入测量中桩高程数据”和“读入设计中桩坐标数据”后,采用for循环和if-else选择结构,采用全局搜索,根据第一个文件的断面里程,逐个搜索后两个文件的相关里程,并且同时进行坐标和高程匹配。
如果既有横断面的里程再设计中桩坐标中没有的话,在在坐标匹配的过程中,还需要计算既有横断面的中桩点的坐标以及在区域线位的方位角,以便下一步计算。
这些实现的部分具体代码如下:
if(m_Pand1!
=5||m_Pand2!
=6||m_Pand3!
=7)
AfxMessageBox("
请先读入断面数据、测量中桩、设计中桩三个数据文件!
"
);
else
{
inti=0,j=0,j2=0,k=0,k2=10000,k3=10000;
//i是断面数
doublexx=0.0,yy=0.0,aa=0.0,az=0.0,ay=0.0,XP2=0.0,YP2=0.0;
m_gn=0;
for(i=0;
i<
m_DuanCount;
i++)
{
for(j=0;
j<
m_nn2/4-1;
j++)
{
if(m_LCdm[i*3][0]>
=atof(Res.GetAt(j*4+0))&
&
m_LCdm[i*3][0]<
atof(Res.GetAt(j*4+4)))
//找出中桩在设计中桩的位置
{
k2=j;
}//找到断面中桩在设计中桩的位置k2
for(j2=0;
j2<
m_nn4/2-1;
j2++)//测量中桩数据
{
if(m_LCdm[i*3][0]==atof(Res3.GetAt(j2*2+0))){
k3=j2;
}
}//找到断面中桩在测量中桩的位置k3
if(k2!
=10000&
k3!
=10000)
xx=atof(Res.GetAt(k2*4+5))-atof(Res.GetAt(k2*4+1));
yy=atof(Res.GetAt(k2*4+6))-atof(Res.GetAt(k2*4+2));
aa=QJD(yy,xx);
//断面中桩点的方位角
az=aa-3.141592654/2;
//左侧断面方位角
ay=aa+3.141592654/2;
//右侧断面方位角
XP2=atof(Res.GetAt(k2*4+1))+fabs(m_LCdm[i*3][0]-atof(Res.GetAt(k2*4+0)))*cos(aa);
YP2=atof(Res.GetAt(k2*4+2))+fabs(m_LCdm[i*3][0]-atof(Res.GetAt(k2*4+0)))*sin(aa);
//断面中桩点的坐标
k=0;
while(k<
120)//将左侧的数据转换坐标,同时加高程,并把转换后的数据赋给数组
if(m_LCdm[i*3+1][k]!
=-500)
{
Agaocd[m_gn][0]=m_gn;
Agaocd[m_gn][1]=XP2+m_LCdm[i*3+1][k]*cos(az);
//变换坐标
Agaocd[m_gn][2]=YP2+m_LCdm[i*3+1][k]*sin(az);
Agaocd[m_gn][3]=m_LCdm[i*3+1][k+1]+atof(Res3.GetAt(k3*2+1));
}
另一个关键算法是如何确定每个断面点的拟合区域和如何进行断面点的拟合,其实是一个高程内插的过程,这本身就是DEM研究的核心问题,有不少算法,由于我们的拟合点已经被限制在了每一个断面线上,就使得我们必须采取一种以距离定权的分块内插的拟合方法。
然后逐点进行断面点的高程拟合和到中桩点的距离拟合,优点是在拟合范围内不遗漏点,但是算法较复杂,尤其是确定每个格网内有哪些待拟合点,以及格网内没有符合条件的拟合点、或者左右侧,有一侧不需要拟合的情况。
编制的部分代码如下所示:
for(j=0;
j++)//
{//找出中桩在设计中桩的位置
if(atof(Res3.GetAt(m*2+0))>
atof(Res3.GetAt(m*2+0))<
k2=j;
//k2用来标记测量中桩高程的里程所在的设计里程的行数,从0开始算,用来计算方位角的}
}//找到测量的高程中桩在设计中桩的位置k2
if(k2!
{xx=atof(Res.GetAt(k2*4+5))-atof(Res.GetAt(k2*4+1));
yy=atof(Res.GetAt(k2*4+6))-atof(Res.GetAt(k2*4+2));
aa=QJD(yy,xx);
az=aa-3.141592654/2;
ay=aa+3.141592654/2;
XP2=atof(Res.GetAt(k2*4+1))+fabs(atof(Res3.GetAt(m*2+
0))-atof(Res.GetAt(k2*4+0)))*cos(aa);
YP2=atof(Res.GetAt(k2*4+2))+fabs(atof(Res3.GetAt(m*2+
0))-atof(Res.GetAt(k2*4+0)))*sin(aa);
if(m_fanw!
=0)
m_DianGeS=ceil(m_fanw/m_djianju);
//左侧需要拟合的断面点的个数,向上取整
else
m_DianGeS=0;
if(m_fanwy!
m_DianGeSy=ceil(m_fanwy/m_djianju);
m_DianGeSy=0;
//右侧需要拟合的断面点的个数if(m_DianGeS==0)//如果左侧不需要拟合点
m_LCdm2[m2+1][0]=0;
m_LCdm2[m2+1][1]=0;
k=0;
j3=0;
//k表示左侧待拟合的高程点的个数
while(k<
m_DianGeS)//进行左侧断面数据的拟合
XP3=XP2+(m_djianju/2+m_djianju*k)*cos(az);
//左侧拟合点的X坐标XP3
YP3=YP2+(m_djianju/2+m_djianju*k)*sin(az);
//左侧拟合点的Y坐标YP3
qzz=0.0;
//拟合每一个点之前都需要置0
juliz=0.0;
//拟合每一个点之前都需要置0
m_ng=0.0;
m_nl=0.0;
k3=0;
//每个拟合点的k3重新置0,k3表示每个拟合方框内符合条件点的个数
for(i2=0;
i2<
m_nn3/4;
i2++)//i2代表行数,m_nn3表示已知高程点的数据总数
njuli1[i2]=sqrt((atof(Res2.GetAt(i2*4+2))-XP3)*(atof(Res2.GetAt(i2*4+2))-XP3)+
(atof(Res2.GetAt(i2*4+1))-YP3)*(atof(Res2.GetAt(i2*4+1))-YP3))+0.00000000001;
xx2=atof(Res2.GetAt(i2*4+2))-XP3;
yy2=atof(Res2.GetAt(i2*4+1))-YP3;
aa2=QJD(yy2,xx2);
//拟合断面点到已知高程点的方位角
dk1=m_djianju/2-fabs(njuli1[i2]*sin(aa2-aa));
dk2=m_qhjuli-fabs(njuli1[i2]*cos(aa2-aa));
if(dk1>
=0&
dk2>
//njuli2[k3][0]=njuli1[i2];
//将合格点的距离存入新数组中njuli2
//njuli2[k3][1]=atof(Res2.GetAt(i2*4+3));
//将合格点的高程存入新数组中njuli2
njuli2[k3][0]=atof(Res2.GetAt(i2*4+0));
//点名
njuli2[k3][1]=atof(Res2.GetAt(i2*4+2));
//北坐标X
njuli2[k3][2]=atof(Res2.GetAt(i2*4+1));
//东坐标Y
njuli2[k3][3]=atof(Res2.GetAt(i2*4+3));
//高程
k3=k3+1;
}//将距离合格的点的挑选出来放入njuli2[k3][4]数组中,总计k3个
}//处理完每一点的距离,并挑选出距离合格的点
jsq1[k]=k3;
//将k3的值存入数组中,用于特殊情况处理
if(k3!
for(k5=0;
k5<
k3;
k5++)
xx3=njuli2[k5][1]-XP2;
yy3=njuli2[k5][2]-YP2;
//拟合断面点到中桩点的坐标差
aa3=QJD(yy3,xx3);
//拟合断面点到中桩点的方位角
dk3=sqrt((njuli2[k5][1]-XP2)*(njuli2[k5][1]-XP2)
+(njuli2[k5][2]-YP2)*(njuli2[k5][2]-YP2))+0.00000000001;
//符合条件的点到中桩点的距离
njuli4[k5][0]=njuli2[k5][0];
njuli4[k5][1]=fabs(dk3*sin(aa3-az));
//点到断面线的垂直距离
njuli4[k5][2]=fabs(dk3*cos(aa3-az));
//投影点到中桩点的距离,用于断面距离计算
}
3、程序设计时的细节问题
如果某一个断面左侧的拟合距离是0,或者没有一个符合要求的拟合点,那么载拟合过程中,左侧拟合的断面的数据将会用(00)提示。
当导入的断面个数超过80个,或者导入的中桩高程点或者设计中桩点超过9600个时,会给出友好提示。
每个断面每侧的数据不会超过60个点。
五、使用流程
1、如果需要从已知高程点里面拟合出断面,需要首先对拟合的格网参数进行设置,下图是默认的参数设置
其中:
(1.1)“左侧拟合宽度”和“右侧拟合宽度”是每一个断面拟合格网范围内参与拟合点的分布宽度,不足100m的,程序自动补足100m,高程以前一点为准。
左右两侧可分别设置拟合宽度。
(1.2)“前后拟合范围各”这个参数意思是沿线路前进方向断面两侧的拟合宽度,比如2800这个断面和2850断面之间的距离是50m,可以设置“前后拟合范围各”的参数值是25,这样两个断面之间拟合范围在沿里程方向可以无缝衔接,当然,前后拟合范围也可以重合。
(1.3)“断面点拟合间距”,是指断面左右两侧每隔多长距离,就需要拟合一个高程点,它和“前后拟合范围”这个参数一起构成一个拟合格网,具体含义还可参考前面的示意图一
2、根据实际工作需要完成参数设置后,先点击
这两个按钮,完成线路数据的输入。
其中:
“读入测量中桩高程数据”的数据格式如下所示:
其中第一列是点名,必须是数字,第二列是测量的中桩高程,
可以使新线的打线资料或者既有线的抄中平资料。
如果不知道中桩高程,只有需要拟合断面的中桩里程,那么只需将第二列的中桩高程全部改为0,最后保存的横断面数据将是(距离、高程)的数据格式。
点名必须是数字。
读入“设计中桩坐标数据”的数据格式如下图所示
第一列为点名,第二列是北坐标,第三列是东坐标,第四列备注,是线路设计部门提供的中桩坐标通用格式。
然后依次点击下图中的三个按钮,得到拟合出的横断面数据。
其中“读入已知高程点数据”的数据格式如下图所示:
第一列为点名,第二列是东坐标,第三列是北坐标,第四列高程,
是CASS软件导入导出的高程点数据格式,在本软件数据导入中,数据之间的逗号,可用空格代替。
点击“断面点拟合并显示”按钮后,结果在右边的表格中显示,最后点击“保存断面点数据”按钮,得到我们想要的拟合断面,和上一步表格显示的数据完全一致的。
最后得到的数据格式如下图所示:
1、如果需要将既有横断面数据转换成高程点数据,那么首先
点击
上面的步骤和进行断面拟合的步骤二是一致的,必须先读入设计中桩坐标和需要处理的断面的里程、高程。
2、然后依次点击下图中三个按钮,得到转换后的高程点数据。
其中“读入既有横断面数据”的数据格式如下
数据每三行的含义是:
点名
左侧距离高差左侧距离高差左侧距离高差…
右侧距离高差右侧距离高差右侧距离高差…
………………………………………………………..
每一行的数据可以以逗号或者空格隔开,行和行之间允许空行存在。
点击“高程点计算并显示“,结果在右边的表格中显示,最后点击“保存高程点数据”按钮,得到我们转换后的带坐标的高程点,和上一步表格显示的数据完全一致的。
六:
软件测试
以平原物流二期定测的DK2+800至DK3+480数据为例,下面是功能一的具体实现:
分别点击下图的三个按钮,完成数据的导入。
然后点击“断面点拟合并显示”按钮得到的结果如下所示:
在右侧的表格中检查拟合的断面没什么明显问题后,点击“保存横断面数据”后,就可以将数据保存为txt格式的数据
七:
总结
在软件开发过程中,结合了我们工作性质和特点(铁路行业),在尊重平时的作业习惯基础上,同时满足规范要求,来设计软件的操作流程、文件的输入、输出格式,使软件功能可靠而且便于使用。
本软件实现了利用高程点拟合出指定里程的断面和将已知断面数据转换成坐标高程点这两个功能,其中第一个功能,有部分同类软件(如CASS7.1)有类似功能,和它们相比,具有操作简便,自动化程度高,有文件读入、读出的优势。
并且提供的数据文件格式,适合于下一步其他专业绘制满足相关专业要求的断面线。
最后要感谢院领导对本项目的高度重视,同时也感谢贾克勇、张玉生、李德奖在软件编制过程中的测试和帮助。