⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 coordinate.cpp

📁 读取GPS的Rinex观测文件
💻 CPP
字号:
#include "coordinate.h"

void CartesianToGeodetic (PCRDGEODETIC pcg, PCRDCARTESIAN pcc,double dSemiMajorAxis, double dFlattening)//由笛卡尔坐标转换为大地坐标
//pcg:指向所转换出的大地坐标的指针
//pcc:指向待转换的笛卡尔坐标的指针
//dSemiMajorAxis:参考椭球的长半轴
//dFlattening:参考椭球的扁率
{
	double e2=1-pow(1-dFlattening,2);
    if(pcc->x>=0&&pcc->y>=0)
    pcg->longitude=atan(pcc->y/pcc->x);
    if(pcc->x>=0&&pcc->y<0)
    pcg->longitude=atan(pcc->y/pcc->x);
    if(pcc->x<0&&pcc->y>=0)
    pcg->longitude=PI+atan(pcc->y/pcc->x);
    if(pcc->x<0&&pcc->y<0)
    pcg->longitude=-PI+atan(pcc->y/pcc->x);

    double m_d_tan_B=pcc->z/sqrt(pow(pcc->x,2)+pow(pcc->y,2));
    double B_temp;//在迭代式时, 存储纬度的中间变量
    double N;
    pcg->latitude=atan(m_d_tan_B);

do
{
	B_temp=pcg->latitude;
	N=dSemiMajorAxis/sqrt(1-e2*pow(sin(pcg->latitude),2));
	m_d_tan_B=pcc->z/sqrt(pow(pcc->x,2)+pow(pcc->y,2))+
		N*e2*sin(pcg->latitude)/sqrt(pow(pcc->x,2)+pow(pcc->y,2));
	pcg->latitude=atan(m_d_tan_B);
}
while(fabs(pcg->latitude-B_temp)>0.0001);

N=dSemiMajorAxis/sqrt(1-e2*pow(sin(pcg->latitude),2));
pcg->height=sqrt(pow(pcc->x,2)+pow(pcc->y,2))/cos(pcg->latitude)-N;
}
void GeodeticToCartesian (PCRDCARTESIAN pcc, PCRDGEODETIC pcg,double dSemiMajorAxis, double dFlattening)//由大地坐标转换为笛卡尔坐标
//pcc:指向所转换出的笛卡尔坐标的指针
//pcg:指向待转换的大地坐标的指针
//dSemiMajorAxis:参考椭球的长半轴
//dFlattening:参考椭球的扁率
{
	double e2=1-pow(1-dFlattening,2);//第一偏心率的平方
	double N=dSemiMajorAxis/sqrt(1-e2*pow(sin(pcg->latitude),2));
	pcc->x=(N+pcg->height)*cos(pcg->latitude)*cos(pcg->longitude);
	pcc->y=(N+pcg->height)*cos(pcg->latitude)*sin(pcg->longitude);
	pcc->z=(N*(1-e2)+pcg->height)*sin(pcg->latitude);
}

void CartesianToTopocentric (PCRDTOPOCENTRIC pct,PCRDCARTESIAN pcc,PCRDCARTESIAN pccCenter,double dSemiMajorAxis,double dFlattening)
//由笛卡尔坐标转换为站心地平坐标

//pct:指向所转换出的站心地平坐标的指针
//pcc:指向待转换的笛卡尔坐标的指针
//pccCenter:指向站心的笛卡尔坐标的指针
//dSemiMajorAxis:参考椭球的长半轴
//dFlattening:参考椭球的扁率
{
	double delta_X,delta_Y,delta_Z;
	delta_X=pcc->x-pccCenter->x;
	delta_Y=pcc->y-pccCenter->y;
	delta_Z=pcc->z-pccCenter->z;
	PCRDGEODETIC pcg=new CRDGEODETIC;
	CartesianToGeodetic ( pcg,  pccCenter, dSemiMajorAxis,  dFlattening);//(X,Y,Z)->(B,L,H)站心转换
	pct->northing= -sin(pcg->latitude)*cos(pcg->longitude)*delta_X - sin(pcg->latitude)*sin(pcg->longitude)*delta_Y + cos(pcg->latitude)*delta_Z;
	pct->easting = -sin(pcg->longitude)*delta_X + cos(pcg->longitude)*delta_Y;
	pct->upping  =  cos(pcg->latitude)*cos(pcg->longitude)*delta_X + cos(pcg->latitude)*sin(pcg->longitude)*delta_Y + sin(pcg->latitude)*delta_Z;
}

void TopocentricToTopocentricPolar (PCRDTOPOCENTRICPOLAR pctp,PCRDTOPOCENTRIC pct)//由站心地平直角坐标转换为站心地平极坐标
//pct :站心地平  直角坐标    的指针
//pctp:站心地平  极坐标      的指针
{
	pctp->range=sqrt(pow(pct->easting,2)+pow(pct->northing,2)+pow(pct->upping,2));
	pctp->azimuth=atan(pct->easting/pct->northing);
	pctp->elevation=atan(pct->upping/pctp->range);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -