椭球面系列---大地坐标和笛卡尔坐标的相互转换

椭球体下,尤其是地球的旋转椭球体下,大地坐标和笛卡尔坐标的相互转换是最基础的算法了。本章给出两种坐标系下相互转换的原理及相应的转换公式,供参考。

大地坐标

大地坐标(Geodetic coordinate)是大地测量中以参考椭球面为基准面的坐标,点P的位置用大地经度λ、大地纬度φ和大地高H表示。

大地坐标多应用于大地测量学,测绘学等。具体为:

  • 大地经度
    大地经度是通过该点的大地子午面与起始大地子午面(通过格林尼治天文台的子午面)之间的夹角。规定以起始子午面起算,向东由0°至180°称为东经;向西由0°至180°称为西经。
  • 大地纬度
    大地纬度是P点在椭球面的投影点的法线与赤道面的夹角,规定由赤道面起算,由赤道面向北从0°至90°称为北纬;向南从0°到90°称为南纬。P点位于椭球面的投影点的法线方向上。
  • 大地高度
    大地高是地面点沿法线到参考椭球面的距离。

注意大地纬度与地心纬度的区别!大地坐标的示意图如下。
大地坐标

笛卡尔坐标

点P的笛卡尔坐标即为参考椭球体中心直角坐标系下的坐标,使用 ( x , y , z ) (x,y,z) (x,y,z)表示。

大地坐标示意图

大地坐标 ( λ , φ , h ) (\lambda,\varphi,h) (λ,φ,h)转换为笛卡尔坐标 ( x , y , z ) (x,y,z) (x,y,z)

大地坐标向笛卡尔坐标的转换为直接转换,不需要迭代。

见上图,已知 P P P点的大地坐标 ( λ , φ , h ) (\lambda,\varphi,h) (λ,φ,h) P ′ P' P P P P点在椭球面上的投影点,即 P ′ P P'P PP P ′ P' P点的法线方向(定义为 n \textbf{n} n)。

