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 ...
随机推荐
- Java中的大小写字母相互转换(不利用Java自带的方法)
Java中的大小写字母相互转换(不利用Java自带的方法) 1.设计源码 /** * * @title:UpperAndLower.java * @Package:com.you.utils * @D ...
- Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.commons.EmptyVisitor
1.错误描述 2014-7-13 1:45:53 org.apache.struts2.spring.StrutsSpringObjectFactory info 信息: ... initialize ...
- Linux显示所有运行中的进程
Linux显示所有运行中的进程 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ ps aux | less USER PID %CPU %MEM VSZ RSS ...
- Linux查看磁盘剩余空间
Linux查看磁盘剩余空间 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ df 文件系统 1K-blocks 已用 可用 已用% 挂载点 /dev/sda8 ...
- 复制粘贴之插件(jquery.zclip.min.js)需要安装flash
.line{margin-bottom:20px;} /* 复制提示 */ .copy-tips{position:fixed;z-index:999;bottom:50%;left:50%;marg ...
- 使用 LINQPad 助力 LINQ 学习
简介一图示意 简介 LINQPad 是一款学习 LINQ,优化 SQL 的好助手. 它的一大特点是内置了新版<C# in a Nutshell>的全部 LINQ 示例,不管是配合原书进行练 ...
- 【BZOJ3993】星际战争(网络流,二分答案)
[BZOJ3993]星际战争(网络流,二分答案) 题面 Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团 ...
- 【BZOJ2748】音量调节(动态规划)
[BZOJ2748]音量调节(动态规划) 题面 Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经 ...
- 【洛谷1129】 [ZJOI2007]矩阵游戏
题面 题目描述 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两种操作: ...
- 大文件视频断点续传插件resumabel.js,优化上传速度,缩短最后一片等待时长。
在angular中使用resumable.js遇到的一个问题:大视频上传到99-100%时,此时正在上传最后一片,最后一片的xhr一直是pending状态.原因插件会检查第一片和最后一片的元数据,检测 ...