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

📄 satcoorddoc.cpp

📁 gps 卫星位置的计算
💻 CPP
字号:
// SatCoordDoc.cpp : implementation of the CSatCoordDoc class
//

#include "stdafx.h"
#include "SatCoord.h"

#include "SatCoordView.h"
#include "SatCoordDoc.h"
#include "coordtrans.h"



#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSatCoordDoc

IMPLEMENT_DYNCREATE(CSatCoordDoc, CDocument)

BEGIN_MESSAGE_MAP(CSatCoordDoc, CDocument)
	//{{AFX_MSG_MAP(CSatCoordDoc)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_COMMAND(ID_COOR_CAL, OnCoorCal)
	ON_COMMAND(ID_COOR_NSAT, OnCoorNsat)
	ON_COMMAND(ID_COOR_CLO, OnCoorClo)
	ON_COMMAND(ID_COOR_GSAT, OnCoorGsat)
	ON_COMMAND(ID_WGS_BJ54, OnWgsBj54)
	ON_COMMAND(ID_PZ90_WGS, OnPz90Wgs)
	ON_COMMAND(ID_COOR_RSP3, OnCoorRsp3)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSatCoordDoc construction/destruction



CSatCoordDoc::CSatCoordDoc()
{
	// TODO: add one-time construction code here
	Count	=	0;
}

CSatCoordDoc::~CSatCoordDoc()
{
}

BOOL CSatCoordDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CSatCoordDoc serialization

void CSatCoordDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

/////////////////////////////////////////////////////////////////////////////
// CSatCoordDoc diagnostics

#ifdef _DEBUG
void CSatCoordDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CSatCoordDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CSatCoordDoc commands

void CSatCoordDoc::OnFileOpen() 
{
	
}

void CSatCoordDoc::OnCoorCal() 
{
	// TODO: Add your command handler code here
	FILE* fp;

	// TODO: Add your command handler code here
	CString szFilter = "Data Files (*.??N)|*.??N|All Files (*.*)|*.*||";
	CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
	if( dlg.DoModal() == IDOK )
	{
		fp =fopen(dlg.GetPathName(), "r");
		m_ron.Read_N_Header( fp );
		m_ron.Read_N_Data(fp,Data,ephemeris,m_ron.m_DIM);

	}
}

