1、程序主界面
![](https://i-blog.csdnimg.cn/blog_migrate/337e1c2ddf2e3525d3252958209d738c.png)
2、控件变量说明
public:
CString X;//空间直角坐标系X坐标
CString Y;//空间直角坐标系Y坐标
CString Z;//空间直角坐标系Z坐标
CString dB;//大地坐标系B坐标
CString dL;//大地坐标系H坐标
CString dH;//大地坐标系L坐标
3、主要函数
void CcoordinatetransformationDescartesandGeodeticDlg::OnBnClickedButton1()//空间转大地
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
double a = 6378137;//长半径
double a1 = 1 / 298.257223563;//扁率
double e = sqrt(2 * a1 - a1 * a1);//第一偏心率
double X1 = 0, Y1 = 0, Z1 = 0;
X1 = _ttof(X); Y1 = _ttof(Y); Z1 = _ttof(Z);//字符串CString转double
double dL1 = 0;
dL1 = atan(Y1 / X1);
dL1 = dL1 * 180 / PI;//弧度转十进制度
dL.Format(_T(" % .6f"), dL1);
double dH0 = 0;//定义大地高迭代高旧值
double dS = sqrt(X1 * X1 + Y1 * Y1);
double dB0 = atan(Z1 / dS * (1 - e * e));//定义纬度迭代值旧值,并以大地高dH=0时计算其初值
double dh = 0;//定义大地高迭代新旧值之差
double dH1 = 0;//定义大地高迭代值
double dB1 = 0;//定义纬度迭代值
do
{
double W = sqrt(1 - e * e * sin(dB0) * sin(dB0));
double N = a / W;
dH1 = dS / cos(dB0) - N;
dB1 = atan(Z1 / (dS * (1 - e * e * N / (N + dH1))));
dh = dH1 - dH0;
dH0 = dH1;
dB0 = dB1;
} while (fabs(dh) >= 0.0001);//H精度达到0.0001结束迭代
dH.Format(_T("%.6f"), dH1);
dB1 = dB1 * 180 / PI;//弧度转十进制度
dB.Format(_T("%.6f"), dB1);
UpdateData(FALSE);
}
void CcoordinatetransformationDescartesandGeodeticDlg::OnBnClickedButton2()//大地转空间
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
double a = 6378137;
double a1 = 1 / 298.257223563;
double e = sqrt(2 * a1 - a1 * a1);
double dB1 = _ttof(dB) / 180.0 * PI;//十进制度转弧度
double dL1 = _ttof(dL) / 180.0 * PI;//十进制度转弧度
double dH1 = _ttof(dH);
double W = sqrt(1 - e * e * sin(dB1) * sin(dB1));
double N = a / W;
X.Format(_T("%.4f"),(N + dH1) * cos(dB1) * cos(dL1));
Y.Format(_T("%.4f"),(N + dH1) * cos(dB1) * sin(dL1));
Z.Format(_T("%.4f"),(N * (1 - e * e) + dH1) * sin(dB1));
UpdateData(FALSE);
}
void CcoordinatetransformationDescartesandGeodeticDlg::OnBnClickedButton3()//清除
{
// TODO: 在此添加控件通知处理程序代码
GetDlgItem(IDC_EDIT1)->SetWindowText(_T(""));
GetDlgItem(IDC_EDIT3)->SetWindowText(_T(""));
GetDlgItem(IDC_EDIT4)->SetWindowText(_T(""));
GetDlgItem(IDC_EDIT5)->SetWindowText(_T(""));
GetDlgItem(IDC_EDIT6)->SetWindowText(_T(""));
GetDlgItem(IDC_EDIT2)->SetWindowText(_T(""));
}
4、空间直角坐标转大地坐标运行效果
![](https://i-blog.csdnimg.cn/blog_migrate/020ec4c51026adbe9fe0e0eab85370fe.png)
5、大地坐标转空间直角坐标运行效果
![](https://i-blog.csdnimg.cn/blog_migrate/6feb9c085e5a25b948f27e7c10bf1abe.png)
6、参考公式
![](https://i-blog.csdnimg.cn/blog_migrate/d459e598d2636075f194db5d030528e0.png)