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

📄 projection_gaussdlg.cpp

📁 用C++中的MFC编程实现高斯投影正算和反算 即已知经纬度求X,Y 已知X,Y求经纬度
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		mylist.push_back(m_y);
		int ln;
		ln=this->m_List.InsertItem(tag,buf[0]);
		for(int col=0;col<5;col++)
			m_List.SetItemText(ln,col,buf[col]);
		UpdateData(false);
	}
	else
	{
		if(L0<0 || L0>180 || B<0 || B>90)
			::MessageBox(NULL,"您输入的经纬度越界,请检查!","错误",MB_ICONHAND);
		else
			if(L<L0-daicha/2 || L>L0+daicha/2)
				::MessageBox(NULL,"你的输入超出了投影带的范围,请检查","错误",MB_ICONHAND);
	}
	flag=1;
	// TODO: Add your control notification handler code here
	
}

void CProjection_GaussDlg::OnBUTTONfansuan() 
{
	if(flag==0)
		this->m_List.DeleteAllItems();
	this->ChooseEllipse();
	double radian_to_angle=180/pi;
	double tf,Nf,vf,Y,q,Bf,k,B0,dL,B,L,L0;
	double max_x,max_y,min_x,min_y;
	max_x=10002137.5;
	min_x=-10002137.5;
	L0=m_L0_degree+m_L0_minute/60+m_L0_second/3600;
	if(daicha==3)
	{
		max_y=667001.3;
		min_y=332998.73;
	}
	else
	{
		max_y=834117.86;
		min_y=165882.141;
	}
	
	if(L0>=0 && L0<=180 && m_x>=min_x && m_x<=max_x && m_y>=min_y && m_y<=max_y)
	{
		B0=m_x*q0;
		Bf=B0+sin(2*B0)*(q2+sin(B0)*sin(B0) *
			(q4+sin(B0)*sin(B0)*(q6+q8*sin(B0)*sin(B0))));
		Y=m_y-500000;
		tf=tan(Bf);
		k=square_e1*cos(Bf)*cos(Bf);
		vf=1+k;
		Nf=c/sqrt(vf);
		q=Y/Nf;
		B=Bf*radian_to_angle+p0*tf*
			(-vf+((5+3*tf*tf*(1+(-2-3*k)*k)+3*k*(2-k)) + 
			(-(61+45*tf*tf*(2+tf*tf)+(107+(-162-45*tf*tf)*tf*tf)*k) + 
			(1385+(3633+(4095+1575*tf*tf)*tf*tf)*tf*tf)*q*q/56)*q*q/30)*q*q/12)*q*q/2;
		dL=p0*q/cos(Bf)*(1+(-(1+2*tf*tf+k) +
			((5+4*tf*tf*(7+6*tf*tf)+2*k*(3+4*tf*tf)) -
			(61+(662+(1320+720*tf*tf)*tf*tf)*tf*tf)*q*q/42)*q*q/20)*q*q/6);
		L=L0+dL;
		
		m_B_degree=int (B);	
		m_B_minute=int( (B-int(B))*60);
		m_B_second=int (((B-int(B))*60-m_B_minute)*60);
		m_L_degree=int(L);
		m_L_minute=int( (L-int(L))*60);	
		m_L_second=int (((L-int(L))*60-m_L_minute)*60);
		
		CString buf[5];
		buf[0].Format("%d",++tag);
		buf[1].Format("%lf",B);
		buf[2].Format("%lf",L);
		buf[3].Format("%lf",m_x);
		buf[4].Format("%lf",m_y);
		mylist.push_back(B);
		mylist.push_back(L);
		mylist.push_back(m_x);
		mylist.push_back(m_y);
		int ln;
		ln=this->m_List.InsertItem(tag,buf[0]);
		for(int col=0;col<5;col++)
			m_List.SetItemText(ln,col,buf[col]);
		UpdateData(false);	
	}
	else
	{
		if(L0<0 || L0>180)
			::MessageBox(NULL,"您输入的经纬度越界,请检查!","错误",MB_ICONHAND);
		else
			if(m_x<min_x || m_x>max_x || m_y<min_y || m_y>max_y)
				::MessageBox(NULL,"你的输入超出了投影带的范围,请检查","错误",MB_ICONHAND);
	}
	flag=1;
	// TODO: Add your control notification handler code here
	
}

