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

📄 coordtranbase.cpp

📁 坐标转换工具 WGS84坐标转换为地方坐标系的程序 以及各种三维坐标系之间的转换
💻 CPP
字号:
// CoordTran.cpp: implementation of the CCoordTran class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include <fstream.h>
#include <math.h>
#include "CoordTranBase.h"

#include "common.h"



//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCoordTranBase::CCoordTranBase()
{
	m_Flag=0;		//默认为54椭球
}

CCoordTranBase::~CCoordTranBase()
{

}

//从数据文件中读取已知数据
//返回所读数据的个数,
//filename:文件名
//flag=1时,为XYZ数据,flag=1时为BLH数据
int CCoordTranBase::ReadFile(CString filename, int flag)
{
	ifstream infile;
	int i=0;
	infile.open(filename,ios::nocreate);
	if(!infile)
	{
		cout<<"Can't Open inputfile"<<endl;
		return 0;
	}

	if(flag==0)
	{
		xyz m_temp;
		for(i=0;!infile.eof();i++)
		{
			infile>>m_temp.x>>m_temp.y>>m_temp.z;
			m_xyz.Add(m_temp);
		}
	}
	else
	{
		blh m_temp;
		for(i=0;!infile.eof();i++)
		{
			infile>>m_temp.b>>m_temp.l>>m_temp.h;
			m_blh.Add(m_temp);
		}
	}

	infile.close();
	return i;
}

int CCoordTranBase::WriteFile(CString filename, int flag)
{
	ofstream outfile;
	int i;

	outfile.open(filename);
	if(!outfile)
	{
		cout<<"Open outfile Error!"<<endl;
		return 0;
	}

	if(flag==0)
	{
		for(i=0;i<m_xyz.GetSize();i++)
		{
			outfile.precision(14);
			outfile<<m_xyz.GetAt(i).x<<"       "<<m_xyz.GetAt(i).y<<"      "<<m_xyz.GetAt(i).z<<endl;
		}
	}
	else
	{
		for(i=0;i<m_blh.GetSize();i++)
		{
			outfile.precision(14);
			outfile<<m_blh.GetAt(i).b<<"        "<<m_blh.GetAt(i).l<<"      "<<m_blh.GetAt(i).h<<endl;
			//outfile<<m_blh.GetAt(i).b<<m_blh.GetAt(i).l<<m_blh.GetAt(i).h<<endl;
		}

	}

	outfile.close();

	return i;

}


void CCoordTranBase::DecToArc(void)
{

	double DecTemp1,DecTemp2,DecTemp3,DecTemp4;
	blh bte;
	
	for(int i=0;i<m_blh.GetSize();i++)
	{
		
		//计算B
		DecTemp1=m_blh.GetAt(i).getb();
		
		//DecTemp3 存放余数部分,DecTemp2 存放整数部分
		DecTemp3=modf(DecTemp1,&DecTemp2);
		DecTemp3=DecTemp3*100;
		DecTemp1=modf(DecTemp3,&DecTemp4);
		
		//计算十进制角度
		DecTemp3=DecTemp2+DecTemp4/60+DecTemp1*100/3600;
		
		//转化成弧度值
		DecTemp3=DecTemp3*PI/180;
	
		bte.b=DecTemp3;
		//m_blh.GetAt(i).setb(DecTemp3);
	
		
		//计算L
		DecTemp1=m_blh.GetAt(i).getl();
		
		//DecTemp3 存放余数部分,DecTemp2 存放整数部分
		DecTemp3=modf(DecTemp1,&DecTemp2);
		DecTemp3=DecTemp3*100;
		DecTemp1=modf(DecTemp3,&DecTemp4);
		
		//计算十进制角度
		DecTemp3=DecTemp2+DecTemp4/60+DecTemp1*100/3600;
		
		//转化成弧度值
		DecTemp3=DecTemp3*PI/180;
		
		bte.l=DecTemp3;
		//m_blh.GetAt(i).setl(DecTemp3);

		//计算H
	/*	DecTemp1=m_blh.GetAt(i).geth();
		
		//DecTemp3 存放余数部分,DecTemp2 存放整数部分
		DecTemp3=modf(DecTemp1,&DecTemp2);
		DecTemp3=DecTemp3*100;
		DecTemp1=modf(DecTemp3,&DecTemp4);
		
		//计算十进制角度
		DecTemp3=DecTemp2+DecTemp4/60+DecTemp1*100/3600;
		
		//转化成弧度值
		DecTemp3=DecTemp3*PI/180;
		
		m_blh.GetAt(i).seth(DecTemp3);
		
		*/

		bte.h=m_blh.GetAt(i).geth();
		m_blh.SetAt(i,bte);
	}
}


