实 验 报 告
高
斯
正
反
算
姓 名: 张杰
学 号: 20104157
班 级: 测绘10-1班
指导老师: 陶庭叶
目录
一、实 验 目 的-----------------2
二、实 验 内 容 及 步 骤--------2
三、程 序 代 码-----------------4
四、流 程 图--------------------24
五、运 算 结 果-----------------26
六、实 验 感 想-----------------29
一、实验目的
1、了解高斯正反算的基本思想。
2.学会编写高斯正反算程序,加深理解。
二、实验
及步骤
高斯投影正算公式是由大地坐标(L,B)求解高斯平面坐标(x,y),而高斯投影反算公式则是由高斯平面坐标(x,y)求解大地坐标(L,B)。现行的高斯投影用表都是采用克拉索夫斯基椭球参数,这次编程计算不仅采用这种椭球参数,还可以选择IAG椭球进行计算。 编程环境是在VC下,采用C++语言编写。程序主要分为两部分,第一部分是高斯正反算函数,第二部分是主函数。
三、程序代码
1.高斯投影正算
// mydlg1.cpp : implementation file
#include "stdafx.h"
#include "高斯正反算.h"
#include "mydlg1.h"
#include"math.h"
#define P 206264.8062471
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
Cmydlg1::Cmydlg1(CWnd* pParent /*=NULL*/)
: CDialog(Cmydlg1::IDD, pParent)
{
//{{AFX_DATA_INIT(Cmydlg1)
m_num1 = 0;
m_num2 = 0;
m_num3 = 0.0;
m_num4 = 0;
m_num5 = 0;
m_num6 = 0.0;
m_num7 = 0;
m_num8 = 0.0;
m_num9 = 0.0;
//}}AFX_DATA_INIT
}
void Cmydlg1::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(Cmydlg1)
DDX_Text(pDX, IDC_EDIT1, m_num1);
DDX_Text(pDX, IDC_EDIT2, m_num2);
DDX_Text(pDX, IDC_EDIT3, m_num3);
DDX_Text(pDX, IDC_EDIT4, m_num4);
DDX_Text(pDX, IDC_EDIT5, m_num5);
DDX_Text(pDX, IDC_EDIT6, m_num6);
DDX_Text(pDX, IDC_EDIT7, m_num7);
DDX_Text(pDX, IDC_EDIT8, m_num8);
DDX_Text(pDX, IDC_EDIT9, m_num9);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(Cmydlg1, CDialog)
//{{AFX_MSG_MAP(Cmydlg1)
ON_BN_CLICKED(IDC_RADIO1, OnRadio1)
ON_BN_CLICKED(IDC_RADIO2, OnRadio2)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Cmydlg1 message handlers
void Cmydlg1::OnRadio1()
{
// TODO: Add your control notification handler code here
}
void Cmydlg1::OnRadio2()
{
// TODO: Add your control notification handler code here
}
void Cmydlg1::OnButton2()
{
// TODO: Add your control notification handler code here
CEdit* pedt1 = (CEdit*)GetDlgItem(IDC_EDIT1);
pedt1->SetWindowText("");
CEdit* pedt2 = (CEdit*)GetDlgItem(IDC_EDIT2);
pedt2->SetWindowText("");
CEdit* pedt3 = (CEdit*)GetDlgItem(IDC_EDIT3);
pedt3->SetWindowText("");
CEdit* pedt4 = (CEdit*)GetDlgItem(IDC_EDIT4);
pedt4->SetWindowText("");
CEdit* pedt5= (CEdit*)GetDlgItem(IDC_EDIT5);
pedt5->SetWindowText("");
CEdit* pedt6 = (CEdit*)GetDlgItem(IDC_EDIT6);
pedt6->SetWindowText("");
CEdit* pedt7 = (CEdit*)GetDlgItem(IDC_EDIT7);
pedt7->SetWindowText("");
CEdit* pedt8 = (CEdit*)GetDlgItem(IDC_EDIT8);
pedt8->SetWindowText("");
CEdit* pedt9 = (CEdit*)GetDlgItem(IDC_EDIT9);
pedt9->SetWindowText("");
}
void Cmydlg1::OnCancel()
{
// TODO: Add extra cleanup here
CDialog::OnCancel();
}
void Cmydlg1::OnButton1()
{
// TODO: Add your control notification handler code here
double N,a0,a3,a4,a5,a6,B,L,l,x,y;
UpdateData();
B=m_num1*3600+m_num2*60+m_num3;
L=m_num4*3600+m_num5*60+m_num6;
B=B/P;
l=(L-m_num7*3600)/P;
N=6399698.902-(21562.267-(108.973-0.612*cos(B)*cos(B))*cos(B)*cos(B))*cos(B)*cos(B);
a0=32140.404-(135.3302-(0.7092-0.0040*cos(B)*cos(B))*cos(B)*cos(B))*cos(B)*cos(B);
a4=(0.25+0.00252*cos(B)*cos(B))*cos(B)*cos(B)-0.04166;
a6=(0.166*cos(B)*cos(B)-0.084)*cos(B)*cos(B);
a3=(0.3333333+0.001123*cos(B)*cos(B))*cos(B)*cos(B)-0.1666667;
a5=0.0083-(0.1667-(0.1968+0.0040*cos(B)*cos(B))*cos(B)*cos(B))*cos(B)*cos(B);
x=6367558.4969*B-(a0-(0.5+(a4+a6*l*l)*l*l)*l*l*N)*sin(B)*cos(B);
y=(1+(a3+a5*l*l)*l*l)*l*N*cos(B);
m_num8=x;
m_num9=y;
UpdateData(FALSE);
}
void Cmydlg1::OnButton3()
{
// TODO: Add your control notification handler code here
double N,a0,a3,a4,a5,a6,B,L,l,x,y;
UpdateData();
B=m_num1*3600+m_num2*60+m_num3;
L=m_num4*3600+m_num5*60+m_num6;
B=B/P;
l=(L-m_num7*3600)/P;
N=6399596.652-(21565.045-(108.996-0.603*cos(B)*cos(B))*cos(B)*cos(B))*cos(B)*cos(B);
a0=32144.5189-(135.3646-(0.7034-0.0041*cos(B)*cos(B))*cos(B)*cos(B))*cos(B)*cos(B);
a4=(0.25+0.00253*cos(B)*cos(B))*cos(B)*cos(B)-0.04167;
a6=(0.167*cos(B)*cos(B)-0.083)*cos(B)*cos(B);