测绘程序实验报告

测绘程序实验报告
测绘程序实验报告

实验1 Visual C++.Net环境和程序设计初步

1.掌握VC++ 语言的基本语法;

2.理解顺序结构、选择结构和循环结构程序设计的特点及应用;

3.掌握对基于对话框的MFC 应用程序设计方法;

4.掌握一些简单算法。

5.编写一个方位角计算程序。提示:先使用反正切函数计算,然后利用坐标增量

的符号来判断所在的象限。

设计思路:在按钮下面添加程序。X Y同时大于0在第一象限,方位角等于arctan(y/x);X>0,Y<0在第二象限,方位角等于arctan(y/x)+90;X<0,Y<0在第三象限,方位角等于arctan(y/x)+180;X<0,Y>0在第四象限,方位角等于arctan(y/x)+270;

界面设

计:

主要代

码:计同

一参考椭

球下的三

维地心坐

标(笛卡

儿坐标

系)与大

地坐标系

转换的程

序。

(提示:用do…while 迭代,B、H 初始为0 进行迭代,直到H 的精度达到米)

注意:东经0~180(Y>0),西经:0~-180(Y<0)

式中,B、L、H 为椭球面上的大地纬度、大地经度、大地高;X、Y、Z 为空间直

角坐标;N 为卯酉圈曲率半径,e 为椭球的偏心率,a 为椭球的长半径,b 为椭球的短半径。(WGS84 椭球参数:长半径a=6378137m,扁率α=1/)

设计思路:在按钮下面设置主程序,按照指导书给的思路编辑公式

界面设

计:

主要代

码:

写一个后方交会计算程序。

基本原理及计算公式

若将Pa、Pb、Pc 看成权,则P 点的坐标即为三个已知点的加权平均值

计算程序设计步骤

(1)设计界面,用于输入 3 个已知点的坐标和三个观测角、和,以及用

于输出待定点坐标的文本框(12 个)、静态标签框和Button 按钮;

(2)定义文本框控件变量(Value);

(3)根据已知点计算三个内角A、B、C;

(4)计算Tan(α)、Tan(β)、Tan(γ)、Tan(A)、Tan(B)、Tan(C);

(5)计算Pa、Pb、Pc;

(6)计算待定点坐标Xp、Yp。

界面要求:

三个坐标输入框,两个角度输入框

一个坐标结果输出框

一个计算按钮,一个清除按钮,一个退出按钮。

2.由三角形三个边长求内角函数

计算公式:

设计思路:通过示例编辑框添加变量,在按钮下面添加程序。先将α、β、的度分秒之转换成度利用三角形内角和等于180算出γ并将γ转换成弧度。接着计算三角形的内角,判断P点是否在危险圆上若不在则计算P点坐标若在则弹出“该点在危险圆上”。界面设计:

主要代码:protected: HICON m_hIcon;

写一个求任意多边形面积的程序。提示:通过界面输入数据,并把数据保存

在一个二维数组或一个一维的自定义结构体类型的数组中,然后再进行计算。要

求计算部分写成函数的形式,使计算程序与界面无关。

动态数组

创建动态数组

结构体的定义

多边形面积计算原理及算法

计算原理:

面积计算的算法:

提示:显示框用Cedit 控件变量

对每个输入的坐标用CString str 临时变量格式化,然后用CEdit 的控件变量插入

设计思路:将实现写在按钮在下面。添加顶点下面实现创建动态数组,确认按钮实现返回数组大小值并将添加的数据显示到显示框中去,通过计算按钮实现多边形面积的计算,清除按钮实现清除输入的数据,退出按钮退出程序。

界面设

计:

主要代

码:"

#include

"05(3)"

#ifdef

_DEBUG

#define

new

DEBUG_NEW

#endif

d % lf %lf \r\n"),t,x,y);

(str);

px[t-1]=x;

py[t-1]=y;

UpdateData(FALSE);

}

