📄 geocomputerdlg.cpp
字号:
/*-写入数据-*/
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 + -