📄 projection_gaussdlg.cpp
字号:
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 + -