VB开发水准测量平差软件的方法
基于VB2008的电子水准测量数据处理程序的设计与实现

T eE e t n cL v l t r c s i gSDe i na dI lme t t h lcr i e e aP o e sn ’ o Da sg n mp e n h wi
Viu l sc2 0 s a Ba i 0 8
P UC a -u Y h ox UDa: n iu j
其本 身不 带 后处 理软 件 。 本文 针对 徕 卡 D A 3数 字水 准仪 和天 宝 D N 0 N0 ii3
徕 卡 D A 3数 字 水准 仪 是 徕 卡 公司 推 出 的第 N0
数字 水准 仪 ,基 于 V sa a i 言设 计 并实现 了 iu lB sc语 电子 水准 测 量 数据 处 理程 序 ,包 括 数据 传 输 、数 据 处 理 、折 线 图绘 制 、等 级 校验 等 功 能 , 同时 可 以输 出外业 观 测 手 簿 ,并 按 照 现行 测 量规 范进 行 数据 的 近 似平 差 计 算 , 且具 有 数据 修 改 、整 理数 据 成果 、 绘制 三轴 折 线 图等功 能 。
二 代 数字 水 准 仪 ,是第 一 部 使用 大 屏 幕进 行 显 示 的 数 字 水准 仪 ,能 提 示下 一 步 动 作 ,具 有 数据 安全 双 重 保 护 功 能 ,除 了可 以把 测 量 数据 自动 存储 在 仪 器 内存 中 ,还 能 在 测量 完 成 之 后将 数 据 输 出存 储 到 仪 器的 P c卡上 , 导 出的数据 格 式均 是徕 卡标 准 的 G I S 格 式 。同时 它操 作也 非 常方便 ,汲 取 了 T S 0 站 P 70全 仪 的设 计思 路 ,采 用 字母 数字 式 混合键 盘 操作 方 式 , 从 而提 高 用 户 的作 业 效 率 。通 过 实 践 可 以证 明 ,与 传 统 水 准 仪 相 比,采 用 徕 卡数 字 水 准 仪 可 以节 省将 近 5 % 的工 作 时 间,其 测量 既轻 松 又准 确 。 O
测绘程序设计—实验八-水准网平差程序设计报告