void CProjection_GaussDlg::OnRadio_zhengsuan() 
{
    UpdateData(true);
	m_L_degree=115;
	m_L_minute=m_L_second=0;
	m_B_degree=m_B_minute=m_B_second=0;
	m_x=m_y=0;
	UpdateData(false);
	m_zhengsuanControl1.EnableWindow(true);
	m_zhengsuanControl2.EnableWindow(true);
	m_zhengsuanControl3.EnableWindow(true);
	m_zhengsuanControl4.EnableWindow(true);
	m_zhengsuanControl5.EnableWindow(true);
	m_zhengsuanControl6.EnableWindow(true);
	m_zhengsuanControl7.EnableWindow(true);
	m_fansuanControl1.EnableWindow(false);
	m_fansuanControl2.EnableWindow(false);
	m_fansuanControl3.EnableWindow(false);
	// TODO: Add your control notification handler code here
	
}

void CProjection_GaussDlg::OnRadio_fansuan() 
{
	UpdateData(true);	
	m_x=0;
	m_y=500000;
	m_B_degree=m_B_minute=m_B_second=0;
	m_L_degree=m_L_minute=m_L_second=0;
	UpdateData(false);
	m_zhengsuanControl1.EnableWindow(false);
	m_zhengsuanControl2.EnableWindow(false);
	m_zhengsuanControl3.EnableWindow(false);
	m_zhengsuanControl4.EnableWindow(false);
	m_zhengsuanControl5.EnableWindow(false);
	m_zhengsuanControl6.EnableWindow(false);
	m_zhengsuanControl7.EnableWindow(false);
	m_fansuanControl1.EnableWindow(true);
	m_fansuanControl2.EnableWindow(true);
	m_fansuanControl3.EnableWindow(true);
	// TODO: Add your control notification handler code here
	
}

void CProjection_GaussDlg::ChooseEllipse()
{
	this->UpdateData();
	int m_index;
	int m_daiindex;
	m_index=((CComboBox*)GetDlgItem(IDC_COMBO_Ellipse))->GetCurSel();
	m_daiindex=((CComboBox*)GetDlgItem(IDC_COMBO_touyingdai))->GetCurSel();
	daicha=3*m_daiindex+3;
	switch (m_index)
	{
	case 0:                //克氏
		a0 = 111134.8610828;
		a2 = -16036.48022;
		a4 = 16.82805;
		a6 = -2.197E-02;		
		a8 = 3E-05;	
		c = 6399698.901782711;
		a = 6378245;
		square_e1 = 6.738525414683E-03;
		square_e = 6.693421622966E-03;
		q0 = 157046064.12328E-15;
		q2 = 25258869461.858E-12;
		q4 = -14919317.6572E-12;
		q6 = 120717.4265E-12;
		q8 = -1075.1509E-12;
		
		break;
		
	case 1:            //1975
		a0 = 111133.0046793;
		a2 = -16038.52818;
		a4 = 16.83263;
		a6 = -2.198E-02;
		a8 = 3E-05;
		c = 6399596.6519880105;
		a = 6378140;
		square_e1 = 6.739501819473E-03;
		square_e = 6.694384999588E-03;
		q0 = 157048687.47416E-15;
		q2 = 2526252791.9786E-12;
		q4 = -14923644.4356E-12;
		q6 = 120769.9608E-12;
		q8 = -1075.7700E-12;
		
		break;
		
	case 2:       //wgs
		a0 = 111132.9525494;		
		a2 = -16038.50840;	
		a4 = 16.83260;	
		a6 = -2.198E-02;
		a8 = 3E-05;
		c = 6399593.6258;
		a = 6378137;
		square_e1 = 6.73949674227E-03;
		square_e = 6.6943799013E-03;
		q0 = 157048761.142065E-15;
		q2 = 2526250855.8867E-12;
		q4 = -14923621.5362E-12;
		q6 = 120769.6828E-12;
		q8 = -1075.7667E-12;
		
		break;
		
	default:
		
		break;
	}
	
}