void CSatCoordDoc::OnCoorNsat() 
{
	// TODO: Add your command handler code here

	FILE* fp;
	FILE* fp_checkEpheinfo1;
	FILE* fp_svpos;
	fp_checkEpheinfo1=fopen("N_CheckEphinfo1.txt","w");
	fp_svpos=fopen("N_svpos.txt","w");

	// TODO: Add your command handler code here
	CString szFilter = "Data Files (*.??N)|*.??N|All Files (*.*)|*.*||";
	CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
	if( dlg.DoModal() == IDOK )
	{
		fp =fopen(dlg.GetPathName(), "r");
		m_ron.Read_N_Header( fp );
		m_ron.Read_N_Data(fp,Data,ephemeris,m_ron.m_DIM);
	}
	
			
		svposx = new double[m_ron.m_DIM];
	
		svposy = new double[m_ron.m_DIM];

		svposz = new double[m_ron.m_DIM];

		Count = m_ron.m_DIM;
	for(int i=0;i<m_ron.m_DIM;i++)
	{
		ephemeris.PRN  = int(Data[i*36+ 0]);//unsigned short  PRN/Satellite PRN number
		if(Data[i*36+ 1]>=50)         //int year;
		{
			ephemeris.year = 1900+int(Data[i*36+ 1]);
		}
		else if(int(Data[i*36+ 1])>=0
			         &&int(Data[i*36+ 1])<50)
		{
			ephemeris.year = 2000+int(Data[i*36+ 1]);
		}
		ephemeris.month = int(Data[i*36+ 2]);//int month;
		ephemeris.day   = int(Data[i*36+ 3]);//int day;
		ephemeris.hour  = int(Data[i*36+ 4]);//int hour;
		ephemeris.minute= int(Data[i*36+ 5]);//int minute;
		ephemeris.second= int(Data[i*36+ 6]);//double second;
		ephemeris.a0   = Data[i*36+ 7];//double af0;//SV_clock_bias;
		ephemeris.a1   = Data[i*36+ 8];//double af1;//SV_clock_drift;//(sec/sec)
		ephemeris.a2   = Data[i*36+ 9];//double af2;//SV_clock_drift_rate;//(sec/sec2)

		fprintf(fp_checkEpheinfo1,"%2d %d %2d %2d %2d %2d %f %20.11e %20.11e %20.11e\n",
					ephemeris.PRN,ephemeris.year,ephemeris.month,ephemeris.day,ephemeris.hour,
					ephemeris.minute,ephemeris.second,ephemeris.a0,ephemeris.a1,ephemeris.a2);

		//ORBIT 1:
		ephemeris.IODE    = Data[i*36+ 10];//double IODE;//Issue of Data, Ephemeris
		ephemeris.Crs     = Data[i*36+ 11];//double Crs;//(meters)
		ephemeris.Delta_n = Data[i*36+ 12];//double Delta_n;//(radians/sec)
	    ephemeris.M0      = Data[i*36+ 13];//double M0;//(radians)
		
		fprintf(fp_checkEpheinfo1,"  \t%20.11e %20.11e %20.11e %20.11e\n",
			        ephemeris.IODE,ephemeris.Crs,ephemeris.Delta_n,ephemeris.M0);
		
		//ORBIT 2:
		ephemeris.Cuc       = Data[i*36+ 14];//double Cuc;//(radians) 
		ephemeris.e         = Data[i*36+ 15];//double e;//Eccentricity
		ephemeris.Cus       = Data[i*36+ 16];//double Cus;//(radians)
		ephemeris.sqrt_of_A = Data[i*36+ 17];//double sqrt_of_A;//(sqrt(m))
		
		fprintf(fp_checkEpheinfo1,"  \t%20.11e %20.11e %20.11e %20.11e\n",
			        ephemeris.Cuc,ephemeris.e,ephemeris.Cus,ephemeris.sqrt_of_A);
	
		//ORBIT 3:
		ephemeris.Toe   = Data[i*36+ 18];//double Toe;//Time of Ephemeris,(sec of GPS week)
		ephemeris.Cic   = Data[i*36+ 19];//double Cic;//(radians)
		ephemeris.OMEGA0 = Data[i*36+ 20];//double OMEGA;//(radians)
		ephemeris.CIS   = Data[i*36+ 21];//double CIS;//(radians)

		fprintf(fp_checkEpheinfo1,"  \t%20.11e %20.11e %20.11e %20.11e\n",
			        ephemeris.Toe,ephemeris.Cic,ephemeris.OMEGA0,ephemeris.CIS);

		//ORBIT 4:
		ephemeris.i0        = Data[i*36+ 22];//double i0;//(radians)	
		ephemeris.Crc       = Data[i*36+ 23];//double Crc;//(meters)
		ephemeris.omega     = Data[i*36+ 24];//double omega;//(radians)
		ephemeris.OMEGA_DOT = Data[i*36+ 25];//double OMEGA_DOT;//(radians/sec)
	
		fprintf(fp_checkEpheinfo1,"  \t%20.11e %20.11e %20.11e %20.11e\n",
			        ephemeris.i0,ephemeris.Crc,ephemeris.omega,ephemeris.OMEGA_DOT);
	
		//ORBIT 5:
		ephemeris.I_DOT                 = Data[i*36+ 26];//double IDOT;//(radians/sec)
		ephemeris.Codes_on_L2			= Data[i*36+ 27];//int Codes_on_L2_channel;
		ephemeris.GPS_week				= Data[i*36+ 28];//int GPS_Week_go_with_TOE;
		ephemeris.L2_pdata_flag			= Data[i*36+ 29];//int L2_P_data_flag;

		fprintf(fp_checkEpheinfo1,"  \t%20.11e %20.11e %20.11e %20.11e\n",
			        ephemeris.I_DOT,ephemeris.Codes_on_L2,
					ephemeris.GPS_week,ephemeris.L2_pdata_flag);
	
		//ORBIT 6:
		ephemeris.SV_accuracy = Data[i*36+ 30];//double SV_accuracy;//(meters)
		ephemeris.SV_health   = Data[i*36+ 31];//int SV_health;
		ephemeris.TGD         = Data[i*36+ 32];//double TGD;//(seconds)
		ephemeris.IODC        = Data[i*36+ 33];//double IODC;//Issue of Data, Clock
	
		fprintf(fp_checkEpheinfo1,"  \t%20.11e %20.11e %20.11e %20.11e\n",
			        ephemeris.SV_accuracy,ephemeris.SV_health,ephemeris.TGD,ephemeris.IODC);

		//ORBIT 7:
		ephemeris.Transtime = Data[i*36+ 34];
	        //double Transmission_time_of_message;//(sec of GPS week, derived e.g.from Z-count in Hand Over Word (HOW)
		ephemeris.Fit_Interval = Data[i*36+ 35];
	
		fprintf(fp_checkEpheinfo1,"  \t%20.11e %20.11e\n",
			        ephemeris.Transtime,ephemeris.Fit_Interval);
	
		double obs_week, obs_gpstime;
		obs_week = m_ron.GetGPSTime( ephemeris.year,
			            ephemeris.month, ephemeris.day,ephemeris.hour,
						ephemeris.minute,ephemeris.second,&obs_gpstime);
		m_ron.Cal_Sate_Coord(ephemeris,obs_gpstime, svpos);

        svposx[i] = svpos[0];
		svposy[i] = svpos[1];
		svposz[i] = svpos[2];
		
		fprintf(fp_svpos,"%25f%25f%25f\n",svpos[0],svpos[1],svpos[2]);
		
	}

	fclose(fp_checkEpheinfo1);												  ///
	fclose(fp_svpos);
	//fp_resultFileData=fopen("N_SateCoordCheck.txt","w");/////////////////
	//将所有导航星历文件的数据春处在 N_DataResultCheck.txt 中////////////
	//kaiguan=0;													  ///
	//m_Read.SaveAllNaviData(fp_resultFileData,Data,m_Read.m_DIM,0);	  ///
	//fclose(fp_resultFileData);///////////////////////////////////////////

}