《测绘程序设计()》上机实验报告(Visual C++.Net)班级: 测绘0901班学号: **********姓名: 代娅琴4月29日实验八平差程序设计基础一、实验目旳•巩固过程旳定义与调用•巩固类旳创立与使用•巩固间接平差模型及平差计算•掌握平差程序设计旳基本技巧与环节二、实验内容水准网平差程序设计。
设计一种水准网平差旳程序, 规定数据从文献中读取, 计算部分与界面无关。
水准网间接平差模型:计算示例:近似高程计算:1.水准网平差计算一般环节(1)读取观测数据和已知数据;(2)计算未知点高程近似值;(3)列高差观测值误差方程;(4)根据水准路线长度计算高差观测值旳权;(5)构成法方程;(6)解法方程, 求得未知点高程改正数及平差后高程值;(7)求高差观测值残差及平差后高差观测值;(8)精度评估;(9)输出平差成果。
2.水准网高程近似值计算算法3.输入数据格式示例实验代码:#pragma onceclass LevelControlPoint{public:LevelControlPoint(void);~LevelControlPoint(void);public:CString strName;//点名CString strID;//点号float H;bool flag;//标记与否已经计算出近似高程值, 若计算出则为, 否则为};class CDhObs{public:CDhObs(void);~CDhObs(void);public:LevelControlPoint* cpBackObj;//后视点LevelControlPoint* cpFrontObj;//前视点double ObsValue;//高差值double Dist;//测站旳距离};#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){}#pragma once#include"LevelControlPoint.h"#include"Matrix.h"class AdjustLevel{public:AdjustLevel(void);~AdjustLevel(void);public:LevelControlPoint* m_pKnownPoint;//已知点数组int m_iKnownPointCount;//已知点个数LevelControlPoint* m_pUnknownPoint;//未知点数组int m_iUnknownPointCount;//未知点个数CDhObs* m_pDhObs;//高差观测值数组int m_iDhObsCount;//高差观测值个数public:void SetKnownPointSize(int size);//创立大小为size旳已知点数组void SetUnkonwnPointSize(int size);//创立大小为size旳未知点数组void SetDhObsSize(int size);//创立大小为size旳观测值数组bool LoadObsData(const CString& strFile);//读入观测文献CString* SplitString(CString str, char split, int& iSubStrs);void ApproHeignt(void);//计算近似值private:LevelControlPoint* SearchKnownPointUsingID(CString ID);LevelControlPoint* SearchUnknownPointUsingID(CString ID);LevelControlPoint* SearchPointUsingID(CString ID);CMatrix LevleWeight(void);//计算权矩阵public:void FormErrorEquation(CMatrix &B, CMatrix &L);//构成误差方程void EquationCompute(CMatrix &x);//计算法方程void Accuracy_Assessment(double &r0,CMatrix &Qxx);//精度评估void CompAdjust(double &r0,CMatrix Qx[]);};#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;}}void AdjustLevel::SetKnownPointSize(int size){m_pKnownPoint=new LevelControlPoint[size];//创立动态指针m_iKnownPointCount=size;}void AdjustLevel::SetUnkonwnPointSize(int size){m_pUnknownPoint=new LevelControlPoint[size];m_iUnknownPointCount=size;}void AdjustLevel::SetDhObsSize(int size){m_pDhObs=new CDhObs[size];m_iDhObsCount=size;//高差观测值个数}bool AdjustLevel::LoadObsData(const CString& strFile){CStdioFile sf;if(!sf.Open(strFile,CFile::modeRead)) return false;//创立并打开文献对象CString strLine;bool bEOF=sf.ReadString(strLine);//读取第一行, 即已知点旳数目SetKnownPointSize(_ttoi(strLine));//根据已知点旳数目, 创立已知点数组;int n=0;for(int i=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(int i=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(int i=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();return 1;}CString* AdjustLevel::SplitString(CString str, char split, int& iSubStrs) {int iPos = 0; //分割符位置int iNums = 0; //分割符旳总数CString strTemp = str;CString strRight;//先计算子字符串旳数量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;return NULL;}//子字符串数组iSubStrs = iNums + 1; //子串旳数量= 分割符数量+ 1CString* pStrSplit;pStrSplit = new CString[iSubStrs];strTemp = str;CString strLeft;for (int i = 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;return pStrSplit;}//LevelControlPoint* AdjustLevel::SearchKnownPointUsingID(CString ID) {for(int i=0;i<m_iKnownPointCount;i++){if(m_pKnownPoint[i].strID==ID){return &m_pKnownPoint[i];}}return NULL;}//LevelControlPoint* AdjustLevel::SearchUnknownPointUsingID(CString ID) {for(int i=0;i<m_iUnknownPointCount;i++){if(m_pUnknownPoint[i].strID==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)//用于计算高程近似值旳函数{for(int i=0;i<m_iUnknownPointCount;i++)//计算未知点高程值{if(m_pUnknownPoint[i].flag!=1){//先在未知点作为观测值旳前视点旳状况for(int j=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(int j=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(int a=0;a<m_iUnknownPointCount;a++){if(m_pUnknownPoint[i].flag!=1)//只要有一种未知点旳近似高程直没有计算{ //则要重新进行上面旳环节直到所有旳未知点旳近似高程值都计算出i=-1;break;}}}}}CMatrix AdjustLevel::LevleWeight(void){CMatrix p(m_iDhObsCount,m_iDhObsCount);p.Unit();double value;for(int i=0;i<m_iDhObsCount;i++){value=(1.0/m_pDhObs[i].Dist);p(i,i)=value;}return p;}void AdjustLevel::FormErrorEquation(CMatrix &B, CMatrix &L){B.SetSize(m_iDhObsCount,m_iUnknownPointCount);L.SetSize(m_iDhObsCount,1);for(int i=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(int j=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矩阵CString tmp;for(int i=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}}void AdjustLevel::EquationCompute(CMatrix &x)//计算法方程{CMatrix P,B,l;P=LevleWeight(); //P为权矩阵FormErrorEquation(B,l);ApproHeignt();CMatrix BT(m_iUnknownPointCount,m_iDhObsCount);BT=~B; //B旳转置矩阵CMatrix NBB(m_iUnknownPointCount,m_iUnknownPointCount);NBB=BT*P*B;CMatrix NBBl=NBB.Inv();x=NBBl*BT*P*l;for(int i=0;i<m_iUnknownPointCount;i++){m_pUnknownPoint[i].H+=x(i,0);//未知点高程值=近似值+改正数}}void AdjustLevel::Accuracy_Assessment(double &r0,CMatrix &Qxx)//精度评估{CMatrix B,l,P,x;P=LevleWeight(); //P为权矩阵FormErrorEquation(B,l);EquationCompute(x);CMatrix v(m_iDhObsCount,1);v=B*x-l;CMatrix vT(1,m_iDhObsCount);vT=~v;CMatrix r/*(1,l)*/;r=vT*P*v;r0=sqrt(r(0,0)/(m_iDhObsCount-m_iUnknownPointCount));//单位权中误差Qxx.SetSize(m_iUnknownPointCount,m_iUnknownPointCount);CMatrix BT(m_iUnknownPointCount,m_iDhObsCount);BT=~B;CMatrix NBB(m_iUnknownPointCount,m_iUnknownPointCount);NBB=BT*P*B;Qxx=NBB.Inv();}void AdjustLevel::CompAdjust(double &r0,CMatrix Qx[]){ApproHeignt();//计算未知点旳近似高程值并且存入数组CMatrix P(m_iDhObsCount,m_iDhObsCount);P=LevleWeight();//p为权矩阵CMatrix B,L;CMatrix x,Qxx;FormErrorEquation(B,L);//构成误差方程, B为系数矩阵, l为常数项EquationCompute(x);//计算法方程Accuracy_Assessment(r0,Qxx);//精度评估for(int i=0;i<m_iUnknownPointCount;i++)//未知点高程中误差{Qx[i]=sqrt(Qxx(i,i))*r0;}}#include"Matrix.h"#include"locale.h"#include"LevelControlPoint.h"#include"AdjustLevel.h"AdjustLevel LevelComput;CString* SplitString(CString str, char split, int& iSubStrs){int iPos = 0; //分割符位置int iNums = 0; //分割符旳总数CString strTemp = str;CString strRight;//先计算子字符串旳数量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;return NULL;}//子字符串数组iSubStrs = iNums + 1; //子串旳数量= 分割符数量+ 1CString* pStrSplit;pStrSplit = new CString[iSubStrs];strTemp = str;CString strLeft;for (int i = 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;return pStrSplit;}void CIndircLelveDlg::OnBnClickedOpendatafile(){// TODO: 在此添加控件告知解决程序代码UpdateData(TRUE);CFileDialog dlgFile(TRUE,_T("txt"),NULL,OFN_ALLOWMULTISELECT|OFN_EXPLORER,_T("(文本文献)|*.txt"));//创立文献对话框if(dlgFile.DoModal()==IDCANCEL) return;//如果选择取消按钮则返回CString strFileName=dlgFile.GetPathName();//打开获取文献文献名setlocale(LC_ALL,""); //设立语言环境CStdioFile sf;if(!sf.Open(strFileName, CFile::modeRead)) return;InputContent.Empty();//清空字符串str_openContent中旳内容CString strLine;BOOL bEOF=sf.ReadString(strLine);//读取第一行数据while(bEOF)//开始读取顶点数据{bEOF=sf.ReadString(strLine);if(bEOF)InputContent+=strLine+_T("\r\n");}sf.Close();UpdateData(FALSE);}void CIndircLelveDlg::OnBnClickedSavedata(){// TODO: 在此添加控件告知解决程序代码U pdateData(TRUE);CFileDialog dlgFile(FALSE,_T("txt"),NULL,OFN_EXPLORER,_T("(Level格式)|*.txt"));if(dlgFile.DoModal()==IDCANCEL) return;CString strFileName=dlgFile.GetPathName();setlocale(LC_ALL,"");CStdioFile sf;if(!sf.Open(strFileName, CFile::modeCreate|CFile::modeWrite)) return;sf.WriteString(LevleContent);sf.Close();UpdateData(FALSE);}void CIndircLelveDlg::OnBnClickedComputelevel(){// TODO: 在此添加控件告知解决程序代码UpdateData(TRUE);setlocale(LC_ALL,"");double *Qx=new double[LevelComput.m_iUnknownPointCount];double r0;pAdjust(r0,Qx);LevleContent.Format(_T("平差后高程值:\r\n"));CString Temp;for(int i=0;i<LevelComput.m_iUnknownPointCount;i++){Temp.Empty();Temp.Format(_T("%s,%.4f\r\n"),LevelComput.m_pUnknownPoint[i].strID,LevelComput.m_pUnknownPoint[i].H);LevleContent+=Temp;}Temp.Format(_T("单位权中误差: %.1f mm\r\n"),r0*1000);LevleContent+=Temp;LevleContent+=_T("未知点高程中误差(mm):\r\n");for(int i=0;i< LevelComput.m_iUnknownPointCount;i++){Temp.Empty();Temp.Format(_T("%s,%.1f\r\n"),LevelComput.m_pUnknownPoint[i].strName,Qx[i]*1000);LevleContent+=Temp;}UpdateData(false);}void CIndircLelveDlg::OnBnClickedSavelevleresult(){// TODO: 在此添加控件告知解决程序代码UpdateData(TRUE);CFileDialog dlgFile(FALSE,_T("txt"),NULL,OFN_EXPLORER,_T("(Level格式)|*.txt"));if(dlgFile.DoModal()==IDCANCEL) return;CString strFileName=dlgFile.GetPathName();setlocale(LC_ALL,"");CStdioFile sf;if(!sf.Open(strFileName, CFile::modeCreate|CFile::modeWrite)) return;sf.WriteString(LevleContent);sf.Close();UpdateData(FALSE);}三、实验成果打开文献数据:平差成果:四、实验心得这从实验是我们测绘程序设计旳最后一次实验, 虽然这个学期我们做了好几次有关旳实验, 但是我却发现自己学旳东西也越来越模糊, 感觉诸多内容都不理解。
VB语言在编写水准测量程序中的应用

