测绘坐标转换类编程.docx
- 文档编号:24694221
- 上传时间:2023-05-31
- 格式:DOCX
- 页数:32
- 大小:163.04KB
测绘坐标转换类编程.docx
《测绘坐标转换类编程.docx》由会员分享,可在线阅读,更多相关《测绘坐标转换类编程.docx(32页珍藏版)》请在冰豆网上搜索。
测绘坐标转换类编程
地球科学与环境工程学院
《测绘编程技术》
程序设计报告书
设计题目:
坐标转换类编程
学号:
姓名:
指导老师:
日期:
2016.11.13
目录
一、需求分析1
1.1设计目的1
1.2设计内容1
1.2.1性能需求1
1.2.2功能需求1
1.3环境需求1
二、详细设计1
2.1坐标转换原理1
2.2坐标转换功能模块流程图2
2.3坐标转换类图设计3
2.4坐标转换类实现代码3
2.5坐标转换类调用方法6
三、界面设计13
3.1界面类型选择13
3.2界面元素组织13
3.3界面与类的交互13
四、测试说明14
4.1测试数据14
4.2测试结果14
五、结论15
附录A四参数实现代码(可附完整的功能类代码)15
附录B七参数实现代码17
参考文献:
(例)20
一、需求分析
1.1设计目的
在测量计算中,常常会涉及不同坐标系统(如北京54坐标系、WGS84坐标系等),因此,坐标转换是一项必不可少的工作,综合运用所学数学和专业相关知识,基于最小二乘原理设计并实现不同坐标系统之间的转换。
1.2设计内容
1.2.1性能需求
无特别需求。
1.2.2功能需求
能够计算坐标转换。
1.3环境需求
本实验需要用到的软硬件环境如下:
ØIBM兼容个人计算机1台
ØXP/WIN7/WIN8操作系统1套
ØVisualStudio2010以上开发环境1套
二、详细设计
2.1坐标转换原理
空间三维坐标之间的转换常采用七参数模型(如布尔莎模型);不同平面直角坐标系之间的转换一般采用四参数模型(如赫尔默特模型)。
七参数法需要至少三个公共点,四参数法需要至少两个公共点,并且对这些点的精度要求很高,否则确定的转换关系精度难以保证,因此,为了确保转换精度及提供必要的检核条件,就要考虑增加参与计算的公共点的数量并利用最小二乘原理做出精度评价。
(1)七参数模型
七参数是三个平移参数,三个旋转参数,一个尺度参数。
模型如下:
式中:
,
,
——平移量,
,
,
——旋转参数,
——尺度变形因子。
上式可以写成:
这时:
令
,
,
则:
根据最小二乘原理:
使
则
,那么所求参数矩阵:
(2)四参数模型
四参数是两个平移参数,一个旋转参数,一个尺度参数。
模型如下:
式中:
,
——平移量,
——旋转角,
——尺度变形因子。
上式可以展开:
这里为了计算方便令
,
则
,矩阵形式:
同上,令
,
,
则:
根据最小二乘原理:
使
则
,那么所求参数矩阵:
使用最小二乘原理求解
的最优解,最后求出
和
2.2坐标转换类图设计
坐标转换类图如图C-1所示
图C-1
2.3坐标转换类实现代码
#definePI3.14159265358979323846
constdoubleEPSILON=1.0E-10;
SurveyCal:
:
SurveyCal(void)
{
}
SurveyCal:
:
~SurveyCal(void)
{
}
//符号函数
intSurveyCal:
:
Sgn(doublevalue)
{
if(value>0)
return1;
else
return-1;
}
//————————————角度之间转化---------------------------
//度分秒转化成度
doubleSurveyCal:
:
DmsToDeg(doubledDms)
{
intiSgn;//存储符号
doubledValue,dTemp;
doubledDegree,dMin,dSec;//存储度分秒
iSgn=Sgn(dDms);//提取符号
dValue=fabs(dDms);
dDegree=floor(dValue);//截取度
dTemp=(dValue-dDegree)*100;
dMin=floor(dTemp);//截取分
dSec=(dTemp-dMin)*100;
doubledDeg=(dDegree+dMin/60+dSec/3600)*iSgn;
returndDeg;
}
//度转化成弧度
doubleSurveyCal:
:
DegToRad(doubledDeg)
{
doubledRad=dDeg/180*PI;
returndRad;
}
//弧度转化度分秒
doubleSurveyCal:
:
RadToDms(doubledRad)
{
//先转化成度
doubledDeg;
dDeg=dRad*180/PI;
//调用度转度分秒函数
doubledDms=DegToDms(dDeg);
returndDms;
}
//度转化成度分秒
doubleSurveyCal:
:
DegToDms(doubledDeg)
{
//用于存放度、分、秒三个值的变量
doubledDegree,dMin,dSec;
doubledValue,dTmp;//临时变量
intiSgn;//存储符号
iSgn=Sgn(dDeg);//获取符号
dValue=fabs(dDeg);
dDegree=floor(dValue);//截取度
dTmp=(dValue-dDegree)*60;//把度的小数部分转化成分
dMin=floor(dTmp);//截取分
dSec=(dTmp-dMin)*60;//把分的小数部分转化成秒
doubledDms=(dDegree+dMin/100+dSec/10000)*iSgn;//合并为度分秒形式
returndDms;
}
//度分秒转化弧度
doubleSurveyCal:
:
DmsToRad(doubledDms)
{
doubledDeg=DmsToDeg(dDms);
doubledRad=dDeg/180*PI;
returndRad;
}
//弧度转化成度
doubleSurveyCal:
:
RadToDeg(doubledRad)
{
doubledDeg=dRad*180/PI;
returndDeg;
}
//————————————————————————————————————
//计算方位角,X—纵坐标,Y—横坐标,返回弧度
doubleSurveyCal:
:
AzimuthCal(doubleX1,doubleY1,doubleX2,doubleY2)
{
doubledx,dy;//坐标增量
dx=X2-X1;
dy=Y2-Y1+EPSILON;//dy不能为零
doubleangle=PI-Sgn(dy)*PI/2-atan(dx/dy);
returnangle;
}
//计算距离
doubleSurveyCal:
:
DistCal(doubleX1,doubleY1,doubleX2,doubleY2)
{
doubledist;
dist=sqrt((X2-X1)*(X2-X1)+(Y2-Y1)*(Y2-Y1));
returndist;
}
//求空间两点的距离
doubleSurveyCal:
:
DistCal(doubleX1,doubleY1,doubleZ1,doubleX2,doubleY2,doubleZ2)
{
doubledist;
dist=sqrt((X2-X1)*(X2-X1)+(Y2-Y1)*(Y2-Y1)+(Z2-Z1)*(Z2-Z1));
returndist;
}
//坐标正算,根据直线的起点坐标、直线的水平距离以及坐标方位角来计算终点的坐标
voidSurveyCal:
:
CoordinateCal(doubleX1,doubleY1,doubledist,doubleAzimuth,double&X2,double&Y2)
{
X2=X1+dist*cos(Azimuth);
Y2=Y1+dist*sin(Azimuth);
}
2.4坐标转换类调用方法
//导入四参数坐标
voidCMFCTransCoorView:
:
On32771()
{
On32773();//清空
CFileDialogdlgOpenFile(TRUE,_T("txt"),NULL,
OFN_FILEMUSTEXIST,_T("(文本文件)|*.txt|(所有文件)|*.*)||"));
if(dlgOpenFile.DoModal()==IDCANCEL)
return;//如果选择取消按钮,则退出
CStringstrPathName=dlgOpenFile.GetPathName();//获取选择的文件的完整路径
CStringstrFileTitle=dlgOpenFile.GetFileTitle();//获取文件名
CStringstrExtName=dlgOpenFile.GetFileExt();//获取文件扩展名
strSaveName=strFileTitle+"_result."+strExtName;//拼接默认输出文件名
CStdioFilesf;//创建文件对象
//以读的形式打开文件,如果打开失败
if(!
sf.Open(strPathName,CFile:
:
modeRead))
{
MessageBox(_T("读取文件出错!
"));
return;
}
CStringstrLine;//存放每一行文本
StringSplitSSplit;
intiSize=0;
intn=0;
while(sf.ReadString(strLine))
{
//分割字符串
SSplit.SetString(strLine,',');
n=SSplit.GetSize();
CString*pstrData=newCString[n];
pstrData=SSplit.GetSplit();//获取子字符串
iSize++;
MConPoint.SetSize(iSize,n);
intindex1=m_list1.GetItemCount();
CStringsno1=_T("");
sno1.Format(_T("%d"),index1+1);
intnR=m_list1.InsertItem(index1,sno1);
intnR2=m_list2.InsertItem(index1,sno1);
for(intj=0;j { MConPoint(iSize-1,j)=_ttof(pstrData[j]);//保存控制点坐标 if(j<2) { m_list1.SetItemText(index1,j+1,pstrData[j]); } else { m_list2.SetItemText(index1,j-1,pstrData[j]); } } } sf.Close(); //UpdateData(FALSE); } //求参数 voidCMFCTransCoorView: : OnBnClickedButton1() { //四参数至少需要2个公共点,七参数至少需要3个公共点 if((MConPoint.Col()! =4&&MConPoint.Row()<2) ||(MConPoint.Col()! =6&&MConPoint.Row()<3)) { MessageBox(_T("输入数据有误! ")); return; } //求七参数 if(MConPoint.Col()==6) { SevenParaComSPC; SPC.SetPoint(MConPoint); pSeven=SPC.GetSenven(); //获取精度 doubleaccuracy=SPC.GetAccuracy(); m_accuracy.Format(_T("%.8f"),accuracy); m_xt.Format(_T("%.8f"),pSeven[0]); m_yt.Format(_T("%.8f"),pSeven[1]); m_zt.Format(_T("%.8f"),pSeven[2]); m_scale.Format(_T("%.8f"),pSeven[3]+1); //弧度转换度分秒 SurveyCalSurCa; doubledGamma=SurCa.RadToDms(pSeven[4]); doubledOmi=SurCa.RadToDms(pSeven[5]); doubledKapa=SurCa.RadToDms(pSeven[6]); m_gamma.Format(_T("%.6f"),dGamma); m_omi.Format(_T("%.6f"),dOmi); m_kapa.Format(_T("%.6f"),dKapa); } //求四参数 if(MConPoint.Col()==4) { FourParaComFPC; FPC.SetPoint(MConPoint); pFour=FPC.GetFour(); //获取精度 doubleaccuracy=FPC.GetAccuracy(); m_accuracy.Format(_T("%.8f"),accuracy); m_xt.Format(_T("%12.8f"),pFour[0]); m_yt.Format(_T("%12.8f"),pFour[1]); m_scale.Format(_T("%12.8f"),pFour[2]); SurveyCalSurCa; doubledGamma=SurCa.RadToDms(pFour[3]);//弧度转换度分秒 m_gamma.Format(_T("%.6f"),dGamma); } UpdateData(FALSE); MessageBox(_T("计算完成! ")); } //导入七参数坐标 voidCMFCTransCoorView: : On32772() { On32773();//清空 CFileDialogdlgOpenFile(TRUE,_T("txt"),NULL, OFN_FILEMUSTEXIST,_T("(文本文件)|*.txt|(所有文件)|*.*)||")); if(dlgOpenFile.DoModal()==IDCANCEL) return;//如果选择取消按钮,则退出 CStringstrPathName=dlgOpenFile.GetPathName();//获取选择的文件的完整路径 CStringstrFileTitle=dlgOpenFile.GetFileTitle();//获取文件名 CStringstrExtName=dlgOpenFile.GetFileExt();//获取文件扩展名 strSaveName=strFileTitle+"_result."+strExtName;//拼接默认输出文件名 CStdioFilesf;//创建文件对象 //以读的形式打开文件,如果打开失败 if(! sf.Open(strPathName,CFile: : modeRead)) { MessageBox(_T("读取文件出错! ")); return; } CStringstrLine;//存放每一行文本 StringSplitSSplit; intn=0; intiSize=0; while(sf.ReadString(strLine)) { //分割字符串 SSplit.SetString(strLine,','); n=SSplit.GetSize(); CString*pstrData=newCString[n]; pstrData=SSplit.GetSplit();//获取子字符串 iSize++; MConPoint.SetSize(iSize,n); intindex1=m_list1.GetItemCount(); CStringsno1=_T(""); sno1.Format(_T("%d"),index1+1); intnR=m_list1.InsertItem(index1,sno1); intnR2=m_list2.InsertItem(index1,sno1); for(intj=0;j { MConPoint(iSize-1,j)=_ttof(pstrData[j]);//保存控制点坐标 if(j<3) { m_list1.SetItemText(index1,j+1,pstrData[j]); } else { m_list2.SetItemText(index1,j-2,pstrData[j]); } } } sf.Close(); //UpdateData(FALSE); } //清零 voidCMFCTransCoorView: : On32773() { m_list1.DeleteAllItems(); m_list2.DeleteAllItems(); m_list3.DeleteAllItems(); m_accuracy=""; m_xt=""; m_yt=""; m_zt=""; m_gamma=""; m_omi=""; m_kapa=""; m_scale=""; UpdateData(FALSE); } //保存参数 voidCMFCTransCoorView: : OnFileSave() { //TODO: 在此添加命令处理程序代码 UpdateData(TRUE); CFileDialogdlgSaveFile(FALSE,_T("txt"),strSaveName, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("(文本文件)|*.txt|(所有文件)|*.*||"));//创建保存文件对话框 if(dlgSaveFile.DoModal()==IDCANCEL)return;//如果选择取消按钮,则退出 CStringstrSavePath=dlgSaveFile.GetPathName();//获取选择的文件的名称 //设置语言环境 setlocale(LC_ALL,""); CStdioFilesw; if(! sw.Open(strSavePath,CFile: : modeCreate|CFile: : modeWrite)) { MessageBox(_T("错误")); return; } CStringstrResult; strResult=_T("平移参数: \r\ndX: ")+m_xt+_T("\r\ndY: ")+m_yt+_T("\r\ndZ: ")+m_zt+ _T("\r\n\r\n旋转参数: \r\ngamma: ")+m_gamma+_T("\r\nOmi: ")+m_omi+_T("\r\nkapa: ")+m_kapa+ _T("\r\n\r\n尺度: \r\nScale: ")+m_scale+_T("\r\n\r\n精度: \r\nAccuracy: ")+m_accuracy; sw.WriteString(strResult); sw.Close(); MessageBox(_T("保存成功! ")); } //转换 voidCMFCTransCoorView: : OnBnClickedButton2() { //TODO: 在此添加控件通知处理程序代码 m_list3.DeleteAllItems();//清空list3 //七参数变换 if(MConPoint.Col()==6) { CMatrixMA(3,3); MA(0,0)=1+pSeven[3]; MA(0,1)=pSeven[6]; MA(0,2)=-pSeven[5]; MA(1,0)=-pSeven[6]; MA(1,1)=1+pSeven[3]; MA(1,2)=pSeven[4]; MA(2,0)=pSeven[5]; MA(2,1)=-pSeven[4]; MA(2,2)=1+pSeven[3]; CMatrixMdx(3,1); Mdx(0,0)=pSeven[0]; Mdx(1,0)=pSeven[1]; Mdx(2,0)=pSeven[2]; for(inti=0;i { CMatrixMX(3,1);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 测绘 坐标 转换 编程