java实现CGS2000大地坐标和WGS84经纬度坐标互转,亲测准确

WGS84转CGS2000

中央子午线需要根据实际设置,参数为经度,纬度,输出值为经度(x),纬度(y)

    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

中央子午线需根据实际设置,输入参数为纬度,经度,输出result的顺序为result[0]纬度(y),result[1]经度(x)

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;
    }

  • 9
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 65
    评论
WGS84CGS2000、BJS54和XA80都是地理空间坐标参考系统的名称,不同的坐标参考系统适用于不同的地理区域,用于描述和表示地球表面上的点或区域的位置。这些参考系统是根据不同的测量方法和地球模型来定义的。 模型转换是指将一个坐标参考系统的坐标转换为另一个参考系统的过程。例如,将某个点的坐标WGS84转换CGS2000,或者从BJS54转换为XA80等。这种转换可以通过使用各种地理工具和软件来完成。 在进行模型转换时,需要考虑两个参考系统之间的差异。其中,WGS84是全球通用的坐标参考系统,用于GPS定位和大多数地图显示。CGS2000是中国采用的坐标参考系统,适用于全国范围的测绘和地理信息系统。BJS54是北京市采用的坐标参考系统,适用于北京市的测绘和地理信息系统。XA80是西安市采用的坐标参考系统,适用于西安市的测绘和地理信息系统。 为了进行模型转换,需要使用具有相应坐标系转换功能的地理工具或软件。这些工具可以通过输入源坐标系和目标坐标系的参数,将一组点的坐标从一个参考系统转换为另一个参考系统。转换后的坐标可以用于在不同的地理信息系统中进行分析和应用。 总之,WGS84CGS2000、BJS54和XA80是地理空间坐标参考系统的名称,模型转换是将一个坐标参考系统的坐标转换为另一个参考系统的过程。这种转换可以通过使用地理工具和软件完成,以便在不同的地理信息系统中进行分析和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 65
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值