VB语言在编写水准测量程序中的应用
王强;胡铁石
【期刊名称】《测绘与空间地理信息》
【年(卷),期】2009(32)6
【摘要】介绍了Microsoft公司的VisualBasic6.0在编写水准测量程序中的实践方法.通过对尝试编写的水准测量程序的实践分析,证明了用计算机语言编写程序可以解决水准测量中出现的实际问题并有效降低野外工作量.该实证研究为用计算机语言编写各种测量程序解决实际问题积累了有益经验.
【总页数】3页(P177-179)
【作者】王强;胡铁石
【作者单位】辽宁省地矿测绘院,辽宁,沈阳,110121;辽宁省地矿测绘院,辽宁,沈阳,110121
【正文语种】中文
【中图分类】P224.1
【相关文献】
1.浅述显微硬度自动测量程序在金相试验中的应用 [J], 李慧;邢建伟;张敬彤
2.StatisPro软件简介及其在定量测量程序线性评价中的应用 [J], 石大伟;沈舒;周海卫;张春涛
3.参考测量程序在血清肌酐测定正确度验证中的应用 [J], 张天娇;张传宝;陈文祥;刘向祎;文江平;郭拥军
4.基于掌上电脑水准测量程序的开发应用 [J], 章烈屏;陶武亮;方智;余德华
5.CLSI EP06-Ed2与EP06-A在定量测量程序线性验证应用中的差异 [J], 谢轩波;刘洋洋;单汉明;李晓博
因版权原因,仅展示原文概要,查看原文内容请购买。
水平控制网平差软件的开发过程

