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

📄 geocomputerdlg.cpp

📁 我是测绘学院的学生
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*-写入数据-*/	
			InsertBLxy(resultB,resultL,m_Bx,m_Ly,number,KE_BAC);
		}
	}
	//国际椭球反算
	if(m_CompType==1&&m_EllipType==1)
	{
		fp=fopen(sPath,"r");
		if(this->strcmp(st,"coordinate(x,y):")!=1)
		{
			AfxMessageBox("数据类型不符,请选择高斯平面坐标文件!");
			return;
		}
		for(;feof(fp)!=1;)
		{
			fgets(st,50,fp);
/*-计算-*/	if(st[0]=='e')return ;
			ExtracteXYData(number,m_Bx,m_Ly,st);
			this->PrepareData();
			resultB=(Bf-(1-(b4-0.147*Z*Z)*Z*Z)*Z*Z*b2*p)/p;
			resultL=(L0*3600+(1-(b3-b5*Z*Z)*Z*Z)*Z*p)/p;
/*-写入数据-*/	
			InsertBLxy(resultB,resultL,m_Bx,m_Ly,number,IN_BAC);
		}
	}				
}
		
}



void CGeoComputerDlg::PrepareData()
{
	//正算:
	   	p=(double)(180*3600)/(double)PI;
	    B=(m_Bd+m_Bm/60+m_Bs/3600)/(double)180*(double)PI;
	    L=(m_Ld+m_Lm/60+m_Ls/3600)/(double)180*(double)PI;
	//对初值的处理:
		L0=m_Belt*6-3;
//		int n=(int)m_Ld/6;
//		if((n-1)*6<=m_Ld&&m_Ld<=n*6) L0=n*6-3;
//		else if(m_Ld>n*6) L0=n*6+3;
	if(m_CompType==0)
	{
		//克氏椭球
		if(m_EllipType==0)
		{
			l=(double)((m_Ld-L0)*3600+m_Lm*60+m_Ls)/p;
			N= 6399698.902-(21562.267-(108.973-0.612*pow(cos(B),2))*pow(cos(B),2))*pow(cos(B),2);
			a0=32140.404-(135.3302-(0.7092-0.0040*pow(cos(B),2))*pow(cos(B),2))*pow(cos(B),2);
			a4=(0.25+0.00252*pow(cos(B),2))*pow(cos(B),2)-0.04166;
			a6=(0.166*pow(cos(B),2)-0.084)*pow(cos(B),2);
			a3=(0.3333333+0.001123*pow(cos(B),2))*pow(cos(B),2)-0.1666667;
			a5=0.0083-(0.1667-(0.1968+0.0040*pow(cos(B),2))*pow(cos(B),2))*pow(cos(B),2);
		}
		//国际椭球
		if(m_EllipType==1)
		{
			l=(double)((m_Ld-L0)*3600+m_Lm*60+m_Ls)/p;
			N= 6399596.652-(21565.045-(108.996-0.603*pow(cos(B),2))*pow(cos(B),2))*pow(cos(B),2);
			a0=32144.5189-(135.3646-(0.7034-0.0041*pow(cos(B),2))*pow(cos(B),2))*pow(cos(B),2);
			a4=(0.25+0.00253*pow(cos(B),2))*pow(cos(B),2)-0.04167;
			a6=(0.167*pow(cos(B),2)-0.083)*pow(cos(B),2);
			a3=(0.3333333+0.001123*pow(cos(B),2))*pow(cos(B),2)-0.1666667;
			a5=0.00878-(0.1702-0.20382*pow(cos(B),2))*pow(cos(B),2);
		}
	}
	//反算:
	if(m_CompType==1)
	{
		//克氏椭球
		if(m_EllipType==0)
		{
			q=(m_Bx/6367558.4969)*p;
			Bf=q+(50221746+(293622+(2350+22*pow(cos(q/p),2))*pow(cos(q/p),2))*pow(cos(q/p),2))*(pow(10,-10))*sin(q/p)*cos(q/p)*p;
			///把Bf转化成弧度;计算余弦;				
			Nf=6399698.902-(21562.267-(108.973-0.612*pow(cos(Bf/p),2))*pow(cos(Bf/p),2))*pow(cos(Bf/p),2);
			Z=m_Ly/(Nf*cos(Bf/p));
			b2=(0.5+0.003369*pow(cos(Bf/p),2))*cos(Bf/p)*sin(Bf/p);
			b3=0.333333-(0.166667-0.001123*pow(cos(Bf/p),2))*pow(cos(Bf/p),2);
			b4=0.25+(0.16161+0.00562*pow(cos(Bf/p),2))*pow(cos(Bf/p),2);
			b5=0.2-(0.1667-0.0088*pow(cos(Bf/p),2))*pow(cos(Bf/p),2);
		}
		//国际椭球书上公式4-78,4-12
		if(m_EllipType==1)
		{
			q=(m_Bx/6367452.133)*p;
			Bf=q+(50228976+(293697+(2383+22*pow(cos(q/p),2))*pow(cos(q/p),2))*pow(cos(q/p),2))*(pow(10,-10))*sin(q/p)*cos(q/p)*p;
			///把Bf转化成弧度;计算余弦;				
			Nf=6399596.652-21565.047*pow(cos(Bf/p),2)+109.003*pow(cos(Bf/p),4)-0.612*pow(cos(Bf/p),6)+0.004*pow(cos(Bf/p),8);
			Z=m_Ly/(Nf*cos(Bf/p));
			b2=(0.5+0.00336975*pow(cos(Bf/p),2))*cos(Bf/p)*sin(Bf/p);
			b3=0.333333-(0.1666667-0.001123*pow(cos(Bf/p),2))*pow(cos(Bf/p),2);
			b4=0.25+(0.161612+0.005617*pow(cos(Bf/p),2))*pow(cos(Bf/p),2);
			b5=0.2-(0.16667-0.00878*pow(cos(Bf/p),2))*pow(cos(Bf/p),2);
		}
	}
}

