|
|
// Ellipsoid.h: interface for the CProjectionGaussKruger class.
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
//主要功能:
|
|
|
// 投影转换
|
|
|
//
|
|
|
//程序编写: 2008-11-09
|
|
|
//
|
|
|
//
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
#if !defined(AFX_ELLIPSOID_H__B996064A_B913_4EA7_8BEF_846B8208C897__INCLUDED_)
|
|
|
#define AFX_ELLIPSOID_H__B996064A_B913_4EA7_8BEF_846B8208C897__INCLUDED_
|
|
|
|
|
|
#if _MSC_VER > 1000
|
|
|
#pragma once
|
|
|
#endif // _MSC_VER > 1000
|
|
|
|
|
|
#include "ConversionParameter.h"
|
|
|
|
|
|
/* 投影参数文件例子
|
|
|
c:>type Projection.ini
|
|
|
[ellipsoid]
|
|
|
克拉索夫斯基椭球
|
|
|
1967年大地坐标系
|
|
|
1975年大地坐标系
|
|
|
1980年大地坐标系
|
|
|
WGS-84(GPS定位系统)
|
|
|
|
|
|
[WGS-84(GPS定位系统)]
|
|
|
a=6378137
|
|
|
1/f=298.257223563
|
|
|
date=1984
|
|
|
append=GPS定位系统
|
|
|
|
|
|
[1967年大地坐标系]
|
|
|
a=6378160
|
|
|
1/f=298.247167
|
|
|
date=1967
|
|
|
append=1971年国际第三个推荐值
|
|
|
|
|
|
[1975年大地坐标系]
|
|
|
a=6378140
|
|
|
1/f=298.257
|
|
|
date=1975
|
|
|
append=1975年国际第三个推荐值
|
|
|
|
|
|
[1980年大地坐标系]
|
|
|
a=6378137
|
|
|
1/f=298.257
|
|
|
date=1979
|
|
|
append=1979年国际第四个推荐值
|
|
|
|
|
|
[克拉索夫斯基椭球]
|
|
|
a=6378245
|
|
|
1/f=298.3
|
|
|
date=1942
|
|
|
append=中国、苏联、朝鲜等
|
|
|
|
|
|
应用例子:CProjectionGaussKruger::Initial("Projection.ini","克拉索夫斯基椭球");
|
|
|
*/
|
|
|
|
|
|
//#define PI 3.14159265358979324
|
|
|
//#define RHO (180.0/PI)
|
|
|
|
|
|
class AFX_EXT_CLASS CEllipsoid
|
|
|
{
|
|
|
public:
|
|
|
CEllipsoid();
|
|
|
virtual ~CEllipsoid();
|
|
|
|
|
|
//当输入的椭球体与输出的椭球体不同时,进行初始化
|
|
|
//例子: Initial("Projection.ini","1967年大地坐标系","1980年大地坐标系");
|
|
|
int Initial(CString lpFileName, CString lpAppName, CString other);
|
|
|
|
|
|
//lpFileName为投影参数文件, lpAppName投影参数文件中的椭球名
|
|
|
int Initial(CString lpFileName,CString lpAppName);
|
|
|
int Initial(double m_a,double m_f);
|
|
|
|
|
|
CEllipsoid& operator =(CEllipsoid &es);
|
|
|
|
|
|
//L=经度,B=纬度,(X,Y,Z)直角坐标
|
|
|
void toBLH(double &XX,double &YY,double &ZZ); //
|
|
|
void toXYZ(double &B,double &L,double &H); //大地坐标计算空间大地直角坐标
|
|
|
double GetB(double &XX,double &YY,double &ZZ);
|
|
|
double GetM(double B); //子午圈曲率半径
|
|
|
double GetN(double B); //卯酉圈曲率半径
|
|
|
double GetR(double B); //平均曲率半径
|
|
|
double GetRA(double B); //任意法截线曲率半径
|
|
|
|
|
|
public:
|
|
|
CConversionParameter cp;//不同椭球体之间的转换参数
|
|
|
double pre;
|
|
|
double A0,B0,C0,D0;
|
|
|
double e2; //第
|
|
|
double a; //长半轴
|
|
|
double f; //扁平率倒数 f=(a-b)/a f=1/f
|
|
|
|
|
|
protected:
|
|
|
int Initial();
|
|
|
double arc_length_of_meridian(double B); //子午线弧长
|
|
|
double arc_length_of_meridian_reverse(double s);
|
|
|
};
|
|
|
|
|
|
//***************************** 高斯克吕格(横轴墨卡托)投影 *******************
|
|
|
class AFX_EXT_CLASS CProjectionGaussKruger : public CEllipsoid
|
|
|
{
|
|
|
public:
|
|
|
CProjectionGaussKruger();
|
|
|
CProjectionGaussKruger(double m_a,double m_f); //m_a为地球椭球长半轴,m_f为扁平率
|
|
|
virtual ~CProjectionGaussKruger();
|
|
|
|
|
|
//高斯投影正反变换
|
|
|
int GaussBL(double &x,double &y); //单位为弧度
|
|
|
int GaussXY(double &B,double &L);
|
|
|
int GaussXY(double &B, double &L,double L0); //单位为度
|
|
|
};
|
|
|
|
|
|
|
|
|
#endif // !defined(AFX_ELLIPSOID_H__B996064A_B913_4EA7_8BEF_846B8208C897__INCLUDED_)
|