还剩17页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
VC.net《测绘程序设计》上机实验报告VisuaI C++.Net班级测绘班0901学号0405090204姓名代娅琴2012年4月29日//LevelControlPoint*AdjustLevel::SearchKnownPointUsingIDCString IDforint i=0;im_iKnownPointCount;i++if m_pKnownPoint[i].strID==ID{return m_pKnownPoint[i];}}return NULL;//LevelControlPoint*AdjustLevel::SearchUnknownPointUsingIDCString IDforint i=0;im_iUnknownPointCount;i++{if m_pUnknownPoint[i].strID==ID{return m_pUnknownPoint[i];}return NULL;LevelControlPoint*AdjustLevel::SearchPointUsingIDCString IDLevelControlPoint*cp;cp=SearchKnownPointUsingIDID;if cp-NULLcp=SearchUnknownPointUsingID ID;return cp;void AdjustLevel::ApproHeignt void〃用于计算高程近似值的函数{for inti=0;im_iUnknownPointCount;i++〃计算未知点高程值ifm_pUnknownPo int L i].flag!=l〃先在未知点作为观测值的前视点的情况for intj=0;jm_iDhObsCount;j++〃从观测数组里找与未知点有关联的点{〃如果观测值的前视点是未知点且其后视点已经有高程值if m_pDh0bs[j].cpFrontObj-strID=m_pUnknownPoint[i].strlD m_pDh0bs[j].cpBackObj-flag==l{〃前视点二后视点-高差/*m_pUnknownPoint[i].H=m_pDh0bs[i].cpBackObj-H-m_pDh0bs[i].ObsValue;*/m pUnknownPoint[i].H=m_pDh0bs[j].cpBackObj-H+m_pDh0bs[j].HObsValue;m pUnknownPoint[i].flag=l;break;}if m_pUnknownPoint[i].flag!=1〃如果经过上一步骤未知点仍没有计算出近似值{forint j=0;jm_iDhObsCount;j++〃从观测数组里找与未知点有关联的点{〃如果观测值的后视点是未知点且其前视点已经有高程值if m pDhObs[j].cpBackObj-strID==m pUnknownPoint[i].strlD m_pDhObs[j].cpFrontObj-flag==l{〃后视点=前视点+高差m_pUnknownPoint[i].H=m_pDhObs LjLcpFrontObj-H-m_pDhObs[j].HObsValue;/*m pUnknownPoint[i].H=m_pDhObs[i].cpFrontObj-H+m_pDhObs[i].ObsValue;*/m_pUnknownPoint[i].flag=l;break;}}if i二二m_iUnknownPointCountT〃如果已经计算到最后一个未知点forint a=0;am_iUnknownPointCount;a++if m_pUnknownPoint[i].flag!=1〃只要有一个未知点的近似高程直没有计算{〃则要重新进行上面的步骤直到所有的未知点的近似高程值都计算出i=-l;break;}CMatrix AdjustLevel::LevleWeightvoid CMatrixpm iDhObsCount,m iDhObsCount;p.Unit;double value;forint i=0;im_iDhObsCount;i++value=l.O/m_pDhObs[i].Dist;pi,i=value;}return p;void AdjustLevel::FormErrorEquationCMatrix B,CMatrix L
8.SetSizem iDhObsCount,m_iUnknownPointCount;L.SetSize m_iDhObsCount,1;for inti=0;im_iDhObsCount;i++〃建立B系数阵LevelControlPoint*tmpBack二NULL,*tmpFront二NULL;tmpBack=SearchPointUsinglDm_pDhObs[i].cpBackObj-strID;tmpFront=SearchPointUsingIDm_pDhObs[i].cpFrontObj-strID;〃找到与第i个观测值有关的未知点tmpBack-strID;forint j=0;jm_iUnknownPointCount;j++if m_pUnknownPoint[j].strID=tmpBack-〉strID〃如果是后视点则前面的系数为T{Bi,j=-l;continue;if m pUnknownPoint[j].strID=tmpFront-strID〃如果是前视点则前面的系数为Bi,j=l;〃建立L矩阵CString tmp;forint i=0;im_iDhObsCount;i++〃厂高差观测值-后视近似值-前视近似值/*Li,0=m_pDh0bs[i].ObsValue-m_pDhObs[i].cpBackObj-H-m_pDhObs[i].cpFrontObj-H;*/Li,0=m pDhObs[i].HObsValue-m pDhObs[i].cpFrontObj-H-m_pDhObs[i].cpBackObj-H;tmp.Format_Tz,%.3f〃,Li,0;Li,0=_tstof tmp;Li,0=Li,0*1000;〃将单位化为mmvoid AdjustLevel::EquationCompute CMatrix x〃计算法方程CMatrix P,B,1;P=LevleWeight;〃P为权矩阵FormErrorEquation B,1;ApproHeignt;CMatrix BTm iUnknownPointCount,m iDhObsCount;BT-B;〃B的转置矩阵CMatrix NBBm iUnknownPointCount,m iUnknownPointCount;NBB=BT*P*B;CMatrix NBB1=NBB.Inv;x=NBB1*BT*P*1;forint i=0;im_iUnknownPointCount;i++m pUnknownPoint[i].H+=xi,0;〃未知点高程值二近似值+改正数void AdjustLevel::Accuracy_Assessment doubler0,CMatrix Qxx//精度评定CMatrix B,1,P,x;P=LevleWeight;〃1为权矩阵FormErrorEquation B,1;EquationCompute x;CMatrix vm iDhObsCount,1;v二B*x-1;CMatrix vT1,m iDhObsCount;vT=~v;CMatrix r/*l,1*/;r=vT*P*v;r0=sqrt r0,0/m_iDhObsCount-m iUnknownPointCount;〃单位权中误差Qxx.SetSize m iUnknownPointCount,m iUnknownPointCount;CMatrix BTmiUnknownPointCount,m iDhObsCount;BT二〜B;CMatrix NBBmiUnknownPointCount,miUnknownPointCount;NBB=BT*P*B;Qxx=NBB.Inv;}void AdjustLevel::CompAdjustdouble r0,CMatrix Qx[]ApproHeignt;〃计算未知点的近似高程值并且存入数组CMatrix Pm iDhObsCount,miDhObsCount;P=LevleWeight;〃p为权矩阵CMatrix B,L;CMatrixx,Qxx;FormErrorEquation B,L;〃组成误差方程,B为系数矩阵,1为常数项EquationCompute x;〃计算法方程Accuracy_Assessment rO,Qxx;〃精度评定for inti=0;im_iUnknownPointCount;i++〃未知点高程中误差{Qx[i]=sqrt Qxxi,i*rO;ttinclude Matrix.h〃ftinclude/locale.h〃ffinclude LevelControlPoint.h〃ttinclude AdjustLevel.h〃AdjustLevel LevelComput;CString*SplitStringCString str,char split,int iSubStrsint iPos=0;〃分割符位置int iNums=0;//分割符的总数CString strTemp=str;CString strRight;〃先计算子字符串的数量while iPos!=-1iPos=strTemp.Findsplit;if iPos二二-1break;}strRight二strTemp.MidiPos+1,str.GetLength;strTemp=strRight;iNums++;}if iNums_0〃没有找到分割符〃子字符串数就是字符串本身iSubStrs=1;return NULL;〃子字符串数组iSubStrs=iNums+1;〃子串的数量二分割符数量+1CString*pStrSplit;pStrSplit=new CString[iSubStrs];strTemp=str;CString strLeft;for inti=0;iiNums;i++iPos=strTemp.Findsplit;〃左子串strLeft=strTemp.LeftiPos;〃右子串strRight=strTemp.MidiPos+1,strTemp.GetLengthO;strTemp=strRight;pStrSplit[i]=strLeft;}pStrSplit[iNums]=strTemp;return pStrSplit;void CIndircLelveDlg::OnBnClickedOpendatafile//TODO:在此添加控件通知处理程序代码UpdateDataTRUE;C dig,NULL,OFN_ALLOWMULTISELECT|OFN_EXPLORER,_T〃文本文件txO;〃创建文件对话框ifdlg==IDCANCEL return;〃如果选择取消按钮则返回CString str;〃打开获取文件文件名setlocaleLC_ALL/,,z;〃设置语言环境CStdio;if!sf.Open str,C return;InputContent.Empty/清空字符串str openContent中的内容CString strLine;BOOL bEOF=sf.ReadStringstrLine;〃读取第一行数据whi lebEOF〃开始读取顶点数据{bE0F=sf.ReadString strLine;ifbEOF InputContent+=strLine+_T〃\r\n〃;sf.Close;UpdateDataFALSE;void CIndircLelveDlg::OnBnClickedSavedataO{//TODO:在此添加控件通知处理程序代码UpdateDataTRUE;C digftxt,NULL,OFN_EXPLORER,_T〃Level格式|*.txt;ifdig==IDCANCEL return;CString str;setlocaleLC ALL,〃〃;CStdio;if!sf.Open str,C return;sf.WriteStringLevleContent;sf.Close;UpdateDataFALSE;void ClndircLelveDlg::OnBnClickedComputelevel//TODO:在此添加控件通知处理程序代码UpdateDataTRUE;setlocale LC_ALL,,,/z;double*Qx=new double[LevelComput.m_iUnknownPointCount];double rO;LevelComput.CompAdjustrO,Qx;LevleContent.FormatT〃平差后高程值\r\n〃;CString Temp;forint i=0;iLevelComput.miUnknownPointCount;i++{Temp.Empty;Temp.Format_T〃%s,%.4f\r\n〃,LevelComput.m_pUnknownPoint[i].strlD,LevelComput.m pUnknownPoint[i].H;Lev1eCont ent+=T emp;}Temp.FormatT〃单位权中误差%.If mm\r\n/z,r0*1000;LevleContent+=Temp;LevleContent+=_T〃未知点高程中误差mm:\r\n〃;for inti=0;i LevelComput.miUnknownPointCount;i++Temp.Empty;Temp.Format_T/z%s,%.lf\r\n/z,LevelComput.m_pUnknownPoint[i].strName,Qx[i]*1000;LevleContent+=Temp;UpdateDatafalse;void ClndircLelveDlg::OnBnClickedSavelevleresult//TODO:在此添加控件通知处理程序代码UpdateDataTRUE;C dig〃txt〃,NULL,OFN_EXPLORER,_T〃Level格式|*.txt〃;if dig==IDCANCEL return;CString str;setlocale LCALL,z//,;CStdio;if!sf.Open str,C return;sf.WriteStringLevleContent;sf.Close;UpdateDataFALSE;
三、实验结果打开文件数据:平差结果:输入数据水准网间接平差A,
5.000平差后高程值Xl
6.3585rB
6.000r X2J.0U7X
35.3598Z3单位权中误差
3.0mm未X1,X2,X知点高程中误差mm:
372.0A Xl
1.359lr zr
2.2A,X2,
2.
00942.5|B,XI,
0.363,2X3B
0.640,2r rXI,X2,
0.657,1X3,Xlrl.000,lX3,X
24.650,l.5打开数据文件保存数据保存结果间接平差计算实验心得这从实验是我们测绘程序设计的最后一次实验,虽然这个学期我们做了好几次相关的实验,但是我却发现自己学的东西也越来越模糊,感觉很多内容都不理解这次的实验很大程度上我都是按照《测绘程序设计》上面单导线简易计算来编的,在加上后面的关于水准网间接平差的误差方程和法方程,以及精度评定的相关函数,来完成的而自己主要完成的就是水准网的数据读取,保存的操作,由于这部分主要用的知识是文件的读取的,因为前面做过,所以不是太难但是这并不意味着这次实验很简单,至少在我心中这的确比较难,因为里面很多东西不是纯粹的把代码写上去就可以完成,还要靠自己做相应的代码对应,才能够真正的得到想要的结果但学好编程并扎实的为自己所用是需要更多的学习和练习的,我知道在掌握课堂知识的同时,主动的去寻找吸收相关的知识,希望通过本门课程的学习,掌握学习编程的方法,使自己的水平能够更进一步,循序渐进的掌握更多虽然这门课的实验已经结束,但是我却深深地知道,我们专业对编程的要求很高,而且必须具备较好的编程能力,或许这些日子下来,我学到的不是很多,但是我或多或少明白,编程是一个循序渐进的过程,我想真的能够在这方面有所突破,就更要花时间多花工夫实验八平差程序设计基础
一、实验目的巩固过程的定义与调用•巩固类的创建与使用•巩固间接平差模型及平差计算•掌握平差程序设计的基本技巧与步骤•
二、实验内容水准网平差程序设计设计一个水准网平差的程序,要求数据从文件中读取,计算部分与界面无关水准网间接平差模型
1.+匕LX X XX误差方程:匕=b x-f
4.4-22x;其中f]=L—AH i4=—1,6=L2计算示例:
2.已知、点高程“八卜儿=A8=
5.000m,为确定、、点高程,进行了
6.000m,X1X2X3水准测量,观测结果为h[=+
1.359m,fi2Si=lkm刀—+
2.009m,3S2=1km=+.363m9S3=2kmS4=2km~+
0.640m,hsS=lkm5Sg=lkrnS7=
1.5km卜=+
0.637m,6=+
1.000m A7—+
1.650m.近似高程计算//;=+卜1=H4+%;H=H-4其中V=BX-f10V1V00为2100“300-1V A*2£fX3-110%s f.10-1%于01—V717权矩阵为P=diagl/Si1/S1/5,1/S1/S101/S2457J解得:i=BTPB^BTPf勺平差后高程值H=H°水准网平差计算一般步骤
3.读取观测数据和已知数据;1计算未知点高程近似值;2列高差观测值误差方程;3根据水准路线长度计算高差观测值的权;4组成法方程;5解法方程,求得未知点高程改正数及平差后高程值;6求高差观测值残差及平差后高差观测值;7精度评定;8输出平差结果
9.水准网高程近似值计算算法4i=H-1i=1to n输入数据格式示例
5.,已知点点号及高程A,
5.0003--6-.--0--0-0---*未知点数X1,X2,X3---------------------未知点点号,高差观测数据个数A»XL
1.359,1A$X2s
2.009,1b-XLU.363,2高差观测数据♦X3,B,
0.640,2起点,终点,高差,路线长度XI,X2,
0.657,1X3,X1,
1.000,1X3jX2,
1.650,
1.5实验代码ttpragma onceclassLevelControlPointpublic:LevelControlPointvoid;^LevelControlPointvoid;public:CString strName;〃点名CString strlD;〃点号float H;bool flag;〃标记是否已经计算出近似高程值,若计算出则为,否则为;class CDhObspublic:CDhObsvoid;CDhObsvoid;〜public:LevelControlPoint*cpBackObj;〃后视点LevelControlPoint*cpFrontObj;〃前视点double ObsValue;〃高差值double Dist;〃测站的距离;ttinclude StdAfx.h〃ftinclude LevelControlPoint.h〃LevelControlPoint::LevelControlPointvoidstrName=_T〃〃;strID=_T〃〃;H=0;flag=0;LevelControlPoint::LevelControlPointvoid}CDhObs::CDhObsvoidCDhObs::CDhObsvoid ffpragmaonce〜ttinclude^LevelControlPoint.h〃ttinclude Matrix.h〃class AdjustLevelpublic:AdjustLevelvoid;AdjustLevelvoid;public:LevelControlPoint*m_pKnownPoint;〃已知点数组int m_iKnownPointCount;〃已知点个数LevelControlPoint*m_pUnknownPoint;〃未知点数组int miUnknownPointCount;〃未知点个数CDhObs*m_pDhObs;〃高差观测值数组int mjDhObsCount;〃高差观测值个数public:void SetKnownPointSizeint size;〃创建大小为size的己知点数组void SetUnkonwnPointSizeintsize;〃创建大小为size的未知点数组void SetDhObsSizeintsize;〃创建大小为size的观测值数组bool LoadObsDataconst CStringfe str读入观测文件CString*SplitStringCString str,char split,int iSubStrs;void ApproHeigntvoid;〃计算近似值private:LevelControlPoint*SearchKnownPointUsingIDCString ID;LevelControlPoint*SearchUnknownPointUsinglDCString ID;LevelControlPoint*SearchPointUsingIDCString ID;CMatrix LevleWeightvoid;〃计算权矩阵public:void FormErrorEquationCMatrixB,CMatrix L;〃组成误差方程void EquationComputeCMatrixx;〃计算法方程void AccuracyAssessment doubler0,CMatrix Qxx;〃精度评定void CompAdjustdoubler0,CMatrix Qx[];;ttinclude“StdAfx.h〃#include^AdjustLevel.h〃ttinclude locale.hftinclude z/LevelControlPoint.h〃ftinclude math.h〃AdjustLevel::AdjustLevelvoid m_pKnownPo int=NULL;〃已知点数组m_iKnownPo intCount=0;〃已知点个数m pUnknownPoint二NULL;//未知点数组m_iUnknownPointCount=0;//未知点个数m_pDhObs=NULL;〃高差观测值数组m_iDh0bsCount=0;〃高差观测值个数AdjustLevel::^AdjustLevelvoidifm_pKnownPoint!=NULLdelete口m_pKnownPoint;mpKnownPo int=NULL;}ifm pUnknownPoint!=NULL{delete[]m pUnknownPoint;mpUnknownPoint=NULL;}ifm_pDhObs!=NULLdelete[]m_pDhObs;m_pDhObs=NULL;void AdjustLevel::SetKnownPointSizeint sizem pKnownPoint=new LevelControlPoint[size];〃创建动态指针m iKnownPointCount二size;void AdjustLevel::SetUnkonwnPointSizeint sizem_pUnknownPoint=new LevelControlPoint[size];m_iUnknownPointCount=size;void AdjustLevel::SetDhObsSizeint sizem_pDhObs=new CDhObs[size];m_iDhObsCount=size;〃高差观测值个数bool AdjustLevel::LoadObsDataconstCStringstrFile CStdio;if!sf.Open strreturn false;〃创建并打开文件对象CString strLine;bool bEOF=sf.ReadStringstrLine;〃读取第一行,即已知点的数目SetKnownPointSize_ttoi strLine;〃根据已知点的数目,创建己知点数组;int n=0;for inti=0;im_iKnownPointCount;i++〃读取已知点的点名和高程值sf.ReadString strLine;CString*pstrData=SplitStringstrLine,J,n;m pKnownPoint[i].strName=pstrData[O];m pKnownPoint[i].strID=pstrData[O];mpKnownPoint[i].H=_tstofpstrData[l];m_pKnownPoint[i].flag=l;〃已知点不用平差,故将其的flag设置为delete口pstrData;pstrData=NULL;sf.ReadStringstrLine;〃读取未知点的个数SetUnkonwnPointSize ttoi strLine;〃根据未知点的个数创建未知点数组sf.ReadStringstrLine;〃读取未知点的点名CString*pstrData=SplitStringstrLine,,,,,n;for inti=0;i〈m_iUnknownPointCount;i++〃将未知点的点名放入未知点数组{m_pUnknownPoint[i].strName=pstrData[i];m pUnknownPoint[i].strID=pstrData[i];mpUnknownPoint[i],H=0;〃未知点的高程值设置为m_pUnknownPoint[i].flag=0;〃还没有求得近似高程,故其flag设置为}ifpstrData!=NULL{deleted pstrData;pstrData=NULL;}sf.ReadStringstrLine;〃读取观测值的个数SetDhObsSize_ttoistrLine;〃按照观测值的大小,创建观测值数组for inti=0;i〈m_iDhObsCount;i++〃分行读取观测值的数据,将其存入观测值数组{sf.ReadString strLine;CString*pstrData=SplitStringstrLine,n;m_pDh0bs[i].cpBackObj=SearchPointUsingIDpstrData
[0];〃后视点mpDhObs[i].cpFrontObj=SearchPointUsingIDpstrData
[1];〃前视点m_pDh0bs[i].HObsValue=_tstof pstrData
[2];〃高差观测值m_pDh0bs[i].Dist=_tstof pstrData
[3];〃距离观测值delete[]pstrData;pstrData=NULL;sf.Close;return1;CString*AdjustLevel::SplitStringCString str,char split,int iSubStrsint iPos=0;//分割符位置int iNums=0;//分割符的总数CString strTemp=str;CString strRight;〃先计算子字符串的数量while iPos!二T iPos=strTemp.Findsplit;if iPos==-1break;strRight=strTemp.MidiPos+1,str.GetLengthO;strTemp=strRight;iNums++;}if iNums==0〃没有找到分割符{〃子字符串数就是字符串本身iSubStrs=1;return NULL;〃子字符串数组iSubStrs=iNums+1;〃子串的数量二分割符数量+1CString*pStrSplit;pStrSplit=new CString[iSubStrs];strTemp二str;CString strLeft;for inti=0;iiNums;i++iPos=strTemp.Findsplit;〃左子串strLeft=strTemp.LeftiPos;〃右子串strRight=strTemp.MidiPos+1,strTemp.GetLengthO;strTemp=strRight;pStrSplit[i]=strLeft;pStrSplit[iNums]=strTemp;return pStrSplit;。
个人认证
优秀文档
获得点赞 0