void CGeoComputerDlg::InsertBLxy(double resultB,double resultL,double resultX,double resultY,long number,int m_Type)
{
/*-------写入xy坐标-------*/
	LVITEM  item;
	int  num=m_ListXY.GetItemCount( ); 
	item.mask=LVIF_TEXT|LVIF_IMAGE;
	item.iSubItem=0;  
	item.iItem=num;
	char str[20];
	CString  strNum,strX,strY;
	item.pszText=str;
	item.iImage=NULL;
	m_ListXY.InsertItem(&item);     
	strNum.Format("第%d点:",number);
	m_ListXY.SetItemText(num,0,strNum);
	strX.Format("%10.10f",resultX);
	m_ListXY.SetItemText(num, 1, strX);  
	strY.Format("%10.10f",resultY);
	m_ListXY.SetItemText(num, 2, strY);	
	switch (m_Type)
	{
	case 0:
			m_ListXY.SetItemText(num, 3, "克氏椭球正算.");break;
	case 1:
			m_ListXY.SetItemText(num, 3, "克氏椭球反算.");	break;
	case 2:
			m_ListXY.SetItemText(num, 3, "1975年国际椭球正算.");break;
	case 3:
			m_ListXY.SetItemText(num, 3,"1975年国际椭球反算.");	break;
	}
/*----写入B,L坐标------*/
	CString  strB,strL,strTem;
	long	Bd,Ld,Lm,Bm;
	double Ang,Bs,Ls;
	item.pszText=str;
	item.iImage=NULL;
	m_ListBL.InsertItem(&item);   
	strNum.Format("第%d点:",num+1);
	m_ListBL.SetItemText(num,0,strNum);
			Ang=resultB;		//弧度要转化成秒
			Ang*=p;
			Bd=(long)Ang/3600;
			Bm=(long)(Ang/60-Bd*60);
			Bs=(double)(Ang-Bd*3600-Bm*60);
			strB.Format("%d",Bd);
			strTem.Format("%d",Bm);
			strB=strB+"°"+strTem;
			strTem.Format("%f",Bs);
			strB=strB+"′"+strTem+"″";

	m_ListBL.SetItemText(num, 1, strB);  

			Ang=resultL;		//弧度要转化成
			Ang*=p;
			Ld=(long)Ang/3600;
			Lm=(long)(Ang/60-Ld*60);
			Ls=(double)(Ang-Ld*3600-Lm*60);
			strL.Format("%d",Ld);
			strTem.Format("%d",Lm);
			strL=strL+"°"+strTem;
			strTem.Format("%f",Ls);
			strL=strL+"′"+strTem+"″";
	m_ListBL.SetItemText(num, 2, strL);	
////输入弧度:
	strB.Format("%2.20f",resultB);
	strL.Format("%2.20f",resultL);
	m_ListBL.SetItemText(num, 3, strB);	
	m_ListBL.SetItemText(num, 4, strL);	


}