void CProjection_GaussDlg::OnBUTTONSave() 
{	
	if(mylist.empty())
	{
		::MessageBox(NULL,"您未进行任何计算或者您已经保存了!","错误",MB_ICONHAND);
		return;
	}
	tag=0;
	CString strCurrentPath,strMsg;
	GetCurrentDirectory(200,strCurrentPath.GetBuffer(200));
	strCurrentPath.ReleaseBuffer();	
	CFileDialog   dlg(FALSE,   TEXT("TXT"),   NULL,   OFN_HIDEREADONLY   |   OFN_OVERWRITEPROMPT,    TEXT("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||"),   this);   
	dlg.m_ofn.lpstrInitialDir=strCurrentPath; //这里就设置了对话框的默认目录为strCurrentPath
	if ( dlg.DoModal()!=IDOK )
		return;
	//获取文件的绝对路径
	CString sFileName=dlg.GetPathName();
	m_filename=(char*)(LPCTSTR)sFileName;
	m_file.open(m_filename,std::ios::out);
	m_file << "编号NO" << std::setw(15)<< "纬度B/角度" << std::setw(15)<<"经度L/角度" 
		<<std::setw(15)<< "横坐标x/cm" <<std::setw(15)<< "纵坐标y/cm" <<std::setw(15)<< endl;
	std::list<double>::iterator lstitr = mylist.begin();
	std::list<double>::iterator lstend = mylist.end();
	//写入一行
	int listln;
	for(int listcol=0;lstitr != lstend;listcol++)
	{
		m_file <<std::setw(2)<< ++tag;
		for (listln=0;listln<4; lstitr++,listln++)
			m_file << std::setw(15) << *lstitr ;
		m_file <<endl;
	}

	// TODO: Add your control notification handler code here
	m_file.close();
	mylist.erase(mylist.begin(),mylist.end());
	tag=0;
	this->m_List.DeleteAllItems();
}

void CProjection_GaussDlg::OnBUTTONOpen() 
{
	CString strCurrentPath,strMsg;
	GetCurrentDirectory(200,strCurrentPath.GetBuffer(200));
	strCurrentPath.ReleaseBuffer();
	CFileDialog   dlg(TRUE,   TEXT("TXT"),   NULL,   OFN_HIDEREADONLY   |   OFN_OVERWRITEPROMPT,    TEXT("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||"),   this);   
	dlg.m_ofn.lpstrInitialDir=strCurrentPath; //这里就设置了对话框的默认目录为strCurrentPath
	if ( dlg.DoModal()!=IDOK )
		return;
	//获取文件的绝对路径
	CString sFileName=dlg.GetPathName();
	string str;
	ifstream infile(sFileName,ios::binary);
	//去掉第一行
	char tm[1024];
	infile.getline(tm,1024);
	//读取数据,放入数组
	double number[65536] = {0};
	infile>>str;
	int i=0;
	while(1)
	{
		number[i++] = atof(str.c_str());
		infile>>str;
		if( str.empty() ) break;
	} 
	//清空list control
	this->m_List.DeleteAllItems();
	//格式转换,转换成字符串
	CString buf[7];
	for(int listln=0;listln<i;listln=listln+5)
	{
		buf[0].Format("%d",int(number[listln]));
		buf[1].Format("%d",int(number[listln+1]));
		buf[2].Format("%d",int(number[listln+2]));
		buf[3].Format("%lf",number[listln+3]);
		buf[4].Format("%lf",number[listln+4]);
		//输出一行
		int ln;
		ln=this->m_List.InsertItem(int(number[listln]),buf[0]);
		for(int col=0;col<5;col++)
			m_List.SetItemText(ln,col,buf[col]);
	}
	flag=0;
}

void CProjection_GaussDlg::OnBUTTONClear() 
{
	tag=0;
	this->m_List.DeleteAllItems();
	// TODO: Add your control notification handler code here
	
}

⌨️ 快捷键说明

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