void CMy073Dlg::OnBnClickedButton5() {

掌握面向对象编程基本思想

2. 掌握VC++ 中创建类

3. 掌握建立和使用对象

4. 掌握运算符号重载

5. 理解类的继承和多态性

二、实验内容

1.设计一个角度类。要求该类具有度分秒至度的换算、度至度分秒的换算、度与

弧度的换算等功能。提示:设置一个角度大小属性,并设定该属性为缺省属性;

另设一个状态属性,表示当前设置的角度大小的形式;度分秒、度、弧度间的相

互转换的方法;定义运算符号(加、减)方法,使得角度类能够像一种普通的数

据类型样的方便使用。

设计思路:设计一个角度类在类的头文件里申明度到度分秒的转换、度分秒到度的转换、度到弧度的转换、运算符的重载,在类的.cpp文件中写出具体的函数实现,在按钮下面调用类的各个函数来实现角度的转换。

界面设

计:

主要代

码:

DECLARE_MESSAGE_MAP()

public:

double dmstodgree(double dmg);编制简单的Cass 数据文件进行数据整理的程序。整理后的数据文件中要求无

重复点数据,且数据按点号大小的升序进行排序。要求整理后的数据按与原始数

据文件同样的格式保存为另外一个文件

示例数据“民用园燃气.dat”文件数据格式:

总点数

点号,编码,X,Y,H

例如:

要求:

a.用SaveFileDialog和OpenFileDialog控件获取文件打开或保存的文件

名。

b.自定义一个测量点数据结构体,其元素包括:点号,编码,X,Y,H

c.用文本框显示原始数据和整理后的数据

d..按编程规范进行编码

a. 读数据、保存数据、判断一个点数据是否已经存在、排序、在文本框中

显示文件内容等可以分别定义成一个子过程或函数。

c.编程技巧

打开文件

获得总点数根据点数调整数组的大

逐行读取数据,判断该点是否已经存在数组

中,若不存在,则把该数据存放在数组中

根据删除重复点后的总点

数,重新调整数组大小

按点号大小的升序排序

按原数据格式输出到另外一个文件

设计思路:在按钮下面设置主程序。通过打开文件按钮将原文件打开并显示到示例编辑框内,通过保存文件按钮实现对文件分行、删除重复点、排序、保存更改后的文件并把它显示到示例编辑框中等操作。

界面设

计:

主要代

码:

xt"));at"));umber=_ttoi(strTmp[0]);oder=strTmp[1];

pPoint[i].X=_tstof(strTmp[2]);

pPoint[i].Y=_tstof(strTmp[3]);

pPoint[i].H=_tstof(strTmp[4]);

}

if(strTmp!=NULL)umber=pPoint[j].number)

delete [] pPoint;

umber>pPoint[j].number)

{

t=pPoint[i].number;pPoint[j].number=t;pPoint[i].number=pPoint[j].number;

}

}

}

umber,pPoint[i].coder,pPoint[i].X,pPoint[i].Y,pPoint[i].H);

}

xiugai=xiugai+strOutPut;列数据为一变形监测点的24 期位移监测结果(分别为X,Y,H),编制程序绘

制出该点的变形曲线图,每个方向一个位移序列图。

设计思路:用类DeformationCurve实现原始文件的读入、文件的拆分、画图等功能,调用类的相关函数来实现相应的功能。

界面设计:因为是基于当文本的所以没有界面

主要代码:class DeformationCurve : public CWnd

{

DECLARE_DYNAMIC(DeformationCurve)

public:

DeformationCurve();

virtual ~DeformationCurve();

protected:

DECLARE_MESSAGE_MAP()

public:

CString *DeformationCurve::Splitstring(CString str,char split,int &isubstr);

void DeformationCurve::ReadData(double *&X,double *&Y,double *&H);

void DeformationCurve::Draw(CDC* pDC,CRect& rect);

};

xt"));f"), pDC->TextOutW(dOrgX-60,dEndY+i*dy,str);

}

for(int i=0;i<=3;i++)

{

(_T("%.3f"), pDC->TextOutW(dOrgX-120,dEndY+i*dy,str);

}

for(int i=0;i<=3;i++)

{

(_T("%.3f"), pDC->TextOutW(dOrgX=180,dEndY+i*dy,str); }

();

=dOrgX+i*dx;

ptX[i].y=dOrgY-int((X[i]/*3*dy);

}

pDC->Polyline(ptX,24);=dOrgX+i*dx;

ptY[i].y=dOrgY-int((Y[i]+/*3*dy);

}

pDC->Polyline(ptY,24);

=dOrgX+i*dx;

ptH[i].y=dOrgY-int((H[i]*3*dy));

}

pDC->Polyline(ptH,24);

trN ame=pstrData[0];

m_pKnownPoint[i].strID=pstrData[0];

m_pKnownPoint[i].H=_tstof(pstrData[1]);

m_pKnownPoint[i].flag=1;trName=pstrData[i];

m_pUnknownPoint[i].strID=pstrData[i];

m_pUnknownPoint[i].H=0;lag=0;pBackObj=SearchPointUsingID(pstrData[0]);pFrontObj= SearchPointUsingID(pstrData[1]);ObsValue=_tstof(pstrData[2]);ist=_tstof(pstrData[3]);trID== ID)

{return &m_pKnownPoint[i];}

}

return NULL;

}

trID==ID)

{return &m_pUnknownPoint[i];}

}

return NULL;

}

LevelControlPoint* AdjustLevel::SearchPointUsingID(CString ID)

{

LevelControlPoint* cp;

cp=SearchKnownPointUsingID(ID);

if(cp==NULL)

cp=SearchUnknownPointUsingID(ID);

return cp;

}

void AdjustLevel::ApproHeignt(void)lag!=1)

{

pFrontObj->strID==m_pUnknownPoint[i].strID)

&& m_pDhObs[j].cpBackObj->flag==1 )

{ =m_pDhObs[i].cpBackObj->H - m_pDhObs[i].ObsValue;*/

m_pUnknownPoint[i].H=m_pDhObs[j].cpBackObj->H + m_pDhObs[j].HObsValue;

m_pUnknownPoint[i].flag=1;

break;

}

}

if(m_pUnknownPoint[i].flag!=1)pBackObj->strID==m_pUnknownPoint[i].strID)

&& m_pDhObs[j].cpFrontObj->flag==1 )

