版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
...wd......wd......wd...?测绘程序设计(VC.net)?上机实验报告〔VisualC++.Net〕班级:测绘0901班学号:0405090204姓名:代娅琴2012年4月29日实验八平差程序设计根基实验目的•稳固过程的定义与调用•稳固类的创立与使用•稳固间接平差模型及平差计算•掌握平差程序设计的基本技巧与步骤实验内容水准网平差程序设计。设计一个水准网平差的程序,要求数据从文件中读取,计算局部与界面无关。水准网间接平差模型:计算例如:近似高程计算:水准网平差计算一般步骤(1)读取观测数据和数据;(2)计算未知点高程近似值;(3)列高差观测值误差方程;(4)根据水准路线长度计算高差观测值的权;(5)组成法方程;(6)解法方程,求得未知点高程改正数及平差后高程值;(7)求高差观测值残差及平差后高差观测值;(8)精度评定;(9)输出平差结果。水准网高程近似值计算算法输入数据格式例如实验代码:#pragmaonceclassLevelControlPoint{public: LevelControlPoint(void); ~LevelControlPoint(void);public: CStringstrName;//点名 CStringstrID;//点号floatH;boolflag;//标记是否已经计算出近似高程值,假设计算出那么为,否那么为};classCDhObs{public: CDhObs(void); ~CDhObs(void);public: LevelControlPoint*cpBackObj;//后视点 LevelControlPoint*cpFrontObj;//前视点doubleObsValue;//高差值doubleDist;//测站的距离};#include"StdAfx.h"#include"LevelControlPoint.h"LevelControlPoint::LevelControlPoint(void){ strName=_T(""); strID=_T(""); H=0; flag=0;}LevelControlPoint::~LevelControlPoint(void){}CDhObs::CDhObs(void){}CDhObs::~CDhObs(void){}#pragmaonce#include"LevelControlPoint.h"#include"Matrix.h"classAdjustLevel{public: AdjustLevel(void); ~AdjustLevel(void);public: LevelControlPoint*m_pKnownPoint;//点数组intm_iKnownPointCount;//点个数 LevelControlPoint*m_pUnknownPoint;//未知点数组intm_iUnknownPointCount;//未知点个数 CDhObs*m_pDhObs;//高差观测值数组intm_iDhObsCount;//高差观测值个数public:voidSetKnownPointSize(intsize);//创立大小为size的点数组voidSetUnkonwnPointSize(intsize);//创立大小为size的未知点数组voidSetDhObsSize(intsize);//创立大小为size的观测值数组boolLoadObsData(constCString&strFile);//读入观测文件 CString*SplitString(CStringstr,charsplit,int&iSubStrs);voidApproHeignt(void);//计算近似值private: LevelControlPoint*SearchKnownPointUsingID(CStringID); LevelControlPoint*SearchUnknownPointUsingID(CStringID); LevelControlPoint*SearchPointUsingID(CStringID);CMatrixLevleWeight(void);//计算权矩阵 public:voidFormErrorEquation(CMatrix&B,CMatrix&L);//组成误差方程voidEquationCompute(CMatrix&x);//计算法方程voidAccuracy_Assessment(double&r0,CMatrix&Qxx);//精度评定voidCompAdjust(double&r0,CMatrixQx[]);};#include"StdAfx.h"#include"AdjustLevel.h"#include<locale.h>#include"LevelControlPoint.h"#include"math.h"AdjustLevel::AdjustLevel(void){ m_pKnownPoint=NULL;//点数组 m_iKnownPointCount=0;//点个数 m_pUnknownPoint=NULL;//未知点数组 m_iUnknownPointCount=0;//未知点个数 m_pDhObs=NULL;//高差观测值数组 m_iDhObsCount=0;//高差观测值个数}AdjustLevel::~AdjustLevel(void){if(m_pKnownPoint!=NULL) {delete[]m_pKnownPoint; m_pKnownPoint=NULL; }if(m_pUnknownPoint!=NULL) {delete[]m_pUnknownPoint; m_pUnknownPoint=NULL; }if(m_pDhObs!=NULL) {delete[]m_pDhObs; m_pDhObs=NULL; }}voidAdjustLevel::SetKnownPointSize(intsize){ m_pKnownPoint=newLevelControlPoint[size];//创立动态指针 m_iKnownPointCount=size;}voidAdjustLevel::SetUnkonwnPointSize(intsize){ m_pUnknownPoint=newLevelControlPoint[size]; m_iUnknownPointCount=size;}voidAdjustLevel::SetDhObsSize(intsize){ m_pDhObs=newCDhObs[size]; m_iDhObsCount=size;//高差观测值个数}boolAdjustLevel::LoadObsData(constCString&strFile){ CStdioFilesf;if(!sf.Open(strFile,CFile::modeRead))returnfalse;//创立并翻开文件对象 CStringstrLine;boolbEOF=sf.ReadString(strLine);//读取第一行,即点的数目 SetKnownPointSize(_ttoi(strLine));//根据点的数目,创立点数组;intn=0;for(inti=0;i<m_iKnownPointCount;i++)//读取点的点名和高程值 { sf.ReadString(strLine); CString*pstrData=SplitString(strLine,',',n); m_pKnownPoint[i].strName=pstrData[0]; m_pKnownPoint[i].strID=pstrData[0]; m_pKnownPoint[i].H=_tstof(pstrData[1]); m_pKnownPoint[i].flag=1;//点不用平差,故将其的flag设置为delete[]pstrData; pstrData=NULL; } sf.ReadString(strLine);//读取未知点的个数 SetUnkonwnPointSize(_ttoi(strLine));//根据未知点的个数创立未知点数组 sf.ReadString(strLine);//读取未知点的点名 CString*pstrData=SplitString(strLine,',',n);for(inti=0;i<m_iUnknownPointCount;i++)//将未知点的点名放入未知点数组 { m_pUnknownPoint[i].strName=pstrData[i]; m_pUnknownPoint[i].strID=pstrData[i]; m_pUnknownPoint[i].H=0;//未知点的高程值设置为 m_pUnknownPoint[i].flag=0;//还没有求得近似高程,故其flag设置为 }if(pstrData!=NULL) {delete[]pstrData; pstrData=NULL; } sf.ReadString(strLine);//读取观测值的个数 SetDhObsSize(_ttoi(strLine));//按照观测值的大小,创立观测值数组for(inti=0;i<m_iDhObsCount;i++)//分行读取观测值的数据,将其存入观测值数组 { sf.ReadString(strLine); CString*pstrData=SplitString(strLine,',',n); m_pDhObs[i].cpBackObj=SearchPointUsingID(pstrData[0]);//后视点 m_pDhObs[i].cpFrontObj=SearchPointUsingID(pstrData[1]);//前视点 m_pDhObs[i].HObsValue=_tstof(pstrData[2]);//高差观测值 m_pDhObs[i].Dist=_tstof(pstrData[3]);//距离观测值delete[]pstrData; pstrData=NULL; } sf.Close();return1;}CString*AdjustLevel::SplitString(CStringstr,charsplit,int&iSubStrs){intiPos=0;//分割符位置intiNums=0;//分割符的总数CStringstrTemp=str;CStringstrRight;//先计算子字符串的数量while(iPos!=-1){iPos=strTemp.Find(split);if(iPos==-1){break;}strRight=strTemp.Mid(iPos+1,str.GetLength());strTemp=strRight;iNums++;}if(iNums==0)//没有找到分割符{//子字符串数就是字符串本身iSubStrs=1;returnNULL;}//子字符串数组iSubStrs=iNums+1;//子串的数量=分割符数量+1CString*pStrSplit;pStrSplit=newCString[iSubStrs];strTemp=str;CStringstrLeft;for(inti=0;i<iNums;i++){iPos=strTemp.Find(split);//左子串strLeft=strTemp.Left(iPos);//右子串strRight=strTemp.Mid(iPos+1,strTemp.GetLength());strTemp=strRight;pStrSplit[i]=strLeft;}pStrSplit[iNums]=strTemp;returnpStrSplit;}//LevelControlPoint*AdjustLevel::SearchKnownPointUsingID(CStringID){for(inti=0;i<m_iKnownPointCount;i++) {if(m_pKnownPoint[i].strID==ID) {return&m_pKnownPoint[i];} }returnNULL;}//LevelControlPoint*AdjustLevel::SearchUnknownPointUsingID(CStringID){for(inti=0;i<m_iUnknownPointCount;i++) {if(m_pUnknownPoint[i].strID==ID) {return&m_pUnknownPoint[i];} }returnNULL;}LevelControlPoint*AdjustLevel::SearchPointUsingID(CStringID){ LevelControlPoint*cp; cp=SearchKnownPointUsingID(ID);if(cp==NULL) cp=SearchUnknownPointUsingID(ID);returncp;}voidAdjustLevel::ApproHeignt(void)//用于计算高程近似值的函数{for(inti=0;i<m_iUnknownPointCount;i++)//计算未知点高程值 {if(m_pUnknownPoint[i].flag!=1) {//先在未知点作为观测值的前视点的情况for(intj=0;j<m_iDhObsCount;j++)//从观测数组里找与未知点有关联的点 {//如果观测值的前视点是未知点且其后视点已经有高程值if((m_pDhObs[j].cpFrontObj->strID==m_pUnknownPoint[i].strID) &&m_pDhObs[j].cpBackObj->flag==1) {//前视点=后视点-高差/*m_pUnknownPoint[i].H=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)//如果经过上一步骤未知点仍没有计算出近似值 {for(intj=0;j<m_iDhObsCount;j++)//从观测数组里找与未知点有关联的点 {//如果观测值的后视点是未知点且其前视点已经有高程值if((m_pDhObs[j].cpBackObj->strID==m_pUnknownPoint[i].strID) &&m_pDhObs[j].cpFrontObj->flag==1) {//后视点=前视点+高差 m_pUnknownPoint[i].H=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)//如果已经计算到最后一个未知点 {for(inta=0;a<m_iUnknownPointCount;a++) {if(m_pUnknownPoint[i].flag!=1)//只要有一个未知点的近似高程直没有计算 {//那么要重新进展上面的步骤直到所有的未知点的近似高程值都计算出 i=-1;break; } } } }}CMatrixAdjustLevel::LevleWeight(void){ CMatrixp(m_iDhObsCount,m_iDhObsCount); p.Unit();doublevalue;for(inti=0;i<m_iDhObsCount;i++) { value=(1.0/m_pDhObs[i].Dist); p(i,i)=value; }returnp;}voidAdjustLevel::FormErrorEquation(CMatrix&B,CMatrix&L){ B.SetSize(m_iDhObsCount,m_iUnknownPointCount); L.SetSize(m_iDhObsCount,1);for(inti=0;i<m_iDhObsCount;i++)//建设B系数阵 { LevelControlPoint*tmpBack=NULL,*tmpFront=NULL; tmpBack=SearchPointUsingID(m_pDhObs[i].cpBackObj->strID); tmpFront=SearchPointUsingID(m_pDhObs[i].cpFrontObj->strID);//找到与第i个观测值有关的未知点 tmpBack->strID;for(intj=0;j<m_iUnknownPointCount;j++) {if(m_pUnknownPoint[j].strID==tmpBack->strID)//如果是后视点那么前面的系数为-1 {B(i,j)=-1;continue; }if(m_pUnknownPoint[j].strID==tmpFront->strID)//如果是前视点那么前面的系数为 { B(i,j)=1; } } }//建设L矩阵 CStringtmp;for(inti=0;i<m_iDhObsCount;i++) {//l=高差观测值-〔后视近似值-前视近似值〕/*L(i,0)=m_pDhObs[i].ObsValue-(m_pDhObs[i].cpBackObj->H-m_pDhObs[i].cpFrontObj->H);*/ L(i,0)=m_pDhObs[i].HObsValue-(m_pDhObs[i].cpFrontObj->H-m_pDhObs[i].cpBackObj->H); tmp.Format(_T("%.3f"),L(i,0)); L(i,0)=_tstof(tmp); L(i,0)=L(i,0)*1000;//将单位化为mm }}voidAdjustLevel::EquationCompute(CMatrix&x)//计算法方程{ CMatrixP,B,l; P=LevleWeight();//P为权矩阵 FormErrorEquation(B,l); ApproHeignt(); CMatrixBT(m_iUnknownPointCount,m_iDhObsCount); BT=~B;//B的转置矩阵 CMatrixNBB(m_iUnknownPointCount,m_iUnknownPointCount); NBB=BT*P*B; CMatrixNBBl=NBB.Inv(); x=NBBl*BT*P*l;for(inti=0;i<m_iUnknownPointCount;i++) { m_pUnknownPoint[i].H+=x(i,0);//未知点高程值=近似值+改正数 }}voidAdjustLevel::Accuracy_Assessment(double&r0,CMatrix&Qxx)//精度评定{ CMatrixB,l,P,x; P=LevleWeight();//P为权矩阵 FormErrorEquation(B,l); EquationCompute(x); CMatrixv(m_iDhObsCount,1); v=B*x-l; CMatrixvT(1,m_iDhObsCount); vT=~v; CMatrixr/*(1,l)*/; r=vT*P*v; r0=sqrt(r(0,0)/(m_iDhObsCount-m_iUnknownPointCount));//单位权中误差 Qxx.SetSize(m_iUnknownPointCount,m_iUnknownPointCount); CMatrixBT(m_iUnknownPointCount,m_iDhObsCount); BT=~B; CMatrixNBB(m_iUnknownPointCount,m_iUnknownPointCount); NBB=BT*P*B; Qxx=NBB.Inv();}voidAdjustLevel::CompAdjust(double&r0,CMatrixQx[]){ ApproHeignt();//计算未知点的近似高程值并且存入数组 CMatrixP(m_iDhObsCount,m_iDhObsCount); P=LevleWeight();//p为权矩阵 CMatrixB,L; CMatrixx,Qxx; FormErrorEquation(B,L);//组成误差方程,B为系数矩阵,l为常数项 EquationCompute(x);//计算法方程 Accuracy_Assessment(r0,Qxx);//精度评定for(inti=0;i<m_iUnknownPointCount;i++)//未知点高程中误差 { Qx[i]=sqrt(Qxx(i,i))*r0; }}#include"Matrix.h"#include"locale.h"#include"LevelControlPoint.h"#include"AdjustLevel.h"AdjustLevelLevelComput;CString*SplitString(CStringstr,charsplit,int&iSubStrs){intiPos=0;//分割符位置intiNums=0;//分割符的总数CStringstrTemp=str;CStringstrRight;//先计算子字符串的数量while(iPos!=-1){iPos=strTemp.Find(split);if(iPos==-1){break;}strRight=strTemp.Mid(iPos+1,str.GetLength());strTemp=strRight;iNums++;}if(iNums==0)//没有找到分割符{//子字符串数就是字符串本身iSubStrs=1;returnNULL;}//子字符串数组iSubStrs=iNums+1;//子串的数量=分割符数量+1CString*pStrSplit;pStrSplit=newCString[iSubStrs];strTemp=str;CStringstrLeft;for(inti=0;i<iNums;i++){iPos=strTemp.Find(split);//左子串strLeft=strTemp.Left(iPos);//右子串strRight=strTemp.Mid(iPos+1,strTemp.GetLength());strTemp=strRight;pStrSplit[i]=strLeft;}pStrSplit[iNums]=strTemp;returnpStrSplit;}voidCIndircLelveDlg::OnBnClickedOpendatafile(){//TODO:在此添加控件通知处理程序代码 UpdateData(TRUE); CFileDialogdlgFile(TRUE,_T("txt"),NULL,OFN_ALLOWMULTISELECT|OFN_EXPLORER, _T("(文本文件)|*.txt"));//创立文件对话框if(dlgFile.DoModal()==IDCANCEL)return;//如果选择取消按钮那么返回 CStringstrFileName=dlgFile.GetPathName();//翻开获取文件文件名 setlocale(LC_ALL,"");//设置语言环境 CStdioFilesf;if(!sf.Open(strFileName,CFile::modeRead))return; InputContent.Empty();//清空字符串str_openContent中的内容 CStringstrLine; BOOLbEOF=sf.ReadString(strLine);//读取第一行数据while(bEOF)//开场读取顶点数据 { bEOF=sf.ReadString(strLine);if(bEOF) InputContent+=strLine+_T("\r\n"); } sf.Close(); UpdateData(FALSE);}voidCIndircLelveDlg::OnBnClickedSavedata(){//TODO:在此添加控件通知处理程序代码 UpdateData(TRUE); CFileDialogdlgFile(FALSE,_T("txt"),NULL,OFN_EXPLORER, _T("(Level格式)|*.txt"));if(dlgFile.DoModal()==IDCANCEL)return; CStringstrFileName=dlgFile.GetPathName(); setlocale(LC_ALL,""); CStdioFilesf;if(!sf.Open(strFileName,CFile::modeCreate|CFile::modeWrite))return; sf.WriteString(LevleContent); sf.Close(); UpdateData(FALSE);}voidCIndircLelveDlg::OnBnClickedComputelevel(){//TODO:在此添加控件通知处理程序代码 UpdateData(TRUE);setlocale(LC_ALL,"");double*Qx=newdouble[LevelComput.m_iUnknownPointCount];doubler0; LevelComput.CompAdjust(r0,Qx); LevleContent.Format(_T("平差后高程值:\r\n")); CStringTemp;for(inti=0;i<LevelComput.m_iUnknownPointCount;i++) { Temp.Empty(); Temp.Format(_T("%s,%.4f\r\n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 仓储保管合同2026年保险代理协议
- 水稻绿色高质高效栽培方案
- 特种作业人员安全培训管理制度
- 失眠改善推拿理疗疗程方案
- 会员转介绍激励推广方案设计
- 婴幼儿良好睡眠习惯培养方案
- 滋阴补气血药膳食谱手册
- 金银花标准化种植技术规程
- 肉羊羔羊早期断奶培育制度
- 小麦晚播保全苗操作指引
- 铁路隧道工程标准化施工指导手册(经典可编辑版)
- 2026北京师范大学总务部物业管理中心招聘3人考试模拟试题及答案解析
- 广东省中考语文答题卡wor版可编辑A4版
- 2026中国能源传媒集团有限公司社会招聘(6人)笔试备考试题及答案解析
- 2026年山东医学高等专科学校辅导员招聘笔试备考试题及答案解析
- 2026职业病防治法宣传周丨职业病防治知识培训
- 辽宁省县区事业单位转公务员考试真题
- 2026江西江钨控股集团本部招聘审计专业管理人员3人笔试历年备考题库附带答案详解
- 田地施肥施工方案(3篇)
- 2025四川省自然资源投资集团招聘笔试历年参考题库附带答案
- 智商、情商和逆商与生涯发展课件
评论
0/150
提交评论