void CGeoComputerDlg::ExtracteXYData(int&number,double&resultX,double&resultY,char*st)
{
		char *stBx=new char[30];
		char *stLy=new char[30];
		char *stNum=new char[10];
//取出编号;
		int flag=0,i,j=0;
		for(i=0;st[i]!=',';i++,j++)
		{
			stNum[j]=st[i];
		}	stNum[j]='\0';	flag=i;		
		number=(int)atof(stNum);
//取出x值;
		for(i=flag+1,j=0;st[i]!=',';i++,j++)
		{
			stBx[j]=st[i];
		}	stBx[j]='\0';		
		resultX=atof(stBx); flag=i;	
//取出y值;
		for(i=flag+1,j=0;st[i]!='\n';i++,j++)
		{
			stLy[j]=st[i];
		}	stLy[j]='\0';		
		resultY=atof(stLy);	
}

void CGeoComputerDlg::ExtractBLdata(double &m_Bd,double &m_Bm,double &m_Bs,double &m_Ld,double &m_Lm,double &L_Bs,int &number,char*st)
{
		char *stAng=new char[50];
//取出标号;
		int flag=0,i,j=0;
		for(i=0;st[i]!=',';i++,j++)
		{
			stAng[j]=st[i];
		}	stAng[j]='\0';	flag=i;	
		number=(int)atof(stAng);
//取出纬度;
		for(i=flag+1,j=0;st[i]!=',';i++,j++)
		{
			stAng[j]=st[i];
		}	stAng[j]='\0';	flag=i;	
//取出秒经度;
		ComputeDMS(stAng,m_Bd,m_Bm,m_Bs);
		for(i=flag+1,j=0;st[i]!='\n';i++,j++)
		{
			stAng[j]=st[i];
		}	stAng[j]='\0';	
		ComputeDMS(stAng,m_Ld,m_Lm,m_Ls);
		
}

void CGeoComputerDlg::ComputeDMS(char*stAng,double &md,double &mm,double &ms)
{
		char *stAd=new char[10];
		char *stAm=new char[10];
		char *stAs=new char[30];
		int flag=0,i,j;
//计算度;
		for(i=0,j=0;stAng[i]!=' ';i++,j++)//°′″
		{
			stAd[j]=stAng[i];
		}	stAd[j]='\0';	flag=i;	
		md=atof(stAd);
//计算秒:
		for(i=flag+1,j=0;stAng[i]!=' ';i++,j++)
		{
			stAm[j]=stAng[i];
		}	stAm[j]='\0';	flag=i;	
		mm=atof(stAm);
//计算分;
		for(i=flag+1,j=0;stAng[i]!=' ';i++,j++)
		{
			stAs[j]=stAng[i];
		}	stAs[j]='\0';	flag=i;	
		ms=atof(stAs);
}




