1一、需求分析:总体描述:控制网平差程序对野外控制网观测数据进行平差数据处理,其目的就是根据最小二乘原理,消除网中的各种几何矛盾,求出全网各待定元素(未知点的平面坐标或三维坐标)功能需求:1.优化设计:根据控制网的观测精度与网形,全面评定网的精度2.数据输入:外部数据倒入3.概算:自动完成近似坐标的推算。4.平差计算:对观测数据进行精密平差计算,得到平差后的点位坐标,方向观测值,边长观测值等,精度评定。5.成果输出:控制网图形输出,平差结果报表及其输出,绘制误差椭圆。二、系统设计系统设计是课程设计的提纲与指导,它主要分为四大模块:1.数据输入模块;2.数据预处理模块;3.平差计算模块;4.成果输出模块。后面两个星期的实习基本上按照系统设计执行模块一:数据输入模块数据文件设计:ControlNetName,name1Surveyor,Name2Recorder,Name3Date,##-##-##FixPointNum,Number1UnknownPointNum,Number2AngleObsNum,Number3DistanceObsNum,Number4AllObsNum,Number5AngleRmsError,m1DistRmsError,m2WeightedError,mENDHeader2主体数据观测数据:测站点号,照准点号,方向观测值测站点号,照准点号,距离观测值模块二:数据预处理模块坐标概算:j为测站,i为照准点,k为与测站j相邻的已知点则有:Tji=Tij+AXi=Xj+Sji*cos(Tji)Yi=Yi+Sji*sin(Tji)Tij=arctan((Yj-Yi)/(Xj-Xi))每遇到未知的照准点皆重复以上四部。3模块三:平差计算模块1.列出误差方程及条件式间接平差模型:误差方程:角度观测值的误差方程:其中:边长观测值的误差方程:由近似坐标计算而得为实测边长2.定权已知测角精度为δ1,边长的观测精度为δ2,令方向观测值的权P=1,则边长观测值的权P=δ*δ/S(计算权阵时要注意与B及L系数阵的单位要统一)3.组成法方程4.解算法方程,求得dX=[dx1dy1dx2dy2…]5.平差后的坐标值计算X=X+dX。6.精度评定,计算误差椭圆参数等0ijSijSLBXVijjijjijiijiijijlYTXTYTXTV0000sincossincosijijijSSl000''00''cos,sinijijijijijijDTbDTaijijiijLTZl00)(00000ijijijXXYYarctgTijjijjijiijiijiijlYbXaYbXaZV0PLBPBXBTTPLBPBBXTT1)(4中误差:未知数的协因数阵待定点点位误差误差椭圆元素计算:长半径方位角:长半径:短半径:平差程序编写时的关键是系数阵B,L及权阵P的编写B及L的设计流程:B是26行11列(18行方向观测人+8行距离观测)11列的未知数为:X3,Y3,X4,Y4,X5,Y5,Z1,Z2,Z3,Z4,Z5(Zi为定向角误差)L为26行1列P为26行26列模块四:成果输出模块控制网图形,误差椭圆,概算结果,评查报告(包括精度统计(平面点位误差表),方向观测及距离观测成果表,控制点成果表等。)三、进度安排及实施:7月18日—7月19日:理清程序设计大概思路,完成系统设计及进度安排7月20日:复习原来的程序代码(文件的读写,角度类,矩阵类等)XPLBPLLPVVTTTT)(tnPVVmT01)(PBBQTxyyyxxxQmmQmm00,220yxkmmmmyyxxxyQQQarctgQ221)90(,000QtgQQmEtgQQQmExyxxxyxx57月21日:完成模块一7月22日:完成模块二7月23日—7月24日:完成模块三7月25日:完成模块四7月26日—7月27日:程序调试及完善7月28日:课程设计报告的编写实习过程中基本按照进度安排来完成,其中程序调试及完善花费的时间比较长,差不多用了三天时间,知道7月28日上午才完成四、程序代码文件一:平差的主程序:TraverseNet.cpp#includeStdAfx.h#includeTraverseNet.h#includemath.h#includelocale.hTraverseNet::TraverseNet(void){m_FixPoint=NULL;m_FixpNum=0;m_UnknownPoint=NULL;m_UnknownpNum=0;m_AObsData=NULL;m_AObsDataNum=0;m_DObsData=NULL;m_DObsDataNum=0;m_AllpNum=0;}TraverseNet::~TraverseNet(void){//释放动态数组内存if(m_FixPoint!=NULL){delete[]m_FixPoint;m_FixPoint=NULL;}6if(m_UnknownPoint!=NULL){delete[]m_UnknownPoint;m_UnknownPoint=NULL;}if(m_AObsData!=NULL){delete[]m_AObsData;m_AObsData=NULL;}if(m_DObsData!=NULL){delete[]m_DObsData;m_DObsData=NULL;}}boolTraverseNet::LoadData(constCString&FileName){CStdioFilesf;//创建文件对象//以读的形式打开文件,如果打开失败则返回if(!sf.Open(FileName,CFile::modeRead))returnfalse;CStringstrLine;//BOOLbEOF=sf.ReadString(strLine);//读取第一行,已知点数intn=0;//读取第一行,观测者sf.ReadString(strLine);NetData.Sur=strLine;//读取第二行,记录者sf.ReadString(strLine);NetData.Rec=strLine;//读取第三行,观测日期sf.ReadString(strLine);NetData.Date=strLine;7//读取控制点数sf.ReadString(strLine);m_FixpNum=_ttoi(strLine);SetFixpNumSize(m_FixpNum);//设置控制点数组大小//读取并保存控制点数据for(inti=0;im_FixpNum;i++){sf.ReadString(strLine);CString*pstrData=SplitString(strLine,',',n);m_FixPoint[i].PointName=pstrData[0];m_FixPoint[i].PointID=i;m_FixPoint[i].X0=m_FixPoint[i].X=_tstof(pstrData[1]);m_FixPoint[i].Y0=m_FixPoint[i].Y=_tstof(pstrData[2]);m_FixPoint[i].iType=1;delete[]pstrData;pstrData=NULL;}//读取未知点数sf.ReadString(strLine);m_UnknownpNum=_ttoi(strLine);SetUnknownpSize(m_UnknownpNum);//设置未知点数组大小//获取未知点点号sf.ReadString(strLine);CString*pstrData=SplitString(strLine,',',n);for(inti=0;im_UnknownpNum;i++){m_UnknownPoint[i].PointName=pstrData[i];m_UnknownPoint[i].PointID=i+m_FixpNum;m_UnknownPoint[i].iType=0;}delete[]pstrData;pstrData=NULL;sf.ReadString(strLine);//读取角度观测数m_AObsDataNum=_ttoi(strLine);SetAObsDataSize(m_AObsDataNum);//设置角度观测数据数组大小8//读取并保存角度观测数据for(inti=0;im_AObsDataNum;i++){sf.ReadString(strLine);CString*pstrData=SplitString(strLine,',',n);m_AObsData[i].startp=SearchPointUsingID(pstrData[0]);m_AObsData[i].endp=SearchPointUsingID(pstrData[1]);m_AObsData[i].AObs=_tstof(pstrData[2]);m_AObsData[i].AObs=Dms_To_Rad(m_AObsData[i].AObs);delete[]pstrData;pstrData=NULL;}sf.ReadString(strLine);//读取边长观测数m_DObsDataNum=_ttoi(strLine);SetDObsDataSize(m_DObsDataNum);//设置边长观测数据数组大小m_AllpNum=m_FixpNum+m_UnknownpNum;//获取总点数m_AllObs=m_AObsDataNum+m_DObsDataNum;//获取总观测数//读取并保存边长观测数据for(inti=0;im_DObsDataNum;i++){sf.ReadString(strLine);CString*pstrData=SplitString(strLine,',',n);m_DObsData[i].startp=SearchPointUsingID(pstrData[0]);m_DObsData[i].endp=SearchPointUsingID(pstrData[1]);m_DObsData[i].DObs=_tstof(pstrData[2]);delete[]pstrData;pstrData=NULL;}sf.Close();returntrue;}voidTraverseNet::SetFixpNumSize(intn){9m_FixpNum=n;m_FixPoint=newTraversePoint[n];}voidTraverseNet::SetUnknownpSize(intn){m_UnknownpNum=n;m_UnknownPoint=newTraversePoint[n];}voidTraverseNet::SetAObsDataSize(intn){m_AObsDataNum=n;m_AObsData=newAngleObs[n];}voidTraverseNet::SetDObsDataSize(intn){m_DObsDataNum=n;m_DObsData=newDistObs[n];}//根据点号从已知点数组中找到控制点,并返回该点的指针TraversePoint*TraverseNet::SearchKnownPointUsingID(CStringpointID){for(inti=0;im_FixpNum;i++){if(pointID==m_FixPoint[i].PointID){return&m_FixPoint[i];}}returnNULL;}//根据点号从未知点数组中找到控制点,并返回该点的指针TraversePoint*TraverseNet::SearchUnknownPointUsi