上等猪头肉 2022-11-23 09:55 采纳率: 0%
浏览 89
已结题

大地坐标CGCS2000转换百度地图经纬度。

问题遇到的现象和发生背景

我想包大地坐标转为百度地图能识别的经纬度。如果实现。
坐标系采用国家CGCS2000大地坐标椭球,中央子午线111°22′40〃;高程系统采用1985国家高程基准。
比如大地坐标 x 4092101.61399382 y 478855.657756917
转换为 百度地图识别的经纬度。

用代码块功能插入代码,请勿粘贴截图

无代码

我想要达到的结果

百度地图能识别的坐标并且在吕梁市地区的位置坐标

  • 写回答

2条回答 默认 最新

  • Jackyin0720 2022-11-23 10:51
    关注

    【java代码实现CGCS2000大地坐标系XY值转化为对应经纬度】
    代码参考:

     
    public static double [] xytolatlon(double X, double Y ,double L0) {
            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] =retain6(lat/iPI);
            result[1] =retain6(L0+lon/iPI);
            //System.out.println(result[1]+","+result[0]);
            return result;
        }
    
    private static double retain6(double num) {
            String result = String.format("%.6f", num);
            return Double.valueOf(result);
        }
    
    

    【注意输入的XY值与给定的值相反,则参数X为已知的Y,参数Y为已知的X。

    得出的结果为 [纬度,经度],不要应用错误。】

    评论

报告相同问题?

问题事件

  • 系统已结题 12月1日
  • 创建了问题 11月23日