void CGeoComputerDlg::OnButtsave() 
{
	// TODO: Add your control notification handler code here
	UpdateData();	
	p=(double)(180*3600)/(double)PI;
if(m_Check==true)	//批量计算
{
	CString  strB,strL,strTem;
	CString  strNum,strX,strY;
	if(m_CompType==0)	//正算保存xy坐标
	{
//写入文件:
		CFileDialog dlg(FALSE,NULL, "正算结果xy.dat",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"数据文件(*.dat)|*.dat|All files(*.*)|*.*||");
		pdlg=&dlg;
		pdlg->DoModal();
		sPath=pdlg->GetPathName();
		fstream fout;
		fout.open(sPath,ios::out);
		int  num=m_ListXY.GetItemCount( ); 
		fout<<"coordinate(x,y):"<<'\n';	//写入文件头
		for(int i=0;i<num;i++)
		{
			strNum.Format("%d",i+1);
			strX=m_ListXY.GetItemText(i, 1);  
			strY=m_ListXY.GetItemText(i, 2);	
			strX=strX.Left(strX.Find(".")+5);
			strY=strY.Left(strY.Find(".")+5);
			fout<<strNum<<','<<strX<<','<<strY<<'\n';
		}fout<<'e';//写入文件尾
		fout.close();
	}
	if(m_CompType==1)	//反算保存BL坐标;
	{

		CFileDialog dlg(FALSE,NULL, "反算结果BL.dat",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"数据文件(*.dat)|*.dat|All files(*.*)|*.*||");
		pdlg=&dlg;
		pdlg->DoModal();
		sPath=pdlg->GetPathName();
		long	Bd,Ld,Bm,Lm;
		double Ang,Bs,Ls;
		CString strBs,strLs;
		fstream fout;
		fout.open(sPath,ios::out);
		fout<<"latitude and longitude"<<'\n';
		int  num=m_ListBL.GetItemCount( ); 
		for(int i=0;i<num;i++)
		{
			strNum.Format("%d",i+1);
			strB=m_ListBL.GetItemText(i, 3);
			strL=m_ListBL.GetItemText(i, 4);
			Ang=atof(strB);		//弧度要转化成秒
			Ang*=p;
			Bd=(long)Ang/3600;
			Bm=(long)(Ang/60-Bd*60);
			Bs=(double)(Ang-Bd*3600-Bm*60);
			strBs.Format("%10.4f",Bs);
			Ang=atof(strL);		//弧度要转化成秒
			Ang*=p;
			Ld=(long)Ang/3600;
			Lm=(long)(Ang/60-Ld*60);
			Ls=(double)(Ang-Ld*3600-Lm*60);
			strLs.Format("%10.4f",Ls);			
			fout<<strNum<<','<<Bd<<' '<<Bm<<' '<<strBs<<' '<<','<<Ld<<' '<<Lm<<' '<<strLs<<' '<<'\n';
		}fout<<'e';	

	}	
}
else //分步计算,保存所有 
{
		CFileDialog dlg(FALSE,NULL, "计算结果xy.dat",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"数据文件(*.dat)|*.dat|All files(*.*)|*.*||");
		pdlg=&dlg;
		pdlg->DoModal();
		sPath=pdlg->GetPathName();
		CString  strB,strL,strTem;
		CString  strNum,strX,strY;
		sPath=pdlg->GetPathName();
		fstream fout;
		fout.open(sPath,ios::out);
		int  num=m_ListXY.GetItemCount( ); 
		fout<<"coordinate(x,y):"<<'\n';
		for(int i=0;i<num;i++)
		{
			strNum.Format("%d",i+1);
			strX=m_ListXY.GetItemText(i, 1);  
			strY=m_ListXY.GetItemText(i, 2);
			strX=strX.Left(strX.Find(".")+5);
			strY=strY.Left(strY.Find(".")+5);
			fout<<strNum<<','<<strX<<','<<strY<<'\n';
		}	fout<<'e';
		fout.close();  

		CFileDialog	 dlg1(FALSE,NULL, "计算结果BL.dat",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"数据文件(*.dat)|*.dat|All files(*.*)|*.*||");
		pdlg=&dlg1;
		pdlg->DoModal();
		sPath=pdlg->GetPathName();
		long	Bd,Ld,Bm,Lm;
		double Ang,Bs,Ls;
		CString strBs,strLs;
		fout.open(sPath,ios::out);
		  num=m_ListBL.GetItemCount( ); 
		fout<<"latitude and longitude"<<'\n';
		for( i=0;i<num;i++)
		{
			strNum.Format("%d",i+1);
			strB=m_ListBL.GetItemText(i, 3);
			strL=m_ListBL.GetItemText(i, 4);
			Ang=atof(strB);		//弧度要转化成秒
			Ang*=p;
			Bd=(long)Ang/3600;
			Bm=(long)(Ang/60-Bd*60);
			Bs=(double)(Ang-Bd*3600-Bm*60);
			strBs.Format("%10.4f",Bs);
			Ang=atof(strL);		//弧度要转化成秒
			Ang*=p;
			Ld=(long)Ang/3600;
			Lm=(double)(Ang/60-Ld*60);
			Ls=(double)(Ang-Ld*3600-Lm*60);
			strLs.Format("%10.4f",Ls);			
			fout<<strNum<<','<<Bd<<' '<<Bm<<' '<<strBs<<' '<<','<<Ld<<' '<<Lm<<' '<<strLs<<' '<<'\n';
		}fout<<'e';
		fout.close();

}

}

