问题

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

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

根据转换公式:

  private double[] dd2kjzj(double[] dd){double a=6378137,b=6356752.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的值需要改动。

利用七参数进行坐标转换

得到空间直角坐标后就可以利用七参数进行坐标转换了。具体的七参数求解这里不进行讨论,有意向的网友可以自行百度。转换公式如下图所示:
  
  经 猫醉 提醒,上图中a1为缩放因子,a2, a3, a4分别为xyz的旋转量(感谢)。

    /*七参数运算*/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};}

方法中的source数组是CGCS2000坐标系下的空间直角坐标
  dx,dy,dz是偏移量
  Ox,Oy,Oz是旋转量
  k是缩放因子

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

这个转换就是前面所示的逆运算,如下图

  转换比较复杂,需要进行迭代运算。

    private double[] kjzj2dd(double[] kjzj){double X=kjzj[0],Y=kjzj[1],Z=kjzj[2];double a=6378140;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 = 6399596.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.3333333 + 0.001123 * cosB_2) * cosB_2 - 0.1666667;double a5 = 0.00878 - (0.1702 - 0.20382 * cosB_2) * cosB_2;//计算高斯平面坐标值double x = 6367452.1328 * B - (a0 - (0.5 + (a4 + a6 * ll) * ll) * ll * N) * cosB * sinB;double y = (1 + (a3 + a5 * ll) * ll) * l * N * cosB + 500000;double[] xy = new double[2];xy[0] = x;xy[1] = y;return xy;}

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

总结

至此,左右的转换已经完成。用了大概一周吧(中间有很长一段时间纠结于误差大的惊人,今天才知道甲方给的测试数据有问题),算是复习了下专业知识。
  下载源代码

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

使用方法

(补充自2018年4月19日)
程序是用java写的,封装成了CoordsTransformer 类。如果要用于C#、Python语言需要自行修改。

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

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

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

  1. WGS84坐标系转为西安80坐标系的解决方式

     1.我国常用坐标系:WGS84坐标系和西安80坐标系. WGS84坐标系:World Geodetic System 1984,是为GPS全球定位系统使用而建立的坐标系统.它的几何意义是:坐标系 ...

  2. 东北天坐标系、西安80坐标系如何在mars3d加载?

    问题场景 1.地图模型是东北天坐标系,在mars3d中加载出来,但是高程不对,这个怎么转换呢? 问题 1.东北天坐标系.西安80坐标系如何在mars3d中加载,有方法介绍吗?看了开发教程的坐标系说明, ...

  3. [转]地理投影,常用坐标系详解、WGS84、WGS84 Web墨卡托、WGS84 UTM、北京54坐标系、西安80坐标系、CGCS2000坐标系...

    转自:http://www.rivermap.cn/docs/show-1829.html 常用坐标系详解 (一)WGS84坐标系 WGS-84坐标系(World Geodetic System一19 ...

  4. WGS84 CGCS2000 北京54 西安80 大地坐标精确转换

    大地坐标转换 坐标转换主要应用在工程测量以及GIS相关的很多领域.不用的领域对其转换的精度要求也不一样,在使用GOOLE EARTH时或者GIS地图中,精度在几米内都能接受.而工程测量中精度就要求较高 ...

  5. 北京54坐标系和西安80坐标系转WGS84坐标系

    用布尔沙七参数转,首先得计算七参数,获取已知点计算,这个coord软件有,不用多说 布尔沙七参转换代码 /// <summary>/// 布尔莎七参转换/// </summary&g ...

  6. 在ArcGIS中的西安80坐标系转北京54坐标系

    一.数据说明 本次投影变换坐标的源数据采用的是采用1980西安的地理坐标系统,1985国家高程基准的1:50000的 DLG数据. 二.投影变换基础知识准备 北京54坐标系和西安80坐标系之间的转换其 ...

  7. 西安80坐标系转换工具

    西安80坐标系转换工具 利用ARCGIS进行自定义坐标系和投影转换 ARCGIS种通过三参数和其参数进行精确投影转换 注意:投影转换成80坐标系需要下载无偏移卫星图像进行转换,有偏移的转换将导致转换后 ...

  8. 如何将下载的影像变换为西安80坐标系

    如何将下载的影像变换为西安80坐标系 发布时间:2018-01-17 版权: 同步视频教程:投影转换(转西安80)  视频教程:如何选择中央子午线或者分度带 利用ARCGIS进行自定义坐标系和投影转换 ...

  9. 西安80坐标系与北京54坐标转换1

    西安80坐标系与北京54坐标系其实是一种椭球参数的转换作为这种转换在同一个椭球里的转换都是严密的,而在不同的椭球之间的转换是不严密,因此不存在一套转换参数可以全国通用的,在每个地方会不一样,因为它们是 ...

最新文章

  1. 新建html带参数,本地html加载时带参数的问题
  2. php 检测服务器网速_php测试用户网速
  3. 告别CPU,加速100-1000倍!只用GPU就能完成物理模拟和强化学习训练
  4. jzoj100047-基因变异【位运算,bfs】
  5. 前端学习(2331):angular之图片的使用
  6. 图像分割中dc_loss忽视标签实现
  7. 用汇编的眼光看C++(之class构造、析构)
  8. oracle获取sysdba权限,Oracle 学习笔记: SYSDBA登陆权限问题
  9. 推荐第三方SQL查询工具
  10. FPGA经典设计:再读正点原子SDRAM控制器
  11. MYSQL 命令行大全
  12. android闹钟设置功能吗,Android编程闹钟设置方法详解
  13. Ubuntu 20.04桌面文件夹图标消失及文件系统无法打开
  14. Libero设计流程
  15. EXTJS开发过程遇到的一些问题的小结(转自麦田守望者)
  16. 如何在VMware虚拟机中查看Linux的IP地址
  17. 文件操作细致详解(下)
  18. H5公众号-canvas海报分享图+生成二维码
  19. Revit 二次开发 获取多段轴网的location
  20. 曾经学舞度芳年(代序)

热门文章

  1. Hive(23):实例:网站流量分析
  2. Transformer(“变形金刚”)
  3. 优秀程序员的七大特征,你具备几条?
  4. 计算机我的生涯规划档案,我的生涯规划档案.doc
  5. 二叉树探究之非叶子结点和叶子结点对半分且最多差一个
  6. 安全多方计算之GMW协议
  7. Unity SKFramework框架(二十五)、RSA算法加密、签名工具 RSA Crypto
  8. 手机音视频应用开发前景
  9. 新华社科普漫画刷屏:一分钟看懂区块链
  10. Halcon 之 Measure_Pairs