水平控制网平差软件的开发过程作者:许瀚卿王贵文来源:《山东工业技术》2015年第10期摘要:本文依据水平网平差的一些基本原理,使用Visual C++6.0开发一具有拓扑关系的水平网平差软件,并重点探讨了水平网平差软件中的开发过程。
此软件功能齐全,可以用于侧边网和测角网的平差计算,也可用于边角网的平差计算,还具有精度计算的功能,满足常见水平网平差的工作。
关键词:平差软件;水平控制网;开发过程1 引言水平控制网网形灵活多变,在实际测量中应用非常广泛。
传统平差计算方法已经无法满足当前任务的需要,当前任务数据量大、计算量大且复杂、平差网型存在不确定性、控制网整体规模较大,因此,必须利用计算机进行平差解算。
目前而言,大多数的控制网平差软件使用方便,功能齐全,精度较高,但在某些方面还是不够理想。
例如:在图形关系上,没有确定的拓扑关系;在数据输入上,不是很美观,也不方便编辑;在成果显示上,计算结果是否可靠很难检查。
笔者借助软件工程的开发理论,结合拓扑学的方法,设计并开发一套具有拓扑关系的水平网平差软件。
水平网平差软件以一种图形属性交互的方式供用户使用,比较方便的完成输入、数据平差、成果报告等过程,在一定程度上,改善了上述的不足。
2 平差软件计算的特点平差软件的出现,很大程度上解放了人的双手,相对于传统的手工计算,平差软件具有以下特点:操作便捷、数据处理速度快、计算结果精度高、成果报告整齐美观。
此外,对比起手工平差计算,平差软件还有独特的优点,可以根据任务的不同选择不同的平差方法,实现了自动化处理。
如:必要观测数t大于多余观测数r时,条件平差可以很好的计算;如果必要观测数t小于多余观测数r时,就应该采用间接平差,因为这种情况下,间接平差可以大幅的减少平差计算量。
现代计算机科学高速发展,计算快速且高效,因此,平差方法的计算机实现成为关注的焦点,更加注重平差方法的内在逻辑性。
3 水平网平差软件的开发过程3.1 基本流程(1)利用计算机数组存储站上读取的坐标和各类观测数据,方便调用;(2)观测数据建立法方程。
测量平差编程