{ =m_pDhObs[j].cpFrontObj->H-m_pDhObs[j].HObsValue;

/*

m_pUnknownPoint[i].H=m_pDhObs[i].cpFrontObj->H+m_pDhObs[i].ObsValue;*/

m_pUnknownPoint[i].flag=1;

break;

}

}

}

}

if(i==m_iUnknownPointCount-1)lag!=1)ist);

p(i,i)=value;

}

return p;

}

void AdjustLevel::FormErrorEquation(CMatrix &B, CMatrix &L)

{

(m_iDhObsCount,m_iUnknownPointCount);

(m_iDhObsCount,1);

for(int i=0;istrID);

tmpFront=SearchPointUsingID(m_pDhObs[i].cpFrontObj->strID);

trID==tmpBack->strID)trID==tmpFront->strID)bsValue-(m_pDhObs[i].cpBackObj->H-m_p DhObs[i].cpFrontObj->H);*/

L(i,0)=m_pDhObs[i].HObsValue-(m_pDhObs[i].cpFrontObj->H - m_pDhObs[i].cpBackObj->H);

(_T("%.3f"),L(i,0));

L(i,0)=_tstof(tmp);

L(i,0)=L(i,0)*1000;+=x(i,0);xt"));xt"));

if()==IDCANCEL) return;

CString strFileName=();

setlocale(LC_ALL,"");

CStdioFile sf;

if(!(strFileName, CFile::modeCreate|CFile::modeWrite)) return;

(LevleContent);

();

UpdateData(FALSE);

}

void CIndircLelveDlg::OnBnClickedComputelevel()

{

f\r\n"), [i].strID,[i].H);

LevleContent+=Temp;

}

(_T("单位权中误差:%.1f mm\r\n"),r0*1000);

LevleContent+=Temp;

LevleContent+=_T("未知点高程中误差(mm):\r\n");

for(int i=0;i< ;i++)

{

();

(_T("%s,%.1f\r\n"),[i].strName,Qx[i]*1000);

LevleContent+=Temp;

}

UpdateData(false);

}

void CIndircLelveDlg::OnBnClickedSavelevleresult()

{

xt"));

if()==IDCANCEL) return;

CString strFileName=();

setlocale(LC_ALL,"");

CStdioFile sf;

if(!(strFileName, CFile::modeCreate|CFile::modeWrite)) return;

(LevleContent);

();

UpdateData(FALSE); }

实验结果

打开文件数据:

平差结果:

四、实验心得

这从实验是我们测绘程序设计的最后一次实验,虽然这个学期我们做了好几次相关的实验,但是我却发现自己学的东西也越来越模糊,感觉很多内容都不理解。这次的实验很大程度上我都是按照《测绘程序设计》上面单导线简易计算来编的,在加上后面的关于水准网间接平差的误差方程和法方程,以及精度评定的相关函数,来完成的。而自己主要完成的就是水准网的数据读取,保存的操作,由于这部分主要用的知识是文件的读取的,因为前面做过,所以不是太难。但是这并不意味着这次实验很简单,至少在我心中这的确比较难,因为里面很多东西不是纯粹的把代码写上去就可以完成,还要靠自己做相应的代码对应,才能够真正的得到想要的结果。但学好编程并扎实的为自己所用是需要更多的学习和练习的,我知道在掌握课堂知识的同时,主动的去寻找吸收相关的知识,希望通过本门课程的学习,掌握学习编程的方法,使自己的水平能够更进一步,循序渐进的掌握更多。虽然这门课的实验已经结束,但是我却深深地知道,我们专业对编程的要求很高,而且必须具备较好的编程能力,或许这些日子下来,我学到的不是很多,但是我或多或少明白,编程是一个循序渐进的过程,我想真的能够在这方面有所突破,就更要花时间多花工夫。

相关主题
相关文档
最新文档