空间直角坐标系与空间大地坐标系地相互转换及其C++源程序的.docx

上传人:b****2 文档编号:18607076 上传时间:2023-08-20 格式:DOCX 页数:10 大小:121.49KB
下载 相关 举报
空间直角坐标系与空间大地坐标系地相互转换及其C++源程序的.docx_第1页
第1页 / 共10页
空间直角坐标系与空间大地坐标系地相互转换及其C++源程序的.docx_第2页
第2页 / 共10页
空间直角坐标系与空间大地坐标系地相互转换及其C++源程序的.docx_第3页
第3页 / 共10页
空间直角坐标系与空间大地坐标系地相互转换及其C++源程序的.docx_第4页
第4页 / 共10页
空间直角坐标系与空间大地坐标系地相互转换及其C++源程序的.docx_第5页
第5页 / 共10页
空间直角坐标系与空间大地坐标系地相互转换及其C++源程序的.docx_第6页
第6页 / 共10页
空间直角坐标系与空间大地坐标系地相互转换及其C++源程序的.docx_第7页
第7页 / 共10页
空间直角坐标系与空间大地坐标系地相互转换及其C++源程序的.docx_第8页
第8页 / 共10页
空间直角坐标系与空间大地坐标系地相互转换及其C++源程序的.docx_第9页
第9页 / 共10页
空间直角坐标系与空间大地坐标系地相互转换及其C++源程序的.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

空间直角坐标系与空间大地坐标系地相互转换及其C++源程序的.docx

《空间直角坐标系与空间大地坐标系地相互转换及其C++源程序的.docx》由会员分享,可在线阅读,更多相关《空间直角坐标系与空间大地坐标系地相互转换及其C++源程序的.docx(10页珍藏版)》请在冰点文库上搜索。

空间直角坐标系与空间大地坐标系地相互转换及其C++源程序的.docx

空间直角坐标系与空间大地坐标系地相互转换及其C++源程序的

空间直角坐标系与空间大地坐标系的相互转换

 

坐标轴相互正交的坐标系被称作笛卡尔坐标系。

三维笛卡尔坐标系也被称为空间直角坐标系。

在空间直角坐标系下,点的坐标可以用该点所对应的矢径在三个坐标轴上的投影长度来表示,只有确定了原地、三个坐标轴的指向和尺度,就定义了一个在三维空间描述点的位置的空间直角坐标系。

以椭球体中心O为原点,起始子午面与赤道面交线为X轴,在赤道面上与X轴正交的方向为Y轴,椭球体的旋转轴为Z轴构成右手坐标系O.XYZ,在该坐标系中,P点的位置用X,Y,Z表示。

在测量应用中,常将地球空间直角坐标系的坐标原点选在地球质心〔地心坐标系〕或参考椭球中心〔参心坐标系〕,z轴指向地球北极,x轴指向起始子午面与地球赤道的交点,y轴垂直于XOZ面并构成右手坐标系。

 

空间直角坐标系

由于空间直角坐标无法明确反映出点与地球之间的空间关系,为了解决这一问题,在测量中引入了大地基准,并据此定义了大地坐标系。

大地基准指的是用于定义地球参考椭球的一系列参数,包括如下常量:

2.2椭球的短半轴的指向:

通常与地球的平自转轴平息。

2.3椭球中心的位置:

根据需要确定。

假如为地心椭球,如此其中心位于地球质心。

2.4本初子午线:

通过固定平极和经度原点的天文子午线,通常为格林尼治子午线。

以大地基准为根底建立的坐标系被称为大地坐标系。

由于大地基准又以参考椭球为基准,因此,大地坐标系又被称为椭球坐标系。

大地坐标系是参心坐标系,其坐标原点位于参考椭球中心,以参考椭球面为基准面,用大地经度L、纬度B和大地高H表示地面点位置。

过地面点P的子午面与起始子午面间的夹角叫P点的大地经度。

由起始子午面起算,向东为正,叫东经〔0°~180°〕,向西为负,叫西经〔0°~-180°〕。

过P点的椭球法线与赤道面的夹角叫P点的大地纬度。

由赤道面起算,向北为正,叫北纬〔0°~90°〕,向南为负,叫南纬〔0°~-90°〕。

从地面点P沿椭球法线到椭球面的距离叫大地高。

大地坐标坐标系中,P点的位置用L,B表示。

如果点不在椭球面上,表示点的位置除L,B外,还要附加另一参数——大地高H。

 

空间大地坐标系

 

将同一坐标系下的大地坐标(B、L、H)转换成空间直角坐标(X、Y、Z)的转换公式为:

 

式中N为卯酉圈的半径,a为参考椭球的长半轴;b为参考椭球的短半轴;e为参考椭球的第一偏心率;并且有

 

假如点在椭球面上,如此大地高H=0,上式可简化为:

 

将同一坐标系下的空间直角坐标〔X、Y、Z〕转换为空间大地坐标〔B、L、H〕的公式为:

 

在使用上式进展空间直角坐标到大地坐标的转换过程中,由于计算大地纬度口时用到大地高Ⅳ,而计算大地高时又需要用到大地纬度口.因此不能直接由空间直角坐标计算出大地坐标,而需要采用迭代计算的方法。

具体计算时,可先根据下式求出大地纬度口的初值:

 

然后利用该初值来求出H、N的初值,再利用所求出的H和N初值再次求出B值.如此反复,直至求出的与日、Ⅳ收敛为止。

本文根据以上公式在MicrosoftVC++6.0环境下编写了一段程序〔见附录〕。