测量平差编程(总27页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--误差理论与测量平差上机指导书辽宁工程技术大学测绘与地理科学学院测绘工程系目录Visual C++ 开发平台简介 .......................................................错误!未定义书签。
MFC概述 ...............................................................................错误!未定义书签。
实验1 矩阵加法与乘法运算 ..................................................错误!未定义书签。
实验2 矩阵转置与求逆运算 ..................................................错误!未定义书签。
实验3 误差椭圆元素计算......................................................错误!未定义书签。
实验4 水准网间接平差程序设计 ..........................................错误!未定义书签。
Visual C++ 开发平台简介Visual C++提供了一个支持可视化编程的集成开发环境:Visual Studio(又名Developer Studio)。
Developer Studio是一个通用的应用程序集成开发环境,它不仅支持Visual C++,还支持Visual Basic,VisualJ++,Visual InterDev等Microsoft系列开发工具。
Developer Studio包含了一个文本编辑器、资源编辑器、工程编译工具、一个增量连接器、源代码浏览器、集成调试工具,以及一套联机文档。
三四等水准测量平差软件V1.6使用说明

《三、四等水准测量平差计算程序 V1.6》使用说明本程序编写目的为本人的水准平差计算,升级到 V1.4后,有数年未有升级,于近日打算做最后一次升级,以后将不会再升级了。
由于本人编程能力有限,使用的国产编程语言编写的程序,均被360杀毒软件误报。
若是介意,请不要下载使用。
本人也没有能力去编写 病毒木马。
为了安全期间,请从本人QQ(QQ:389505708 了李李-测量)空间提供的下载地址下载,若是从其他地方下载,本人不能保证程序中会不会被有心之人加入病毒木马之类。
本程序特点如下:1.绿色版,无需安装,打开即用。
2.完全按照 测量 教材中的表格编写,计算方法也同书上一样,进位采用“四舍五入”、“单进双不进”进位方法。
3.计算完成后,方便 继续进行 平差易 报告的平差。
4.说明很是详细,可以教新手在不影响最终成果的原则下完成一些数据的修改,以达到规范要求。
一.使用步骤1.起始数据填写。
打开软件后,会是这样的一个界面,这时需要填写起始数据。
例如:我的数据如下:线路共有 34站,起点点号为III-2,高程为33.048m,终点点号为III-3,高程为 16.798m,中间有 7 个加密水准点,按四等水准要求测量,起点后尺为 4687。
则填写如下:起始红黑尺常数:选择为 4687.起始水准点高程:起点III-2 的高程:33.048设计水准闭合差:(终点III-3的高程(m) - 起点III-2的高程(m))*1000=(16.798-33.048)*1000= -16.250*1000= -16250mm此次线路为附合水准线路,若是闭合水准线路,则设计水准闭合差:为 0.总测站数:总共测了 34 站。
水准等级:此次按四等水准,所以先择四等水准。
然后点击确定。
2.测量数据填写在点击确定后,界面是这样的:按照输入的起始数据,共有 34个测站。
表格样式完全是照着测量数的教材编制,附带一个EXCEL 版的表格,两者完全一样。
测量平差编程

误差理论与测量平差上机指导书辽宁工程技术大学测绘与地理科学学院测绘工程系误差理论与测量平差上机指导书目录Visual C++ 6.0开发平台简介 (4)MFC概述 (4)实验1 矩阵加法与乘法运算 (5)实验2 矩阵转置与求逆运算 (7)实验3 误差椭圆元素计算 (13)实验4 水准网间接平差程序设计 (14)Visual C++ 6.0开发平台简介Visual C++提供了一个支持可视化编程的集成开发环境:Visual Studio(又名Developer Studio)。
Developer Studio是一个通用的应用程序集成开发环境,它不仅支持Visual C++,还支持Visual Basic,Visual J++,Visual InterDev等Microsoft系列开发工具。
Developer Studio包含了一个文本编辑器、资源编辑器、工程编译工具、一个增量连接器、源代码浏览器、集成调试工具,以及一套联机文档。
使用Developer Studio,可以完成创建、调试、修改应用程序等的各种操作。
Developer Studio采用标准的多窗口Windows用户界面,并增加了一些新特性,使得开发环境更易于使用,用户很容易学会它的使用方法。
由于Developer Studio是一个可视化的开发工具,在介绍Developer Studio的各个组成部分之前,首先了解一下可视化编程的概念。
可视化技术是当前发展迅速并引人注目的技术之一,它的特点是把原来抽象的数字、表格、功能逻辑等用直观的图形、图象的形式表现出来。
可视化编程是它的重要应用之一。
所谓可视化编程,就是指:在软件开发过程中,用直观的具有一定含义的图标按钮、图形化的对象取代原来手工的抽象的编辑、运行、浏览操作,软件开发过程表现为鼠标点击按钮和拖放图形化的对象以及指定对象的属性、行为的过程。
这种可视化的编程方法易学易用,而且大大提高了工作效率。
基于VS平台下免像控空中三角测量平差软件设计

基于VS平台下免像控空中三角测量平差软件设计摘要:该论文基于VS平台设计了一款免像控空中三角测量平差软件,旨在提供功能完备、易用且高效的工具。
论文介绍了免像控空中三角测量平差的原理和方法,并概述了VS平台及其特点。
系统需求包括功能和性能需求,并提出了模块化的系统框架设计。
数据处理流程设计包括数据采集、准备和算法实现细节。
用户界面设计涵盖了布局、交互和可视化展示。
系统实现与测试讨论了硬件和软件环境配置,并进行了功能测试和性能评估。
最后总结了工作成果,展望了未来研究方向和技术发展前景。
该软件为免像控空中三角测量平差领域的专业人士和研究者提供可靠且便捷的解决方案。
关键词:免像控空中三角测量、平差软件、VS平台、数据处理、算法实现、用户界面设计、系统测试与评估、结果分析、优化策略。
引言:免像控空中三角测量是一种重要的测量方法,在航空摄影、地理信息系统等领域具有广泛应用。
它通过获取航空图像和对空间点的测量数据,进行三角测量和平差计算,实现精确的地理位置测量和地形建模。
然而,免像控空中三角测量中存在着一系列复杂的数学模型和计算过程,需要高度专业化的软件工具来支持。
随着计算机科学和软件技术的快速发展,基于计算机平台的测绘软件逐渐成为测量工作的重要辅助手段。
其中,VS(Visual Studio)平台作为一种流行且强大的开发环境,提供了丰富的工具和库,为软件设计和开发提供了极大的便利性。
本论文旨在基于VS平台下设计一款免像控空中三角测量平差软件,以满足测量工程师和研究人员的需求。
该软件将提供一套完整的功能模块,涵盖数据处理、算法实现和结果展示等方面。
通过合理的系统设计和优化策略,旨在提高免像控空中三角测量平差的精确性和效率。
1.免像控空中三角测量平差的基本原理和方法:免像控空中三角测量平差是一种基于航空摄影的测量方法,用于获取地球表面上特定点的精确地理位置。
其基本原理是通过获取航空图像和对地面控制点的测量数据,利用三角测量原理计算出待测点的空间坐标,并进行平差处理以提高测量结果的准确性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VB开发水准测量平差软件的方法摘要:本文介绍了应用Visual Basic6.0开发的水准测量平差软件的方法。
通过软件自动生成EXCEL格式的水准测量平差计算表格进行数据处理,快速、准确计算出待求点的高程。
关键词:VB;数据处理;水准测量水准测量平差计算就是对合格的高差予以调整。
将闭合差以相反的符号按与各段水准路线长度(或按测站数)成正比的办法调整到各段高差上,求出改正后的高差再推算高程。
手工计算速度慢、工作效率低,同时易出现计算错误,而Visual Basic6.0是一种简单易学的可视化语言,用其进行编程计算就显得方便灵活。
本文结合作者工作的实践,详细地介绍了用VB开发水准测量平差软件的方法及应用。
1.VB语言的特点(1).面向对象和可视化的程序设计。
(2).事件驱动的运行机制。
(3).结构化的程序设计语言。
(4).多种数据库访问能力。
(5).提供了功能完备的应用程序集成开发环境。
(6).方便使用的联机帮助功能。
2.水准测量平差计算的方法(1).计算高差闭合差fh。
fh=Σh测 -(H终-H始)fh允=±20(按四等水准测量限差)fh≤fh允(合格)fh允—允许闭合差;Σh测—实测的各段高差和;H始—起点高程;H终—终点高程;(2).计算高差改正数Vi。
Σn —总测站数或路线总长度(km);ni —分段测站数或分段路线长度(km);(3).计算改正后高差h改i。
h改i=h测¬ + Vi(4).计算待求点高程Hi。
Hi=Hi-1+ h改i3.软件的开发原理首先在VB中设计了一个固定的界面(图3.1),添加相应功能键及数据输入文本框,通过输入相应的数据,利用VB编程实现自动生成电子表格;通过VB操作电子表格里数据进行平差计算。
根据不同的平差方法,本软件设置按距离进行平差和按测站数进行平差两种计算方法。
图3.1水准测量平差软件界面3.1参数输入方式数据输入设计成两种方式;一种是先建立文本格式(txt)的参数文件,通过编写程序代码实现直接读取数据。
另一种是在生成的平差计算表中输入观测数据。
3.1.1 参数文件的建立方法及各行数据意义参数文件是建立在txt文本中,根据已知条件设置成五行,数据之间用逗号隔开;各行数据的意义:第一行数据表示路线的段数及限差。
第二行数据表示测站点号。
第三行数据表示起点及终点高程。
第四行数据表示每段测站数(按距离平差输入本段路线长度)。
第五行数据表示每段高差。
3.2参数的读取参数的读取是通过在程序模块中添加如下的代码来实现的:Dim p As String, p1 As String, p2 As String, P3 As String, p4 As String’定义变量类型Dim j1 As Integer’定义变量类型Dim sm As String’定义变量类型设置打开读取文本代码sm = IIf(Right(App.Path, 1) = "\", App.Path, App.Path + "\")On Error GoTo nofileCommonDialog1.DialogTitle = "读取数据库文件"CommonDialog1.InitDir = sm + "liti"CommonDialog1.FileName = ""CommonDialog1.Filter = "文本文件(*.txt)|*.txt"CommonDialog1.CancelError = TrueCommonDialog1.ShowOpenDim strFilename As StringstrFilename = CommonDialog1.FileNameOpen strFilename For Input As #1 '打开文件Input #1, istation, bhctxt3.Text = istationTxt4.Text = bhcReDim sdangle(istation + 1) As StringFor I = 1 To istation + 1 '读入点名Input #1, sdangle(I)Next IInput #1, Xa, Ya '读入路线起终算点高程ReDim sAngle(istation) As Double, sEdge(istation) As DoubleFor I = 1 To istation '读入路线长度Input #1, sAngle(I)Next IFor I = 1 To istation '读入高差Input #1, sEdge(I)Next IClose #1 '不要忘记关闭文件nofile:If Err.Number = 32755 ThenExit SubEnd If通过以上代码,我们便轻松快捷的将参数读取到软件里面;为进行下一步平差计算奠定基础。
4.平差计算表格的自动生成平差计算是利用VB程序代码自动生成EXCEL表格,通过操作程序在表里进行数据计算。
4.1实现的方法4.1.1全局变量的设置在程序工程引用中选择“Microsoft Excel 12.0 Object Library”后按“确定”,为保证Excel在整个程序中共享,将其设置为全局变量。
全局变量的实现是在程序模块的顶部添加如下代码:Dim xlApp As Excel.Application '定义EXCEL类Dim xlBook As Excel.Workbook '定义工件簿类Dim xlSheet As Excel.Worksheet '定义工作表类Dim xlsheet1 As Excel.Worksheet'定义工作表类4.1.2平差表格生成代码及步骤(1).设置工作表名称With xlApp.Workbooks.Add '打开工作薄.Visible = True '工作薄设置为可见.Worksheets(1).Name = "水准路线平差计算表" '设置工作表的名称End WithSet xlSheet = xlApp.Worksheets(1)xlApp.Visible = TruexlSheet.Activate(2).设置显示比例ActiveWindow.Zoom = 100(3).指定生成单元格及合并单元格For I = 6 To n * 2 + 8 Step 2For j = 1 To 1xlSheet.Range(xlSheet.Cells(I, j), xlSheet.Cells(I + 1, j)).MergeNext jNext IFor I = 7 To n * 2 + 7 Step 2For j = 2 To 5xlSheet.Range(xlSheet.Cells(I, j), xlSheet.Cells(I + 1, j)).MergeNext jNext IFor I = 6 To n * 2 + 8 Step 2For j = 6 To 7xlSheet.Range(xlSheet.Cells(I, j), xlSheet.Cells(I + 1, j)).MergeNext jNext I(4).为单元格添加线条并设置单元格高度、宽度、颜色及单元格内相关文字 With xlSheet.Range("a4:a5").Merge.Range(xlSheet.Cells(n * 2 + 8, 6), xlSheet.Cells(n * 2 + 8, 7)).Mergep = "a4" + ":g" + Trim(Str(n * 2 + 9)).Range(p).RowHeight = 11.Range(p).Borders.LineStyle = 1p1 = "a" + Trim(Str(n * 2 + 10)) + ":g" + Trim(Str(n * 2 + 12)).Range(p1).RowHeight = 22.Range("B4:G4").Borders(xlEdgeBottom).LineStyle = xlLineStyleNone '无线条p2 = "a4" + ":a" + Trim(Str(n * 2 + 12))P3 = "g4" + ":g" + Trim(Str(n * 2 + 12))p4 = "a" + Trim(Str(n * 2 + 12)) + ":g" + Trim(Str(n * 2 + 12)).Range(p2).Bo rders(1).Weight = 3’宽度设置.Range(P3).Borders(2).Weight = 3.Range("a4:g4").Borders(3).Weight = 3.Range(p4).Borders(4).Weight = 3.Range("A3:g2000").HorizontalAlignment = 3.Range("a3").HorizontalAlignment = 2.Range("f1").HorizontalAlignment = 3.Range(p1).HorizontalAlignment = 1.Range("a1").RowHeight = 25.Range("a2:g5").RowHeight = 20.Columns("A").ColumnWidth = 7.Columns("b:g").ColumnWidth = 12.Range("c1").Font.Size = 15.Range("a2:g2000").Font.Size = 10.Range("c1") = "黑体".Range("c1").Value = "水准路线平差计算表".Range("A3").Value = "工程名称:".Range("f3").Value = "等级:".Range("a4:a5").Value = "点名".Range("b4:g4").Value = Array("距离或测站数", "高差", "改正数", "调整后高差", "调整后高程", "原有高程").Range("b5:g5").Value = Array("(km)或(站)", " (m)", "(mm)", "(m)", "(m)", "(m)") End WithxlSheet.Cells(6, 1) = "BMA"xlSheet.Cells(n * 2 + 6, 1) = "BMB"b = 8For I = 1 To n - 1xlSheet.Cells(b, 1) = Ib = b + 2NextxlSheet.Cells(n * 2 + 8, 1) = "∑"(5).设置打印预览功能及设置页边距(括号中的数字为距离),分别是左、右、上、下边距With xlApp.ActiveSheet.PageSetup.LeftMargin = xlApp.InchesToPoints(0.3).RightMargin = xlApp.InchesToPoints(0.3).TopMargin = xlApp.InchesToPoints(0.8).BottomMargin = xlApp.InchesToPoints(1).CenterHorizontally = True '打印页面是否水平.CenterVertically = False '是否垂直居中.Orientation = 1 '设置打印方向:1为纵向打印,2为横向打印.PaperSize = 9 '设置打印纸的类型,例如A3为8,A4为9.PrintTitleRows = Range("a1:g5").Address.CenterFooter = "计算:" & Space(35) & "复核:" & vbCrLf & "监理:" & Space(35) & "日期:" & vbCrLf & "&10第 &P 页 " '共 " & j1 & " 页 "End WithCommand4.Enabled = TrueCommand3.Enabled = TrueCommand2.Enabled = False以上工作完成后,我们便可以生成一张水准路线平差计算表,通过导入或输入数据便可进行下一步工作。