高斯投影坐标正反算编程报告

  • 格式:docx
  • 大小:71.30 KB
  • 文档页数:11

1

高斯投影坐标正反算编程报告

10021班 张鑫 学号:2010302590040

1. 编程思想

进行高斯投影坐标正反算的编程需要牵涉到大量的公式,为了使程序条理更清楚,各块的数据复用性更强,这里采取了结构化的编程思想。

程序由四大块组成。

GeodesyHomework.cpp文件用于存放main()函数,是整个程序的入口。通过结构化的编程尽力使main()函数变得简单。

MyFunction.h和MyFunction.cpp用于存放计算过程中进行角度弧度换算时所要用到的一些自定的转换函数。

Zhengsuan.h和Zhengsuan.cpp用于存放Zhengsuan类,在Zhengsuan类中声明了高斯投影坐标正算所要用到的所有变量,在类的构造函数中进行成员变量的初始化及正算计算。通过get函数获得相应的正算结果。

Fansuan.h和Fansuan.cpp用于存放Fansuan类,类似于Zhengsuan类,Fansuan类中声明了高斯投影坐标反算所要用到的所有变量,在类的构造函数中进行成员变量的初始化及反算计算。通过get函数获得相应的反算结果。

2. 计算模型

高斯投影正算公式

6425644223422)5861(cossin720)495(cos24cossin2lttBBNltBsimBNlBBNXx

5222425532233)5814185(cos120)1(cos6cosltttBNltBNlBNy

高斯投影反算公式

22242552233642542222328624285cos12021cos6cos459061720935242ffffffffffffffffffffffffffffftttBNytBNyBNylyttyNMtyttNMtyNMtBB 2

3. 程序框图

开始

输入B,L

求定带号N,中央纬度L0,纬度差l

按照实用公式计算x,y

换算为国家统一坐标X,Y

输出X,Y

输入国家统一坐标X,Y

由Y取定带号N,并换算出x,y

求出中央经线L0

按照实用公式计算B,l

L=L0+l求出大地经度L

输出B,L

结束 正算

反算 3

4. 计算结果

5. 附录:程序代码

/////主函数入口

GeodesyHomework.cpp

#include "MyFunction.h"

#include "Zhengsuan.h"

#include "Fansuan.h"

#include

using namespace std;

void fansuan();

void zhengsuan();

void main(){

zhengsuan();

fansuan();

printf("/n over!");

}

void zhengsuan(){

double myB,myL;

cout<<"【正算】"<

cout<<"请输入大地纬度B"<

myB=angleToDegree();

cout<<"请输入大地经度L"<

myL=angleToDegree();

Zhengsuan myZhengsuan1(myB,myL);

printf("Radian B=%f L=%f \n",myZhengsuan1.getrB(),myZhengsuan1.getrL()); 4

myZhengsuan1.printLocation();

}

void fansuan(){

double myX,myY;

cout<<"【反算】"<

cout<<"请输入国家统一坐标 X Y。例如 3378627.1819 20243953.4517"<

cin>>myX>>myY;

Fansuan myFansuan1(myX,myY);

myFansuan1.printLocation();

}

///自定功能函数库

MyFunction.h

#define PI 3.1415926

#include

using namespace std;

double angleToDegree(int du,int fen,float miao);

double angleToDegree();//将度分秒换算为度

double degreeToRadian(double degree);

double degreeToRadian();//将角度换算为弧度

MyFunction.cpp

#include "MyFunction.h"

double angleToDegree(int du,int fen,float miao){

double result=0;

result=miao/3600.0+fen/60.0+du;

return result;

}

double angleToDegree(){

int du,fen;

float miao;

double result;

cout<<"请输入度 分 秒。例如:30 20 00"<

cin>>du>>fen>>miao;

result=angleToDegree(du,fen,miao);

return result;

}

double degreeToRadian(double degree){

double result=0; 5

result=degree/57.295779513082321;

return result;

}

double degreeToRadian(){

double result,degree;

degree=angleToDegree();

result=degreeToRadian(degree);

return result;

}

///正算类

Zhengsuan.h

// Zhengsuan.h: interface for the Zhengsuan class.

//

//////////////////////////////////////////////////////////////////////

#if !defined(AFX_ZHENGSUAN_H__2655EA28_E810_44A3_8F14_56421A7B4466__INCLUDED_)

#define

AFX_ZHENGSUAN_H__2655EA28_E810_44A3_8F14_56421A7B4466__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#define rouSecond 206264.806247096355

#include "MyFunction.h"

#include

#include

using namespace std;

class Zhengsuan

{

public:

Zhengsuan();

Zhengsuan(double fB,double fL);

double getX();

double getY();

double getrB();

double getrL();

void printLocation();

virtual ~Zhengsuan();

private: 6

double x;

double y;//大地坐标

double X;

double Y;//国家统一坐标

double B;

double rB;

int Bsecond;

double L;

double rL;

//输入的大地纬度B,大地经度L,rB,rL为对应弧度表示值,Bsecond为换算成秒数值

int n;//带号n

double L0;//中央经线纬度L0

double LDot;//纬度差L-L0

int LDotSecond;//换算成秒的纬度差

double l;

double N;

double a0;

double a3;

double a4;

double a5;

double a6;//七个计算参数

};

#endif

// !defined(AFX_ZHENGSUAN_H__2655EA28_E810_44A3_8F14_56421A7B4466__INCLUDED_)

Zhengsuan.cpp

// Zhengsuan.cpp: implementation of the Zhengsuan class.

//

//////////////////////////////////////////////////////////////////////

#include "Zhengsuan.h"