算例中的坐标采用的是某某大学信息学部友谊广场上的某点的大地坐标作为值,然后经过转换函数CRDGEODETICtoCRDCARTESEAN(pcg,pcc,dSemiMajorAxis,dFlatning)把大地坐标转换为空间直角坐标得到坐标X、Y、Z。

由得到的空间直角坐标X、Y、Z,经过转换函数CRDCARTESIANtoCRDGEODETIC(pcc,pcg,dSemiMajorAxis,dFlatning)把空间直角坐标复原成空间大地坐标,计算结果如如下图所示:

 

计算结果

从上图可以看出结果比拟满意,高程和精度根本能完全复原,而纬度复原后有较大的误差,在测量中这种误差不允许的,需要修改算法,完善结果。

可能引起的原因有可能是由于纬度计算公式并不完善,还有可能是由于计算机的截断误差引起的,还要找时间继续修改、完善。

这次编程自认为很简单,但真动手自己亲自编写,还是或多或少遇到了一些问题,并分析问题,最终解决问题。

虽然这次作业很简单,但经过自己这样一步一步的编写出来,还是有很多收获,加强了运用VC++编写程序的能力,也充分认识到了学习VC++的重要性,更找到了自己的一些缺点与不足。

 

6.附录〔程序源代码〕

#include

#include

usingnamespacestd;

typedefstructtagCRDCARTESIAN

{

doublex;

doubley;

doublez;

}CRDCARTESIAN;

typedefCRDCARTESIAN*PCRDCARTESIAN;

typedefstructtagCRDGEODETIC

{

doublelongitude;

doublelatitude;

doubleheight;

}CRDGEODETIC;

typedefCRDGEODETIC*PCRDGEODETIC;

voidDMS_RAD(doubleDMS,double*Rad)

{

intDeg,Min;

doubleSec;

Deg=(int)DMS;

Min=(int)((DMS-Deg)*100);

Sec=((DMS-Deg)*100-Min)*100;

*Rad=(Deg+Min/60.0+Sec/3600.0)/180.0*M_PI;

return;

}

voidRAD_DMS(doubleRad,double*DMS)

{

intDeg,Min;

doubleSec;

doubleAR,AM;

AR=Rad;

if(Rad<0)

AR=-Rad;

AR=AR+1.0e-10;

AR=AR*180.0/M_PI;

Deg=(int)AR;

AM=(AR-Deg)*60.0;

Min=(int)AM;

Sec=(AM-Min)*60;

*DMS=Deg+Min/100.0+Sec/10000.0;

if(Rad<0)

*DMS=-*DMS;

return;

}

boolCRDCARTESIANtoCRDGEODETIC(PCRDCARTESIANpcc,PCRDGEODETICpcg,doubledSemiMajorAxis,doubledFlattening)

{

doubleB0,R,N;

doubleB_,L_;

doubleX=pcc->x;

doubleY=pcc->y;

doubleZ=pcc->z;

R=sqrt(X*X+Y*Y);

B0=atan2(Z,R);

while

(1)

{

N=dSemiMajorAxis/sqrt(1.0-dFlattening*(2-dFlattening)*sin(B0)*sin(B0));

B_=atan2(Z+N*dFlattening*(2-dFlattening)*sin(B0),R);

if(fabs(B_-B0)<1.0e-10)

break;

B0=B_;

}

L_=atan2(Y,X);

pcg->height=R/cos(B_)-N;

RAD_DMS(B_,&pcg->latitude);

RAD_DMS(L_,&pcg->longitude);

returntrue;

}

boolCRDGEODETICtoCRDCARTESEAN(PCRDGEODETICpcg,PCRDCARTESIANpcc,doubledSemiMajorAxis,doubledFlattening)

{

doubleN;

doubleB_,L_;

doubleB=pcg->latitude;

doubleL=pcg->longitude;

doubleH=pcg->height;

DMS_RAD(B,&B_);

DMS_RAD(L,&L_);

N=dSemiMajorAxis/sqrt(1.0-dFlattening*(2-dFlattening)*sin(B_)*sin(B_));

pcc->x=(N+H)*cos(B_)*cos(L_);

pcc->y=(N+H)*cos(B_)*sin(L_);

pcc->z=(N*(1.0-dFlattening*(2-dFlattening))+H)*sin(B_);

returntrue;

}

voidmain()

{

PCRDCARTESIANpcc=newCRDCARTESIAN;

PCRDGEODETICpcg=newCRDGEODETIC;

//B=30.31.40.23L=114.21.20.51h=41

doublerad;

rad=(30*3600+31*60+40.23)/3600;

pcg->latitude=rad;

rad=(114*3600+21*60+20.51)/3600;

pcg->height=41;

pcg->longitude=rad;

doubledSemiMajorAxis=6378137;

doubledFlatning=1/298.257223563;

cout<

:

fixed;

cout<<"转换前的大地坐标:

"<

cout<<"H(高度)="<height<<""<<"L(经度)="<longitude<<""<<"B(纬度)="<latitude<

CRDGEODETICtoCRDCARTESEAN(pcg,pcc,dSemiMajorAxis,dFlatning);

cout<

cout<<"转换后的空间直角坐标:

";

cout<<"x="<x<<""<<"y="<y<<""<<"z="<z<<""<

 

CRDCARTESIANtoCRDGEODETIC(pcc,pcg,dSemiMajorAxis,dFlatning);

cout<

cout<<"由转换后的空间直角坐标x,y,z复原成大地坐标:

"<

cout<<"H(高度)="<height<<""<<"L(经度)="<longitude<<""<<"B(纬度)="<latitude<

cout<

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2