WGS84转CGS2000
public static Point WGS84ToCGS2000(double longitude, double latitude)//参数 经度,纬度 { Point pt = null; double[] output = new double[2]; double longitude1,latitude1, longitude0, X0,Y0, xval,yval; //NN在测量学中,用N表示曲率半径 //M测量学用大X表示子午线弧长。 //fai底点纬度由子午弧长反算公式得到,用于测量Bf表示 //R曲率半径,测量学里用Nf表示 double a,f, e2,ee, NN, T,C,A, M, iPI; iPI = 0.0174532925199433; //3.1415926535898/180.0; a=6378137.0; f=1/298.257222101; //CGCS2000坐标系参数 //a=6378137.0; f=1/298.2572236; //wgs84坐标系参数 longitude0 = 117./中央子午线 根据实际情况进行配置 longitude0 = longitude0 * iPI ;///中央子午线转换为弧度 longitude1 = longitude * iPI ; ///经度转化为弧度 latitude1 = latitude * iPI ; //纬度转换为弧度 e2=2*f-f*f; ee=e2*(1.0-e2); NN=a/Math.sqrt(1.0-e2*Math.sin(latitude1)*Math.sin(latitude1)); T=Math.tan(latitude1)*Math.tan(latitude1); C=ee*Math.cos(latitude1)*Math.cos(latitude1); A=(longitude1-longitude0)*Math.cos(latitude1); M=a*((1-e2/4-3*e2*e2/64-5*e2*e2*e2/256)*latitude1-(3*e2/8 3*e2*e2/32 45*e2*e2 *e2/1024)*Math.sin(2*latitude1) (15*e2*e2/256 45*e2*e2*e2/1024)*Math.sin(4*latitude1)-(35*e2*e2*e2/3072)*Math.sin(6*latitude1)); xval = NN*(A (1-T C)*A*A*A/6 (5-18*T T*T 72*C-58*ee)*A*A*A*A*A/120); yval = M NN*Math.tan(latitude1)*(A*A/2 (5-T 9*C 4*C*C)*A*A*A*A/24 (61-58*T T*T 600*C-330*ee)*A*A*A*A*A*A/720); X0 = 500000L; Y0 = 0; xval = xval X0; yval = yval Y0; //转换为投影 output[0] = xval; output[1] = yval; pt = new Point(output[0],output[1]); return pt; }
CGS2000转WGS84
private static double formatby6(double num) { String result = String.format("%.6f", num); return Double.valueOf(result); } //2000转84 public static Point CGS2000ToWGS84(double X, double Y) { Point pt = null; double L0 = 117.//中央子午线应根据实际情况设置 double lat ,lon; Y-=500000; double [] result = new double[2]; double iPI = 0.0174532925199433;//pi/180 double a = 6378137.0; //长半轴 m double b = 6356752.31414; //短半轴 m double f = 1/298.257222101;//扁率 a-b/a double e = 0.0818191910428; //第一偏心率 Math.sqrt(5) double ee = Math.sqrt(a*a-b*b)/b; //第二偏心率 double bf = 0; ///底点纬度 double a0 = 1 (3*e*e/4) (45*e*e*e*e/64) (175*e*e*e*e*e*e/256) (11025*e*e*e*e*e*e*e*e/16384) (43659*e*e*e*e*e*e*e*e*e*e/65536); double b0 = X/(a*(1-e*e)*a0); double c1 = 3*e*e/8 3*e*e*e*e/16 213*e*e*e*e*e*e/2048 255*e*e*e*e*e*e*e*e/4096; double c2 = 21*e*e*e*e/256 21*e*e*e*e*e*e/256 533*e*e*e*e*e*e*e*e/8192; double c3 = 151*e*e*e*e*e*e*e*e/6144 151*e*e*e*e*e*e*e*e/4096; double c4 = 1097*e*e*e*e*e*e*e*e/131072; bf = b0 c1*Math.sin(2*b0) c2*Math.sin(4*b0) c3*Math.sin(6*b0) c4*Math.sin(8*b0); // bf =b0 c1*sin2b0 c2*sin4b0 c3*sin6b0 c4*sin8b0 ... double tf = Math.tan(bf); double n2 = ee*ee*Math.cos(bf)*Math.cos(bf); ///bf余弦平方 double c = a*a/b; double v=Math.sqrt(1 ee*ee*Math.cos(bf)*Math.cos(bf)); double mf = c/(v*v*v); //子午圈半径 double nf = c/v;//毛酉圈半径 //纬度计算 lat=bf-(tf/(2*mf)*Y)*(Y/nf) * (1-1/12*(5 3*tf*tf n2-9*n2*tf*tf)*(Y*Y/(nf*nf)) 1/360*(61 90*tf*tf 45*tf*tf*tf*tf)*(Y*Y*Y*Y/(nf*nf*nf*nf))); ///经度偏差 lon=1/(nf*Math.cos(bf))*Y -(1/(6*nf*nf*nf*Math.cos(bf)))*(1 2*tf*tf n2)*Y*Y*Y (1/(120*nf*nf*nf*nf*nf*Math.cos(bf)))*(5 28*tf*tf 24*tf*tf*tf*tf)*Y*Y*Y*Y*Y; result[0] =formatby6(lat/iPI); result[1] =formatby6(L0 lon/iPI); //System.out.println(result[1] "," result[0]); pt = new Point(result[1],result[0]); return pt; }