/* 参数说明
所有投影转换公式都基于椭球体
椭球体长半轴
北京54 a = 6378245
西安80 a = 6378140
WGS 84 a = 6378137
椭球体短半轴
北京54 b = 6356863.0188
西安80 b = 6356755.2882
WGS 84 b = 6356752.3142
扁率 f = (a - b) / a
第一偏心率 e = sqrt(1 - (b / a) * (b / a))
第二偏心率 e' = sqrt((a / b) * (a / b) - 1)
卯酉圈曲率半径 N = (a * a / b) / sqrt(1 + e' * e' * cosβ * cosβ
子午圈曲率半径 R = a * (1 - e * e) / sqrt((1 - e * e * sinβ * sinβ) * (1 - e * e * sinβ * sinβ) * (1 - e * e * sinβ * sinβ))
B -- 纬度,L -- 经度,单位弧度(RAD)
N X -- 纵直角坐标, E Y -- 横直角坐标,单位米(M)
//*/publicstaticdouble L0; // 中央经度// 高斯 - 克吕格投影比例因子publicstaticdouble k0 = 1;
publicstaticlong eastdiff= 500000L;
publicstaticlong northdiff= 0L;
publicstaticint degreeindex=0;
// 高斯投影转换//void GaussCalc(double L, double B, double& X, double& Y)publicdouble[] GaussToBLToGauss(double L, double B)
{
double[] xyval={0.0,0.0};
double X, Y;
// 椭球体短半轴//double a = 6378245; // 北京54//double b = 6356863.0188; // 北京54//double a = 6378140; // 西安80//double b = 6356755.2882; // 西安80double a = 6378137; // WGS 84double b = 6356752.3142; // WGS 84double f = (a - b) / a; // 扁率double e = 1 - (b / a) * (b / a); // 第一偏心率平方double e2 = (a / b) * (a / b) - 1; // 第二偏心率平方double dblPI = 3.1415926535898 / 180.0; // 角度弧度转换参数// 求经度所在带号int ZoneWide = 3; // 带宽 3度带或6度带int ZoneNumber; // 带号if (3 == ZoneWide)
{// 3度带
ZoneNumber = (int)(L - ZoneWide / 2) / ZoneWide + 1;
}
else// if (6 == ZoneWide)
{// 6度带
ZoneNumber = (int)(L) / ZoneWide + 1;
}
// 角度转换成弧度double L1 = L * dblPI;
double B1 = B * dblPI;
L0 = L0 * dblPI;
// 子午圈曲率半径double R = a * (1 - e) / Math.sqrt((1 - e * Math.sin(B1) * Math.sin(B1)) * (1 - e * Math.sin(B1) * Math.sin(B1)) * (1 - e * Math.sin(B1) * Math.sin(B1)));
double T = Math.tan(B1) * Math.tan(B1);
double C = e2 * Math.cos(B1) * Math.cos(B1);
double A = (L1 - L0) * Math.cos(B1);
// 子午线弧长double M = a * ((1 - e / 4 - 3 * e * e / 64 - 5 * e * e * e / 256) * B1
- (3 * e / 8 + 3 * e * e / 32 + 45 * e * e * e / 1024) * Math.sin(2 * B1)
+ (15 * e * e / 256 + 45 * e * e * e / 1024) * Math.sin(4 * B1)
- (35 * e * e * e / 3072) * Math.sin(6 * B1));
// 卯酉圈曲率半径double N = a / Math.sqrt(1 - e * Math.sin(B1) * Math.sin(B1));
// 东纬度偏移double FE = ZoneNumber * 1000000L + eastdiff;
// 根据投影公式计算点在投影坐标系中的位置
Y= FE + k0 * N * (A + (1 - T + C) * A * A * A / 6 + (5 - 18 * T + T * T + 14 * C - 58 * T * C) * A * A * A * A * A / 120);
X = northdiff+k0 * (M + N * Math.tan(B1) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24)
+ (61 - 58 * T + T * T + 270 * C - 330 * T * C) * A * A * A * A * A * A / 720);
xyval[0] = X ; xyval[1] =Y;
return xyval;
}