void CSatCoordDoc::OnCoorClo() 
{
	FILE* fp;

	// TODO: Add your command handler code here
	CString szFilter = "Data Files (*.??G)|*.??G|All Files (*.*)|*.*||";
	CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
	if( dlg.DoModal() == IDOK )
	{
		fp =fopen(dlg.GetPathName(), "r");
		m_ron.Read_G_Header( fp );
		m_ron.Read_G_Data(fp,Data,gephemeris,m_ron.m_DIM);

	}
	
}

void CSatCoordDoc::OnCoorGsat() 
{
	// TODO: Add your command handler code here
	
}



void CSatCoordDoc::OnWgsBj54() 
{
	// TODO: Add your command handler code here
    FILE* fp_temp;
	FILE* fp_read;

	fp_temp=fopen("WGS_BJ54_Trans.txt","w");

	int	i=0,j;
	char	szBuf[256];
//	double	svpos[3];
	CString strFilename;
	CString szFilter = "Data Files (*svpos.txt)|*svpos.txt|All Files (*.*)|*.*||";
	CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
	if (dlg.DoModal() == IDOK)
	{
		strFilename = dlg.GetPathName();
//		return;
	}
    COORDINATECARTESIAN cartesian1;
	COORDINATECARTESIAN cartesian2;
	fp_read=fopen(strFilename,"r");
	fgetpos(fp_read,&pos);
	
	while (!feof (fp_read)) 
	{
		fgets (szBuf, MAX_BUF, fp_read);
		if(feof (fp_read))
			break;
		i++;
	}
//	matrix	a(k,36);
	fsetpos(fp_read,&pos);

	svposx = new double[i];
	svposy = new double[i];
	svposz = new double[i];


	for(j = 0;j < i;j++)
	{	
		fgets(szBuf,128,fp_read);
		sscanf(szBuf, "%lf %lf %lf",&svpos[0],&svpos[1],&svpos[2]);
		cartesian2.dX = svpos[0];
		cartesian2.dY = svpos[1];
		cartesian2.dZ = svpos[2];
		m_trans.WGStoBJ54(cartesian2, &cartesian1);
		svposx[j] = cartesian1.dX;
		svposy[j] = cartesian1.dY;
		svposz[j] = cartesian1.dZ;
		fprintf(fp_temp,"%25lf%25lf%25lf\n",cartesian1.dX,cartesian1.dY,cartesian1.dZ);

	}

	fclose(fp_temp);
	fclose(fp_read);
}

