L0=stod(g_center);//获得中央子午线 秒 //北京-54 平面->大地坐标 if(m_comOld.GetCurSel()==0&&m_comNew.GetCurSel()==0) { bt=x/6367452.1326;bt2=bt*p2; cos2bt=cos(bt)*cos(bt); Bf=bt2+(50221746.0+(293662.0+(2350.0+22.0*cos2bt)*cos2bt)*cos2bt)*0.0000000001*sin(bt)*cos(bt)*p2; Bf2=Bf; //秒 Bf=Bf/p2;//弧度 cos2Bf=cos(Bf)*cos(Bf); Nf=6399698.902+(21562.267-(108.973-0.612*cos2Bf)*cos2Bf)*cos2Bf; Z=y/(Nf*cos(Bf)); b2=(0.5+0.003369*cos2Bf)*sin(Bf)*cos(Bf); b3=0.333333-(0.166667-0.001123*cos2Bf)*cos2Bf; b4=0.25+(0.16161+0.00562*cos2Bf)*cos2Bf; b5=0.2-(0.1667-0.0088*cos2Bf)*cos2Bf; B=Bf2-(1.0-(b4-0.12*Z*Z)*Z*Z)*Z*Z*b2*p2; //秒 l=(1.0-(b3-b5*Z*Z)*Z*Z)*Z*p2; L=L0+l; m_strX1=dtoBLH(B); //输出 m_strY1=dtoBLH(L); } //国家-80 平面->大地坐标 if(m_comOld.GetCurSel()==1&&m_comNew.GetCurSel()==1) { bt=x/6367452.133; //弧度 bt2=bt*p2; //秒 cos2bt=cos(bt)*cos(bt); Bf=bt2+(50228976.0+(293697.0+(2383.0+22.0*cos2bt)*cos2bt)*cos2bt)*0.0000000001*sin(bt)*cos(bt)*p2; Bf2=Bf; //秒 Bf=Bf/p2;//弧度 cos2Bf=cos(Bf)*cos(Bf); Nf=6399596.652-(21565.045-(108.996-0.603*cos2Bf)*cos2Bf)*cos2Bf; Z=y/(Nf*cos(Bf)); b2=(0.5+0.003369*cos2Bf)*sin(Bf)*cos(Bf); b3=0.333333-(0.1666667-0.001123*cos2Bf)*cos2Bf; b4=0.25+(0.161612+0.005617*cos2Bf)*cos2Bf; b5=0.2-(0.1667-0.00878*cos2Bf)*cos2Bf; B=Bf2-(1.0-(b4-0.12*Z*Z)*Z*Z)*Z*Z*b2*p2; //角度 秒 l=(1.0-(b3-b5*Z*Z)*Z*Z)*Z*p2; L=L0*3600.0+l; m_strX1=dtoBLH(B); m_strY1=dtoBLH(L); //输出 } UpdateData(FALSE);}
void CDlgCoord::BLHtoXYZ() //大地坐标->空间直角坐标 { UpdateData(); if(m_comOld.GetCurSel()==0&&m_comNew.GetCurSel()==0|| m_comOld.GetCurSel()==1&&m_comNew.GetCurSel()==1|| m_comOld.GetCurSel()==2&&m_comNew.GetCurSel()==2 ) //相同的椭球之间转算 { double B,L,H,X,Y,Z,N,ee,a; double p2=206264.806247; B=stod(m_strX0);//度分秒->秒 L=stod(m_strY0); H=atof(m_strH0); B=B/p2;//弧度 L=L/p2; if(m_comOld.GetCurSel()==0&&m_comNew.GetCurSel()==0)//北京-54 { ee=0.006693421622966; a=6378245.000; }
6
if(m_comOld.GetCurSel()==1&&m_comNew.GetCurSel()==1)//国家-80 { ee=0.006694384999588; a=6378140.000; } if(m_comOld.GetCurSel()==2&&m_comNew.GetCurSel()==2)//WGS-84 { ee=0.00669437999013; a=6378137.000; } N=a/sqrt(1.0-ee*sin(B)*sin(B)); X=(N+H)*cos(B)*cos(L); Y=(N+H)*cos(B)*sin(L); Z=(N*(1.0-ee)+H)*sin(B); m_strX1.Format(\ m_strY1.Format(\ m_strH1.Format(\} UpdateData(FALSE); }
void CDlgCoord::XYZtoBLH() //空间直角坐标->大地坐标 { UpdateData(); if(m_comOld.GetCurSel()==0&&m_comNew.GetCurSel()==0|| m_comOld.GetCurSel()==1&&m_comNew.GetCurSel()==1|| m_comOld.GetCurSel()==2&&m_comNew.GetCurSel()==2 ) //相同的椭球之间转算 { double L,X,Y,Z,ee,a,b; double p2=206264.806247; X=atof(m_strX0); Y=atof(m_strY0); Z=atof(m_strH0); if(m_comOld.GetCurSel()==0&&m_comNew.GetCurSel()==0)//北京-54 { ee=0.006693421622966; a=6378245.000; b=6356863.0187730473;} if(m_comOld.GetCurSel()==1&&m_comNew.GetCurSel()==1)//国家-80 {ee=0.006694384999588;a=6378140.000;b=6356755.2881575287;} if(m_comOld.GetCurSel()==2&&m_comNew.GetCurSel()==2)//WGS-84 {ee=0.00669437999013; a=6378137.000;b=6356752.3142; } L=atan(Y/X);//弧度 L=L*p2;//秒 double temp,N0,H0,B0,B1,H1,N1; //迭代 N0=a; H0=sqrt(X*X+Y*Y+Z*Z)-sqrt(a*b); temp=Z/(sqrt(X*X+Y*Y)*(1.0-(ee*N0)/(N0+H0)));//弧度 B0=atan(temp); B1=B0; H1=H0; do {H0=H1; B0=B1; N1=a/sqrt(1.0-ee*sin(B0)*sin(B0)); H1=sqrt(X*X+Y*Y)/cos(B0)-N1; temp=Z/(sqrt(X*X+Y*Y)*(1.0-(ee*N1)/(N1+H1))); B1=atan(temp); }while((B1-B0)*p2>0.00001||(H1-H0)>0.001); B0=B0*p2;//弧度->角度 秒 m_strX1=dtoBLH(B0); m_strY1=dtoBLH(L); m_strH1.Format(\}UpdateData(FALSE); }
void CDlgCoord::XYZtoXYZ()//空间直角坐标系->空间直角坐标系 { UpdateData(); double xo,yo,zo,k,ex,ey,ez;//七参数 double X0,Y0,Z0,X1,Y1,Z1; xo=g_xo; yo=g_yo; zo=g_zo; k=g_k; ex=g_ex; ey=g_ey; ez=g_ez; //CString cs; //测试 //cs.Format(\ //AfxMessageBox(cs); X0=atof(m_strX0); Y0=atof(m_strY0); Z0=atof(m_strH0); X1=xo+(1+k)*X0+ez*Y0-ey*Z0; Y1=yo+(1+k)*Y0-ez*X0+ex*Z0; Z1=zo+(1+k)*Z0+ey*X0-ex*Y0; m_strX1.Format(\ m_strY1.Format(\m_strH1.Format(\UpdateData(FALSE);
7
}
void CDlgCoord::OnChangeEditXold() //设置度分秒格式显示 { UpdateData(); CString cs; if(m_CoordTypeOld==1) { if(m_strX0.GetLength()==3) {cs=m_strX0; cs=cs+\m_strX0=cs; UpdateData(FALSE); m_ctrX0.SetSel(m_strX0.GetLength(),m_strX0.GetLength()); } if(m_strX0.GetLength()==6) {cs=m_strX0; cs=cs+\UpdateData(FALSE); m_ctrX0.SetSel(m_strX0.GetLength(),m_strX0.GetLength()); if(m_strX0.GetLength()==9) { cs=m_strX0;cs=cs+\ m_ctrX0.SetSel(m_strX0.GetLength(),m_strX0.GetLength()); } }
void CDlgCoord::OnChangeEditYold() //设置度分秒格式显示 { UpdateData(); CString cs; if(m_CoordTypeOld==1) { if(m_strY0.GetLength()==3) { cs=m_strY0;cs=cs+\ m_ctrY0.SetSel(m_strY0.GetLength(),m_strY0.GetLength()); if(m_strY0.GetLength()==6) {cs=m_strY0;cs=cs+\ m_ctrY0.SetSel(m_strY0.GetLength(),m_strY0.GetLength()); if(m_strY0.GetLength()==9) {cs=m_strY0;cs=cs+\ m_ctrY0.SetSel(m_strY0.GetLength(),m_strY0.GetLength()); } }
double CDlgCoord::stod(CString cs)//字符串的度分秒->浮点型 秒
{ CString css; css=\double va=0.0;css=cs.Mid(0,3); va=va+atof(css); css=cs.Mid(4,2); va=va+atof(css)/60.0; css=cs.Mid(7,cs.GetLength()-7); va=va+atof(css)/3600.0; va=va*3600.0; return va; }
CString CDlgCoord::dtoBLH(double d)//浮点型 秒->度分秒格式 { int d1,d2;//度 分 double d3;//秒 CString BLH,cs; cs=\ BLH=\度 cs.Format(\ cs=cs.Right(4); BLH=BLH+cs; d2=int(d/60.0-d1*60.0); //分 cs.Format(\cs=cs.Right(4); BLH=BLH+cs; d3=d-d1*3600.0-d2*60.0;//秒 cs.Format(\ BLH=BLH+cs; return BLH; }
8
}
} } } }