void CCoordTranBase::ArcToDec(void)
{

	blh bte;
	double DecTemp1,DecTemp2,DecTemp3,DecTemp4;
	
	for(int i=0;i<m_blh.GetSize();i++)
	{
		//计算B
		DecTemp1=m_blh.GetAt(i).getb();
		if(DecTemp1<0)
			DecTemp1=DecTemp1+PI;
		
		//计算十进制角度
		DecTemp1=DecTemp1*180/PI;
				
		//DecTemp3 存放余数部分,DecTemp2 存放整数部分
		DecTemp3=modf(DecTemp1,&DecTemp2);
		DecTemp3=DecTemp3*60;
		DecTemp1=modf(DecTemp3,&DecTemp4);
	
		DecTemp3=DecTemp2+DecTemp4/100+DecTemp1*60/10000;
	
		bte.b=DecTemp3;
		//m_blh.GetAt(i).setb(DecTemp3);
		
		//计算L
		DecTemp1=m_blh.GetAt(i).getl();
		if(DecTemp1<0)
			DecTemp1=DecTemp1+PI;
		
		//计算十进制角度
		DecTemp1=DecTemp1*180/PI;
				
		//DecTemp3 存放余数部分,DecTemp2 存放整数部分
		DecTemp3=modf(DecTemp1,&DecTemp2);
		DecTemp3=DecTemp3*60;
		DecTemp1=modf(DecTemp3,&DecTemp4);
	
		DecTemp3=DecTemp2+DecTemp4/100+DecTemp1*60/10000;
	
		bte.l=DecTemp3;

		//m_blh.GetAt(i).setl(DecTemp3);
	
		//计算H
		/*DecTemp1=m_blh.GetAt(i).geth();
		bl.h=DecTemp1;

		m_bltemp.Add(bl);
		
		//计算十进制角度
/*		DecTemp1=DecTemp1*180/PI;
				
		//DecTemp3 存放余数部分,DecTemp2 存放整数部分
		DecTemp3=modf(DecTemp1,&DecTemp2);
		DecTemp3=DecTemp3*60;
		DecTemp1=modf(DecTemp3,&DecTemp4);
	
		DecTemp3=DecTemp2+DecTemp4/100+DecTemp1*60/10000;
		m_blh.GetAt(i).seth(DecTemp3);
*/	
		bte.h=m_blh.GetAt(i).geth();
		m_blh.SetAt(i,bte);
	
	}
}


double CCoordTranBase::DecToArc(double m_dec)
{
	double DecTemp1,DecTemp2,DecTemp3,DecTemp4;
	
	

	DecTemp1=m_dec;
	
	//DecTemp3 存放余数部分,DecTemp2 存放整数部分
	DecTemp3=modf(DecTemp1,&DecTemp2);
	DecTemp3=DecTemp3*100;
	DecTemp1=modf(DecTemp3,&DecTemp4);
	
	//计算十进制角度
	DecTemp3=DecTemp2+DecTemp4/60+DecTemp1*100/3600;
	
	//转化成弧度值
	DecTemp3=DecTemp3*PI/180;
	
	return DecTemp3;
	
}

double CCoordTranBase::ArcToDec(double m_Arc)
{
	double DecTemp1,DecTemp2,DecTemp3,DecTemp4;
	
	
	DecTemp1=m_Arc;
	if(DecTemp1<0)
		DecTemp1=DecTemp1+PI;
	
	//计算十进制角度
	DecTemp1=DecTemp1*180/PI;
				
	//DecTemp3 存放余数部分,DecTemp2 存放整数部分
	DecTemp3=modf(DecTemp1,&DecTemp2);
	DecTemp3=DecTemp3*60;
	DecTemp1=modf(DecTemp3,&DecTemp4);
	
	DecTemp3=DecTemp2+DecTemp4/100+DecTemp1*60/10000;
	
	return DecTemp3;
	
}

void CCoordTranBase::InitValue(int flag)
{
	m_Flag=flag;

	switch(m_Flag)
	{
	case 0:
		e2=e54;
		lax=a54;
		sax=b54;
		af=af54;

		break;
	case 1:
		e2=e80;
		lax=a80;
		sax=b80;
		af=af80;
		break;			//.....

	case 2:
		e2=e84;
		lax=a84;
		sax=b84;
		af=af84;
		break;

	default:
		break;
	}


}

⌨️ 快捷键说明

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