chenyang373 于 2016.03.04 18:03 提问

``````    下面是高斯正算的代码，可以实现BL到54的转换，没有问题，我现在要实现BL到80的转换，我应该怎么改椭球参数呢？

const double PI = Math.PI; //定义圆周率
const double rho = 206264.806247096355;
/// <summary>
/// 高斯正算
/// </summary>
/// <param name="B">纬度(度)</param>
/// <param name="L">经度(度)</param>
/// <param name="num">带号</param>
public double[] CalculateEllipse2plane(double B,double L,double num)
{
AngleCalculate ac = new AngleCalculate(); //用于角度弧度转换

double l,L0,a0,a3,a4,a5,a6,n,c;
l = 0;L0 = 0;a0 = 0;a3 = 0;a4 = 0;a5 = 0;a6 = 0;n = 0;c = 0;
double x,y;
x = 0;y = 0;
double m, p;
m = 0;p = 0;
int N;//带号
N = 0;
//判断带号
if(num == 6)
{
N = (int)L/6;//带号
L0 = 6*N-3;//中央子午线
}
else
{
N = (int)((L+1.5)/3); //3度带号
L0 = 3*N;//3度中央子午线
}

bool sign = true;

l = (L - L0) * 3600/rho; //单位秒

if (l < 0) sign = false;

B = ac.AngleToArc(B);//将纬度化为弧度
L = ac.AngleToArc(L);//将经度化为弧度
L0 = ac.AngleToArc(L0);//将中央子午线转为弧度

l = Math.Pow(l,2);
c = Math.Pow(Math.Cos(B),2); //Cos(B)的平方
//n = 6399596.651988010- (21562.267 - (108.973 - 0.612 * c) * c) * c;
n = 6399698.902-(21562.267-(108.973-0.612 * c)*c)*c;
a0 = 32140.404-(135.3302-(0.7092-0.0040*c)*c)*c;
a3 =(0.3333333+0.001123*c)*c-0.1666667;
a4 = (0.25+0.00252*c)*c-0.04166;
a5=0.0083-(0.1667-(0.1968+0.004*c)*c)*c;
a6=(0.166*c-0.084)*c;
//计算平面坐标并化为国家统一坐标
m=Math.Sin(B)*Math.Cos(B);
p = 1+(a3+a5*l)*l;
x=6367558.4969*B-(a0-(0.5+(a4+a6*l)*l)*l*n)*m;
y=(p)*Math.Sqrt(l)*n*Math.Cos(B);

if (sign)
{
y = y + 500000 + N * 1000000; //加上常数改正，和带号
}
else
{
y =  (500000 - y) + N * 1000000; //加上常数改正，和带号
}

double[] CalculateResult = new double[2];
CalculateResult[0] = x;
CalculateResult[1] = y;

return CalculateResult;
}
``````
``````
``````

1个回答

caozhy      2016.03.06 08:08

2008-05-28 16:03:29 | 高斯投影正反算的代码 //高斯投影正、反算 //////6度带宽 54年北京坐标系 //高斯投影由经纬度(UnitD)反算大地坐标(含带号，Unit:Metres) void GaussProjCal(double longitude, double latitude, double *X, doubl

matlab编写的高斯投影正算代码. 以经度和纬度为输入，在代码中修改中央子午线的数值和选用的坐标系信息，即可得到相应的高斯投影平面坐标. 已实测可用.

//高斯投影正、反算 //////6度带宽 54年北京坐标系 //高斯投影由经纬度(Unit:DD)反算大地坐标(含带号，Unit:Metres) void GaussProjCal(double longitude, double latitude, doubl
C#实现批量高斯投影正算、反算
​欢迎关注博主的微信公众号：跟着MO学习GIS 批量计算有利于提高工作/学习效率，本文以EPSG提供《Coordinate Conversions and Transformations including Formulas》 的高斯投影正算、反算算法写成c#代码为例。。 // 高斯投影反算，将高斯坐标反算出经纬度坐标 class Gausstojw {

§8.3高斯投影坐标正反算公式 任何一种投影①坐标对应关系是最主要的；②如果是正形投影，除了满足正形投影的条件外（C-R偏微分方程），还有它本身的特殊条件。 8.3.1高斯投影坐标正算公式：  高斯投影必须满足以下三个条件： ①中央子午线投影后为直线；②中央子午线投影后长度不变；③投影具有正形性质，即正形投影条件。 由第一条件知中央子午线东西两侧的投影必然对称于中央子午线，即(8-1

////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// const double FN = 0.;//南半球FN ＝ 1000000. const double k0 = 1.;//UTM投影中k0=0.9996 gs::gs() { } gs::~gs() { } //初始化坐标系统，并告诉程序您要使用的是3度带还是6度带 void gs::InitCordSys(enum gs::CordParam cord,enum gs::ProjKind projKind) { switch(cord){ case BeiJing1954: { m_a = 6378245.; m_b = 6356863.0188; } break; case XiAn1980: { m_a = 6378140.; m_b = 6356755.2882; } break; case WGS84: { m_a = 6378137.; m_b = 6356752.3142; } break; }