法线向量 n \textbf{n} n很容易由大地经度和大地纬度计算得到:
n = [ c o s ( φ ) c o s ( λ ) c o s ( φ ) s i n ( λ ) s i n ( φ ) ] \begin{equation} \textbf{n}=\left [ \begin{matrix} cos(\varphi)cos(\lambda)\\cos(\varphi)sin(\lambda)\\sin(\varphi)\\\end{matrix} \right ] \end{equation} n= cos(φ)cos(λ)cos(φ)sin(λ)sin(φ)
在椭球面系列—基本性质一文中我们知道,若已知椭球面上点 P ′ P' P的法线向量 n \textbf{n} n,则可求解 k k k:
k 2 = n T C − 1 n \begin{equation} k^2=\textbf{n}^T\textbf{C}^{-1}\textbf{n} \end{equation} k2=nTC1n
从而可以直接计算得到椭球面上点 P ′ P' P的笛卡尔坐标 ( x ′ , y ′ , z ′ ) T (x',y',z')^T (x,y,z)T
P ′ = ( x ′ , y ′ , z ′ ) T = 1 k C − 1 n \begin{equation} P'=(x',y',z')^T=\frac1k\textbf{C}^{-1}\textbf{n} \end{equation} P=(x,y,z)T=k1C1n
得到点 P ′ P' P后,则由法向量 n \textbf{n} n和高度 h h h可直接得到点 P P P的笛卡尔坐标 ( x , y , z ) T (x,y,z)^T (x,y,z)T
P = [ x y z ] = [ x ′ y ′ z ′ ] + n ∣ n ∣ h \begin{equation} P= \left [ \begin{matrix}x\\y\\z\\\end{matrix} \right ] =\left [ \begin{matrix}x'\\y'\\z'\\\end{matrix} \right ] +\frac {\textbf{n}}{|\textbf{n}|}h \end{equation} P= xyz = xyz +nnh

笛卡尔坐标 ( x , y , z ) (x,y,z) (x,y,z)转换为大地坐标 ( λ , φ , h ) (\lambda,\varphi,h) (λ,φ,h)

笛卡尔坐标向大地坐标的转换为隐式转换,需要迭代求解。

仍然见上图, P ′ P' P点的法线方向(定义为 n \textbf{n} n)由其笛卡尔坐标 ( x ′ , y ′ , z ′ ) T (x',y',z')^T (x,y,z)T表示(这里我们不知道大地坐标,所以不能像式(1)方式来表示)则有:
n = [ x ′ / a 2 y ′ / b 2 z ′ / c 2 ] \begin{equation} \textbf{n}=\left [ \begin{matrix}x'/a^2\\y'/b^2\\z'/c^2\\\end{matrix} \right ] \end{equation} n= x/a2y/b2z/c2
很明显,此法线 n \textbf{n} n为梯度向量的 1 / 2 1/2 1/2

P ′ P' P点和 P P P点的关系可表示为(与式(4)形式相同):
[ x y z ] = [ x ′ y ′ z ′ ] + t [ x ′ / a 2 y ′ / b 2 z ′ / c 2 ] \begin{equation} \left [ \begin{matrix}x\\y\\z\\\end{matrix} \right ] = \left [ \begin{matrix}x'\\y'\\z'\\\end{matrix} \right ] + t\left [ \begin{matrix}x'/a^2\\y'/b^2\\z'/c^2\\\end{matrix} \right ] \end{equation} xyz = xyz +t x/a2y/b2z/c2
上式中, t t t为法向量的系数,选取合适的 t t t,则可使得上式成立。

将上式改变为:
[ x ′ y ′ z ′ ] = [ x / ( 1 + t / a 2 ) y / ( 1 + t / b 2 ) z / ( 1 + t / c 2 ) ] \begin{equation} \left [ \begin{matrix}x'\\y'\\z'\\\end{matrix} \right ] =\left [ \begin{matrix}x/(1+t/a^2)\\y/(1+t/b^2)\\z/(1+t/c^2)\\\end{matrix} \right ] \end{equation} xyz = x/(1+t/a2)y/(1+t/b2)z/(1+t/c2)
由于 P ′ P' P为椭球面上的点,因此满足椭球面方程:
x ′ 2 a 2 + y ′ 2 b 2 + z ′ 2 c 2 = 1 \begin{equation} \frac{x'^2}{a^2} + \frac{y'^2}{b^2} + \frac{z'^2}{c^2} = 1 \end{equation} a2x′2+b2y′2+c2z′2=1
将式(8)带入上式,并定义函数 f ( t ) f(t) f(t):
f ( t ) = x 2 a 2 ( 1 + t / a 2 ) 2 + y 2 b 2 ( 1 + t / b 2 ) 2 + z 2 c 2 ( 1 + t / c 2 ) 2 − 1 \begin{equation} f(t)=\frac{x^2}{a^2(1+t/a^2)^2} + \frac{y^2}{b^2(1+t/b^2)^2} + \frac{z^2}{c^2(1+t/c^2)^2} - 1 \end{equation} f(t)=a2(1+t/a2)2x2+b2(1+t/b2)2y2+c2(1+t/c2)2z21
由于 P P P点坐标 ( x , y , z ) (x,y,z) (x,y,z)已知,则变为求解方程 f ( t ) = 0 f(t)=0 f(t)=0的根。

函数 f ( t ) f(t) f(t)为一元函数,且为隐式函数,因此求根一般采用牛顿迭代法(使用一阶导数 f ′ ( t ) f'(t) f(t)),即:
f ( t ) = f ( t 0 ) + f ′ ( t 0 ) . Δ t = 0 \begin{equation} f(t)=f(t_0)+f'(t_0).\Delta t=0 \end{equation} f(t)=f(t0)+f(t0)t=0
迭代求解时,每一步 t t t可由前一次数值给出:
t n + 1 = t n − f ( t n ) / f ′ ( t n ) \begin{equation} t_{n+1}=t_n-f(t_n)/f'(t_n) \end{equation} tn+1=tnf(tn)/f(tn)
由式(10)可得一阶导数 f ′ ( t ) f'(t) f(t):
f ′ ( t ) = − 2 x 2 a 4 ( 1 + t / a 2 ) 3 − 2 y 2 b 4 ( 1 + t / b 2 ) 3 − 2 z 2 c 4 ( 1 + t / c 2 ) 3 \begin{equation} f'(t)=\frac{-2x^2}{a^4(1+t/a^2)^3} - \frac{2y^2}{b^4(1+t/b^2)^3} - \frac{2z^2}{c^4(1+t/c^2)^3} \end{equation} f(t)=a4(1+t/a2)32x2b4(1+t/b2)32y2c4(1+t/c2)32z2

下面给出迭代参数 t t t的初值 t 0 t_0 t0的求解。

由上图可知, O P OP OP与椭球面的交点 P 0 P_0 P0 P ′ P' P点很近,因此首先求解 P 0 P_0 P0点的坐标 ( x 0 , y 0 , z 0 ) (x_0,y_0,z_0) (x0,y0,z0)
[ x 0 y 0 z 0 ] = 1 d . [ x y z ] \begin{equation} \left [ \begin{matrix}x_0\\y_0\\z_0\\\end{matrix} \right ] = \frac 1d .\left [ \begin{matrix}x\\y\\z\\\end{matrix} \right ] \end{equation} x0y0z0 =d1. xyz
上式中 d d d可由 P P P点的坐标 ( x , y , z ) (x,y,z) (x,y,z)求得:
x 2 a 2 + y 2 b 2 + z 2 c 2 = d 2 \begin{equation} \frac{x^2}{a^2} + \frac{y^2}{b^2} + \frac{z^2}{c^2} = d^2 \end{equation} a2x2+b2y2+c2z2=d2

迭代开始时,将 P 0 P_0 P0当作 P ′ P' P即可。则根据上图几何关系和式(6),有:
h = ( 1 − 1 / d ) ∣ P ∣ = t ∣ n ∣ h=(1-1/d) |\textbf P|=t|\textbf{n}| h=(11/d)P=tn
因此 t 0 t_0 t0为:
t = ( 1 − 1 / d ) ∣ P ∣ / ∣ n ∣ \begin{equation} t=(1-1/d) |\textbf P|/|\textbf{n}| \end{equation} t=(11/d)P∣/∣n
上式中:
∣ P ∣ = x 2 + y 2 + z 2 |\textbf P|=\sqrt{x^2+y^2+z^2} P=x2+y2+z2
∣ n ∣ = x 0 2 / a 4 + y 0 2 / b 4 + z 0 2 / c 4 |\textbf{n}|=\sqrt{x_0^2/a^4+y_0^2/b^4+z_0^2/c^4} n=x02/a4+y02/b4+z02/c4
使用牛顿迭代法求得 t t t后,则带入式(8)可求得椭球面投影点于 P ′ P' P的坐标 ( x ′ , y ′ , z ′ ) T (x',y',z')^T (x,y,z)T

有了 P ′ P' P点坐标,则椭球面法向量 n \textbf{n} n可由式(5)给出。

最终,大地坐标为:
{ λ = t a n − 1 ( n y , n x ) φ = s i n − 1 ( n z / ∣ n ∣ ) h = t / ∣ n ∣ \begin{equation} \begin{cases} \lambda=tan^{-1}(n_y,n_x) \\ \varphi=sin^{-1}(n_z/|\textbf{n}|) \\ h=t/|\textbf{n}| \end{cases} \end{equation} λ=tan1(ny,nx)φ=sin1(nz/∣n)h=t/∣n
注意,上式中的 ∣ n ∣ |\textbf{n}| n x ′ 2 / a 4 + y ′ 2 / b 4 + z ′ 2 / c 4 \sqrt{x'^2/a^4+y'^2/b^4+z'^2/c^4} x′2/a4+y′2/b4+z′2/c4

参考:
[1]: 椭球面系列—基本性质
[2]: [学习内容:求一个点到椭球面的距离(下)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/291831.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习课程实验二深层神经网络搭建及优化

一、 实验目的 1、学会训练和搭建深层神经网络; 2、掌握超参数调试正则化及优化。 二、 实验步骤 初始化 1、导入所需要的库 2、搭建神经网络模型 3、零初始化 4、随机初始化 5、He初始化 6、总结三种不同类型的初始化 正则化 1、导入所需要的库 2、使用非正则化…

android 通过反射获取U盘路径地址

2015-01-20 21:37:05.420 26674-26674/ E/MainActivity: ---getUsbPath() length2 2015-01-20 21:37:05.420 26674-26674/E/MainActivity: ---getUsbPath()[/storage/emulated/0, /storage/D65A-07AE]

SpringBoot全局Controller返回值格式统一处理

一、Controller返回值格式统一 1、WebResult类 在 Controller对外提供服务的时候,我们都需要统一返回值格式。一般定义一个 WebResult类。 统一返回值(WebResult类)格式如下: {"success": true,"code": 2…

Mysql事务transaction简介

文章目录 什么是事务针对Mysql隔离级别读未提交读提交可重复读串行化 mysql中的数据结构索引数据结构mysql中的锁种类**共享锁和独占锁**表锁、行锁(记录锁、间隙锁、临键锁) spring中的事务事务特性 什么是事务 事务是一个不可分割的数据库操作序列,也是数据库并发…

element-ui Tree 树形控件 过滤保留子级并获取过滤后的数据 多选改单选

本示例基于vue2 element-ui element-ui 的官网demo是只保留到过滤值一级的,并不会保留其子级 目标 1、Tree 树形控件 保留过滤值的子级 2、在第一次过滤数据的基础上进行第二次过滤 3、Tree 树形控件 多选改为单选,且只有最末端子级可以选择 不足…

【Spring】AOP的AspectJ开发

AOP基础不了解可以阅读:【Spring】AOP原来如此-CSDN博客 AspectJ是一个居于JAVA开发的AOP框架 基于XML的声明式AspectJ 基于XML的声明式AspectJ是通过XML文件来定义切面,切入点及通知,所有的切面、切入点和通知必须定义在内, 元…

Android Jetpack学习系列——Navigation

写在前面 Google在2018年就推出了Jetpack组件库,但是直到今天我才给重视起来,这真的不得不说是一件让人遗憾的事。过去几年的空闲时间里,我一直在尝试做一套自己的组件库,帮助自己快速开发,虽然也听说过Jetpack&#…

第一课:Transformer

第一课:Transformer 文章目录 第一课:Transformer1、学习总结:什么是语言模型?大语言模型(LLM)技术演变史注意力机制Transformer结构课程ppt及代码地址 2、学习心得:3、经验分享:4、…

【DevOps-02】Code编码阶段工具

一、简要说明 在code阶段,我们需要将不同版本的代码存储到一个仓库中,常见的版本控制工具就是SVN或者Git,这里我们采用Git作为版本控制工具,GitLab作为远程仓库。 Git安装安装GitLab配置GitLab登录账户二、Git安装 Git官网 Githttps://git-scm.com/

移动通信原理与关键技术学习(2)

1.多径信道滤波器表示,多径信道可以认为是线性时变滤波器,接收信号为发送信号与信道冲激响应的卷积。 2.调制就是对信号源的信息进行处理加到载波上,使其变为适合于信道传输的形式的过程,就是使载波随信号而改变的技术。 3.进行调…

VUE 若依框架,当页面设置了keepAlive=true,v-if和v-hasPermi作用在统一个按钮上时v-hasPermi失效,出现按钮显示异常问题

当前列表页设置了缓存keepAlivetrue,同时,在同一个按钮上使用v-if判断数据状态、用v-hasPermi判断按钮权限 当v-if的数据状态改变,由 1 变成 2 的时候,后面的v-hasPermi判断失效 原因: 是因为一开始页面初始化时&#…

HTML5+CSS3⑥——CSS三大特性、表格、列表

CSS特性 继承性 层叠性 优先级 叠加计算规则 表格 表格结构标签 合并单元格 列表 无序列表 有序列表 定义列表

显著提升VMware虚拟机运行速度的技巧

最主要是要把CPU核心减少到2,以前设置为4非常卡。因为我的电脑一个就4个CPU。

听GPT 讲Rust源代码--compiler(11)

File: rust/compiler/rustc_mir_transform/src/simplify.rs 在Rust源代码中,rust/compiler/rustc_mir_transform/src/simplify.rs文件是Rust编译器中一系列进行MIR(中间表示)简化的转换的实现。MIR是Rust编译器中用于进行优化和代码生成的中间…

Python遍历读取 A 文件夹中的 A1、A2、A3、A4、A5 中的各子文件夹中的图片,并对每张图片处理后保存到指定路径

目录 一、具体步骤二、文件夹目录结构样例三、代码四、实例遍历处理后结果五、总结 一、具体步骤 首先,指定 A 文件夹的路径和重命名后的文件夹路径。 然后,遍历 A 文件夹中的各子文件夹。 在每个子文件夹中,遍历所有文件。 读取每个文件&am…

电路分析竟然这么简单?还可以用软件仿真~

同学们大家好,今天我们继续学习杨欣的《电子设计从零开始》,这本书从基本原理出发,知识点遍及无线电通讯、仪器设计、三极管电路、集成电路、传感器、数字电路基础、单片机及应用实例,可以说是全面系统地介绍了电子设计所需的知识…

【MongoDB】关于MongoDB更新文档update的操作,十分详细,建议收藏!!!

😁 作者简介:一名大四的学生,致力学习前端开发技术 ⭐️个人主页:夜宵饽饽的主页 ❔ 系列专栏:MongoDB数据库学习 👐学习格言:成功不是终点,失败也并非末日,最重要的是继…

UDP单播

CMakeLists.txt文件中添加如下行&#xff1a; link_libraries(ws2_32) 1.发送端 #include <iostream> #include <winsock2.h> #include <cstdio>#pragma comment(lib, "Ws2_32.lib") // Link with ws2_32.libint main() {1.Initialize winsock…

googlecode.log4jdbc慢sql日志,格式化sql

前言 无论使用原生JDBC、mybatis还是hibernate&#xff0c;使用log4j等日志框架可以看到生成的SQL&#xff0c;但是占位符和参数总是分开打印的&#xff0c;不便于分析&#xff0c;显示如下的效果: googlecode Log4jdbc 是一个开源 SQL 日志组件&#xff0c;它使用代理模式实…

AI的突破与融合:2024年中国智能技术的新纪元_光点科技

随着人工智能领域的不断突破&#xff0c;2024年注定将成为中国智能技术发展的一个新纪元。当下&#xff0c;AI技术不仅在理论研究上取得了重大进展&#xff0c;其在商业应用、社会服务等领域的融合也日益深入。本文将结合近期网络上的AI热点&#xff0c;展望中国在AI技术方面的…