ECEF和大地坐标系的相互转化
在阅读 RTKLIB的源码时,发现了ECEF和大地坐标系的相互转换的函数,大地坐标系(φ,λ,h)转成ECEF(X,Y,Z)与所看书籍(GPS原理与接收机,谢刚,电子工业出版社)的公式是一样的,而ECEF转成大地坐标系的公式则与上述书籍和 RTKLIB的使用手册(P135)中的公式都不一样。简而言之,遇到的问题如下图所示。

一开始想着能不能直接在某个文献中直接找到与程序算法一致的处理流程,但找了很久都没能如愿。最后,只能想着彻底从平面几何上理解这个数学推导过程,从而再尝试理解为什么程序会那么写。
在查找介绍大地坐标系的文献中,总能看到酉卯圆曲率半径这个名词。百度百科上给的定义是:过椭球面上一点的法线,可作无限个法截面,其中一个与该点子午面相垂直的法截面同椭球面相截形成的闭合的圈称为卯酉圈,如下图中的PEE′所示。

图 1
投影到二维平面中,就是下面这幅图。其中,Pn就称为酉卯圆曲率半径,PT则为椭圆的切线,角B则是酉卯圆曲率半径与长轴的夹角,称为纬度(也就是说通常意义上某个点的纬度并不是该点到地心的连线与长轴的夹角!)。

图 2
由椭圆切线的斜率公式,可知
(1)
联立上面两式,可得
(2)
其中,
。再将上式带入到椭圆的标准方程
中,即可解得
(3)
另外,在△PnA中通过简单的几何关系可知,
。所以有
(4)
又因为
,所以有
(5)
注意,上面这个关于PQ、Qn的公式在后面推导ECEF和大地坐标系的相互转换公式时,是很重要的。
为了说明坐标转换的一般性,这里的待转换点P是在地球外部的,示意图如下。图 3在理解(φ,λ,h)→XYZ中的X、Y坐标的变换公式时较为重要。

图 3
而要想真正简单、清晰地理解大地坐标系(φ,λ,h)与ECEF(X,Y,Z)如何转换,还是要从二维平面图中着手。下图可以看作是椭球体的主视图,XY平面压缩成了水平X轴。