int CGeoComputerDlg::strcmp(char *st1,char*st2)
{
	int flag=1;
	for(;*st1!='\0'&&*st2!='\0';st1++,st2++)
	{
		if(*st1!=*st2){flag=0;return flag;}
	}
	return flag;
}

void CGeoComputerDlg::GetBLFromEDIT(CString m_InB, CString m_InL)
{
	
//	m_Bd
	    CString stAng;
		char *stAd=new char[10];
		char *stAm=new char[10];
		char *stAs=new char[30];
		int flag=0,i,j;
		stAng=m_InB;
//计算度;
		for(i=0,j=0;stAng.GetAt(i)!='.';i++,j++)//°′″
		{
			stAd[j]=stAng.GetAt(i);
		}	stAd[j]='\0';	flag=i;	
		m_Bd=atof(stAd);
//计算秒:
		for(i=flag+1,j=0;stAng.GetAt(i)!='.';i++,j++)
		{
			stAm[j]=stAng.GetAt(i);
		}	stAm[j]='\0';	flag=i;	
		m_Bm=atof(stAm);
//计算分;
		for(i=flag+1,j=0;i<stAng.GetLength();i++,j++)
		{
			stAs[j]=stAng.GetAt(i);
		}	stAs[j]='\0';	flag=i;	
		m_Bs=atof(stAs);
		/**/
		stAng=m_InL;
//计算度;
		for(i=0,j=0;stAng.GetAt(i)!='.';i++,j++)//°′″
		{
			stAd[j]=stAng.GetAt(i);
		}	stAd[j]='\0';	flag=i;	
		m_Ld=atof(stAd);
//计算秒:
		for(i=flag+1,j=0;stAng.GetAt(i)!='.';i++,j++)
		{
			stAm[j]=stAng.GetAt(i);
		}	stAm[j]='\0';	flag=i;	
		m_Lm=atof(stAm);
//计算分;
		for(i=flag+1,j=0;i<stAng.GetLength();i++,j++)
		{
			stAs[j]=stAng.GetAt(i);
		}	stAs[j]='\0';	flag=i;	
		m_Ls=atof(stAs);
}

BOOL CGeoComputerDlg::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	if(m_ToolTip) 
	m_ToolTip.RelayEvent(pMsg); 

	return CDialog::PreTranslateMessage(pMsg);
}

⌨️ 快捷键说明

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