利用七参数进行CGCS2000坐标系到西安80坐标系的转换

利用七参数进行CGCS2000坐标系到西安80坐标系的转换问题 因为工作 需要把 CGCS2000 坐标系下的坐标转到西安 80 坐标系下 中间由于用到了七参数 所以要进经过到空间直角坐标系的转换 然后再转换到西安 80 大地坐标下 最后再投影到西安 80 坐标的某度带 要求是输入 CGCS2000 下的大地坐标 最后输出西安 80 下的平面坐标 那么这项工作可以分为以下几个步骤 1 CGCS2000 下的大地坐标到 CGCS2000 下的空间直角坐标的转换

问题

大地坐标到空间直角坐标的转换

  private double[] dd2kjzj(double[] dd){ double a=,b=.314; double ee=(a*a-b*b)/(a*a); double L=Math.toRadians(dd[0]),B=Math.toRadians(dd[1]),H=dd[2]; double N=a/Math.sqrt(1-ee*Math.sin(B)*Math.sin(B)); double X=(N+H)*Math.cos(B)*Math.cos(L); double Y=(N+H)*Math.cos(B)*Math.sin(L); double Z=(N*(1-ee)+H)*Math.sin(B); return new double[]{X,Y,Z}; } 

注:函数里面的a,b的值是CGCS2000(和WGS84相同)下的。其他坐标系下的大地坐标向空间直角坐标的转换公式都是相同的,只是ab的值需要改动。

利用七参数进行坐标转换

 /*七参数运算*/ private double[] qicanshu(double[] source){ double tX,tY,tZ; tX=dx+source[0]*(1+k)+Oz*source[1]-Oy*source[2]; tY=dy+source[1]*(1+k)-Oz*source[0]+Ox*source[2]; tZ=dz+source[2]*(1+k)+Oy*source[0]-Ox*source[1]; return new double[]{tX,tY,tZ}; } 

空间直角坐标到大地坐标的转换

 private double[] kjzj2dd(double[] kjzj){ double X=kjzj[0],Y=kjzj[1],Z=kjzj[2]; double a=; double f=1/298.257; double e2=2*f-f*f; //e^2; double L=Math.toDegrees(Math.atan(Y/X)+Math.PI); double B2=Math.atan(Z/Math.sqrt(X*X+Y*Y)); double B1; double N; while (true){ N=a/Math.sqrt(1-f*(2-f)*Math.sin(B2)*Math.sin(B2)); B1=Math.atan((Z+N*f*(2-f)*Math.sin(B2))/Math.sqrt(X*X+Y*Y)); if(Math.abs(B1-B2)<0.0000000001) break; B2=B1; } double H=Z/Math.sin(B2)-N*(1-e2); double B=Math.toDegrees(B2); return new double[]{L,B,H}; } 

高斯投影(正算)

在得到西安80坐标下的大地坐标后,需要进行高斯投影,这样才能够得到平面坐标。由于这个计算公式更加的复杂,公式什么的就不再列了。

 //只适用于西安80下的坐标投影,代码来源于互联网,经测试还不错 private double[] dd2pm(double[] dd){ double L=Math.toRadians(dd[0]),B=Math.toRadians(dd[1]); //辅助量 double cosB = Math.cos(B); double sinB = Math.sin(B); double cosB_2 = cosB * cosB; double l = L - Math.toRadians(Lo); double ll = l * l; //计算系数 double N = .652 - (21565.045 - (108.996 - 0.603 * cosB_2) * cosB_2) * cosB_2; double a0 = 32144.5189 - (135.3646 - (0.7034 - 0.0041 * cosB_2) * cosB_2) * cosB_2; double a4 = (0.25 + 0.00253 * cosB_2) * cosB_2 - 0.04167; double a6 = (0.166 * cosB_2 - 0.084) * cosB_2; double a3 = (0. + 0.001123 * cosB_2) * cosB_2 - 0.; double a5 = 0.00878 - (0.1702 - 0.20382 * cosB_2) * cosB_2; //计算高斯平面坐标值 double x = .1328 * B - (a0 - (0.5 + (a4 + a6 * ll) * ll) * ll * N) * cosB * sinB; double y = (1 + (a3 + a5 * ll) * ll) * l * N * cosB + ; double[] xy = new double[2]; xy[0] = x; xy[1] = y; return xy; } 

这段代码只适用于IAG75(即西安80)下的高斯投影,其他的坐标系下的投影需要修改下参数。

总结

 链接:https://pan.baidu.com/s/1sdglmFpIOhjTZvvp4zX_SQ 提取码:cmyz 

使用方法

 // 首先获取该类的实例 CoordsTransformer coordsTransformer=CoordsTransformer.getInstance(); // 然后获取运行结果 double[] resutls=coordsTransformer.fromCgcs2Xian80(119.,28.,112.66); 

如果数据量比较多的话,后面这句可以放在一个循环里面。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/198573.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午2:54
下一篇 2026年3月26日 下午2:54


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号