///////////////////////////////////////////////////////////////////////////
//                       PZ90坐标转WGS84坐标                             //
//                                                                       //
///////////////////////////////////////////////////////////////////////////
void CSatCoordDoc::OnPz90Wgs() 
{
	// TODO: Add your command handler code here
	FILE* fp_temp;
	FILE* fp_read;
	fp_temp=fopen("PZ_WGS_Trans.txt","w");
	
	char	szBuf[128];
//	double	svpos[3];
	CString strFilename;
	CString szFilter = "Data Files (*svpos.txt)|*svpos.txt|All Files (*.*)|*.*||";
	CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
	if (dlg.DoModal() != IDOK)
	{
		return;
	}
    COORDINATECARTESIAN cartesian1;
	COORDINATECARTESIAN cartesian2;
	strFilename = dlg.GetPathName();
	fp_read=fopen(strFilename,"r");
	
	while (!feof (fp_read)) 
	{
		fgets(szBuf,128,fp_read);
		sscanf(szBuf, "%lf %lf %lf",&svpos[0],&svpos[1],&svpos[2]);
		cartesian2.dX = svpos[0];
		cartesian2.dY = svpos[1];
		cartesian2.dZ = svpos[2];
		m_trans.PZ90toWGS(cartesian2, &cartesian1);
		fprintf(fp_temp,"%25lf%25lf%25lf\n",cartesian1.dX,cartesian1.dY,cartesian1.dZ);
    }
	fclose(fp_temp);
	fclose(fp_read);
	
}
///////////////////////////////////////////////////////////////////////////
//                       读取GPS精密星历文件(*.SP3)                      //
//                                                                       //
///////////////////////////////////////////////////////////////////////////
void CSatCoordDoc::OnCoorRsp3() 
{
	// TODO: Add your command handler code here
	FILE* fp;
//	double*	S_data;
	int i,j;
	CString szFilter = "Data Files (*.SP3)|*.SP3|All Files (*.*)|*.*||";
	CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
	if( dlg.DoModal() != IDOK )
	{
		return;
	}
	fp =fopen(dlg.GetPathName(), "r");
	m_ron.m_DIM = m_ron.Get_SP3_Dimension( fp );
	S_data.SetSize(m_ron.m_DIM * 28 * 5 + m_ron.m_DIM * 6);
//	S_data = new double [m_ron.m_DIM * 28 * 5];

	fp =fopen(dlg.GetPathName(), "r");
	m_ron.Read_SP3_Data(fp,S_data,sephemeris,m_ron.m_DIM);

	pSP3TIME	=	new	SP3TIME[m_ron.m_DIM];
	svposx = new double[m_ron.m_DIM * 28];
	svposy = new double[m_ron.m_DIM * 28];
	svposz = new double[m_ron.m_DIM * 28];
	clockbias=new double[m_ron.m_DIM * 28];
	xuhao	= new int[m_ron.m_DIM * 28];

	for(i = 0;i < m_ron.m_DIM;i++)
	{
		pSP3TIME[i].year	= (int)S_data[ i*146];
		pSP3TIME[i].month	= (int)S_data[ i*146 + 1];
		pSP3TIME[i].day		= (int)S_data[ i*146 + 2];
		pSP3TIME[i].hour	= (int)S_data[ i*146 + 3];
		pSP3TIME[i].minute	= (int)S_data[ i*146 + 4];
		pSP3TIME[i].second	= S_data[ i*146 + 5];
		for(j = 0; j < 28;j++)
		{
			xuhao[i * 28 + j]		= (int)S_data[ i*146 + j * 5 + 6];
			svposx[ i*28 + j]		= S_data[ i*146 + j * 5 + 7];
			svposy[ i*28 + j]		= S_data[ i*146 + j * 5 + 8];
			svposz[ i*28 + j]		= S_data[ i*146 + j * 5 + 9];
			clockbias[ i*28 + j]	= S_data[ i*146 + j * 5 + 10];
		}
	}
	Count = m_ron.m_DIM;
}

⌨️ 快捷键说明

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