图 4
- 大地坐标系(φ,λ,h)转成ECEF(X,Y,Z)。
OD是点P在XY平面上的投影向量,其长度为
(6)
再结合图3中XY平面中经度角λ的示意图,可得
(7)
而关于z坐标,则有
(8)
- ECEF(X,Y,Z)转成大地坐标系(φ,λ,h)。
首先是经度角λ,在图3的XY平面中可以很清晰地看到
(9)
对于纬度角φ和高度h,可以在在图4中分析其几何关系。
(10)
其中,
(11)
从上述公式中可以看到,在计算φ时还是会用到纬度角φ的,所以不能直接用上述公式来计算纬度角。这里给出RTKLIB中ecf2pos函数中的算法步骤:
① 假设PD=PE,计算出夹角φ’。
② 根据式(4)和式(11)再计算N’和PE’。
③ 对比②中的PE’与①中的PE之间的差别是否小于截断因子。不符合条件,将②中的PE’代入到①中,继续循环计算;符合条件,则说明此时φ’=φ,可以跳出循环。
④ 将最终的PE代入到式(10)中,从而计算出纬度角φ和高度h。
至此,关于RTKLIB的源码中的pos2ecf和ecf2pos函数的计算过程的理论公式推导过程,就证明完了。
这个事情证明,不会推公式的算法程序员是不合格的。找到的现成理论依据在复杂编程问题时可能会不够高效,或者当算法流程稍作改变时就会看不懂别人写的程序了。
ECEF和大地坐标系的相互转化的更多相关文章
- RTKLIB源码解析(一)——单点定位(pntpos.c)
RTKLIB源码解析(一)--单点定位(pntpos.c) 标签: GNSS RTKLIB 单点定位 [TOC] pntpos int pntpos (const obsd_t *obs, int n ...
- 地心地固坐标系(ECEF)与站心坐标系(ENU)的转换
目录 1. 概述 2. 原理 2.1. 平移 2.2. 旋转 2.3. 总结 3. 实现 4. 参考 1. 概述 我在<大地经纬度坐标与地心地固坐标的的转换>这篇文章中已经论述了地心坐标系 ...
- java对象与XML相互转化
起因 最近在公司做了一次webservice相关的任务,其中我最敢兴趣的就是webservice接受到XML对应的流以后是如何方便的转化成java对象,而java对象又是如何生成对应的XML的. 目的 ...
- DataSet、DataTable、Json、List 等各种数据的相互转化
1.根据Dataset生成json格式的字符串,不管Dataset里面有多少个表都可以一一生成对应的json字符串,并一次性返回 private string dsToJson(DataSet d ...
- Stream/Bytes[]/Image对象相互转化
Stream/Bytes[]/Image对象相互转化 Stream转Byte数组.Image转Byte数组.文件转Stream等 /// <summary> /// 将 Stream 转成 ...
- char与TCHAR相互转化
char与TCHAR相互转化 char strUsr[10] = "Hello"; TCHAR Name[100]; #ifdef UNICODE MultiByteToWideC ...
- C# 整形、双精度浮点型、字符串与字节型的相互转化
整形.双精度浮点型.字符串与字节型的相互转化,如下 using System; using System.Collections.Generic; using System.Linq; using S ...
- DateTable与List<T>相互转换 及JSON与DataTable(DataSet)相互转化
http://www.360doc.com/content/13/0712/09/10504424_299336674.shtml Linq处理List数据 http://blog.163.com/l ...
- jQuery对象和dom对象的辨析和相互转化
jquery对象和dom对象总是让人感觉很难分清,其实只要做到1对两者概念有明确认识2找出不同点 A DOM 1概念 DOM对象(Document Object Model,文档对象模型)可以把htm ...
随机推荐
- 芝麻HTTP:Ansible扩展
Ansible简介 Ansible是由Python开发的一个运维工具,因为工作需要接触到Ansible,经常会集成一些东西到Ansible,所以对Ansible的了解越来越多. 那Ansible到底是 ...
- 芝麻HTTP:Python爬虫入门之Cookie的使用
为什么要使用Cookie呢? Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密) 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓 ...
- CSS3 column属性
css3 column属性的应用 1.案例源码 <!DOCTYPE html><html lang="en"><head> <meta c ...
- [BZOJ1024] [SCOI2009] 生日快乐 (搜索)
Description windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕.现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋 ...
- Cglib及其基本使用
前言 最近一直在看Spring源码,其实我之前一直知道AOP的基本实现原理: 如果针对接口做代理默认使用的是JDK自带的Proxy+InvocationHandler 如果针对类做代理使用的是Cgli ...
- 封装好的MD5加密
/** * 不可逆加密类 为密码提供不可逆的加密运算,使用MD5算法 * * 使用方法: MD5 encrypt = new MD5(); encrypt.getMD5ofStr(str); //返回 ...
- Java中常见数据结构List之LinkedList
二,LinkedList 1, linkedList底层数据结构 linkedList底层是一个双向链表 2,LinkedList和ArrayList的对比 1.顺序插入速度ArrayList会比较快 ...
- 去中心化类微博应用 mastodon
一句话重点,去中心,没监管,自己对自己信息做主,没人随便删你消息的分布式社交应用 mastodon. 建了一个实例, https://cncs.io 来专门讨论计算机相关信息,欢迎大家注册来玩.已有用 ...
- Scala学习笔记(一)
scala 版HelloWorrld object HelloWorld{ def main(args:Array[String]){ println("Hello World!!!&quo ...
- libpqxx接口的在linux下的使用,解决psql:connections on Unix domain socket "/tmp/.s.PGSQL.5432"错误
在项目中使用postgresql数据库时要求在windows和linux双平台兼容.于是在windows下使用的接口在linux下爆出异常: psql:connections on Unix doma ...