地心坐标、地球固定坐标和大地坐标之间的转换

2024-03-04 09:44

本文主要是介绍地心坐标、地球固定坐标和大地坐标之间的转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        本文介绍如何从大地坐标(纬度、经度和椭球上方高度)转换为地心、地球固定坐标,然后再转换回来。该算法是封闭形式的(即非迭代的)、快速且高度准确。示例代码以 Java 形式提供。

1、大地坐标的定义

        大地测量系统使用极坐标,定义如下:


纬度:
赤道以北和以南的角度。正角位于北半球,负角位于南半球。角度范围为 -90 度(-π/2 弧度)至 +90 度(+π/2 弧度)。赤道上的点的纬度为零。
经度:本初子午线以东和以西的角度。本初子午线是一条穿过英国格林威治的南北线。正经度位于本初子午线以东,负角度位于本初子午线以西。角度范围为 -180 度(-π 弧度)至 +180 度(+π 弧度)。
高度:也称为高度或海拔,表示地球椭球体上方的高度,以米为单位。地球椭球体是由长半轴和短半轴定义的数学表面。这两个参数最常见的值由 1984 年世界大地测量标准 (WGS-84) 定义。WGS-84 椭球体旨在与平均海平面相对应,但实际上,由于洋流、科里奥利效应和地球引力场的局部变化,实际平均海平面在世界各地有所不同。因此,大地测量高度为零大致对应于海平面,正值随着远离地球中心而增加。高度值的理论范围是从地球中心(约-6,371公里)到正无穷大。然而,在实践中,很少使用更深于几公里或高于地球同步轨道(约 36,000 公里)的高度值。

2、地心地固 (ECEF) 坐标的定义

        ECEF 是一个右手笛卡尔坐标系,原点位于地球中心,并且相对于地球固定(即随地球旋转)。单位为米。三个轴定义如下:


X:
在本初子午线穿过赤道(纬度 = 0,经度 = 0)。
Y:通过本初子午线以东 90 度的赤道(纬度 = 0,经度 = 90 度)。
Z:穿过北极(纬度 = 90 度,经度 = 任意值)。

3、坐标转换

        这两种坐标系都有优点和缺点。大地测量系统用于导航、地图绘制和 GPS 应用,其三个组成部分可以直观地解释为分别代表北/南、东/西和上/下运动。另一方面,ECEF系统对于涉及欧几里得几何和旋转矩阵的计算更方便。因此,经常需要在两个系统之间来回转换。

        事实上,从 Geodetic 到 ECEF 的转换相对简单,只涉及少量计算。然而,逆运算则更加困难。在过去的几年里,从 ECEF 转换到 Geodetic 需要迭代算法。1994年,北京大学的朱继杰发表了第一个封闭式解决方案。从那时起,已经开发了几种替代的封闭式解决方案,每种解决方案都有其优点和缺点。下面给出的解决方案是由当时在美国海军空战中心的 Donald K. Olson 开发的(Olson, DK (1996))。“将地心固定坐标转换为大地坐标”, IEEE 航空航天和电子系统汇刊,第 32 卷,第 1 期,1996 年 1 月,第 473-476 页)。

(1)示例代码

        下面显示了 Olson 的 ECEF-to-Geodetic 算法的 Java 方法以及标准 Geodetic-to-ECEF 算法。前两个类变量(ae2)定义 WGS-84 椭球体,其中a是长半轴(地球赤道处的半径),e2是偏心率的平方。其余常量可以从注释中记录的前两个常量导出,这样做不会降低准确性或增加计算时间。

public class Coord {private static final double  a = 6378137.0;              //WGS-84 semi-major axisprivate static final double e2 = 6.6943799901377997e-3;  //WGS-84 first eccentricity squaredprivate static final double a1 = 4.2697672707157535e+4;  //a1 = a*e2private static final double a2 = 1.8230912546075455e+9;  //a2 = a1*a1private static final double a3 = 1.4291722289812413e+2;  //a3 = a1*e2/2private static final double a4 = 4.5577281365188637e+9;  //a4 = 2.5*a2private static final double a5 = 4.2840589930055659e+4;  //a5 = a1+a3private static final double a6 = 9.9330562000986220e-1;  //a6 = 1-e2private static double zp,w2,w,r2,r,s2,c2,s,c,ss;private static double g,rg,rf,u,v,m,f,p,x,y,z;private static double n,lat,lon,alt;//Convert Earth-Centered-Earth-Fixed (ECEF) to lat, Lon, Altitude//Input is a three element array containing x, y, z in meters//Returned array contains lat and lon in radians, and altitude in meterspublic static double[] ecef_to_geo( double[] ecef ){double[] geo = new double[3];   //Results go here (Lat, Lon, Altitude)x = ecef[0];y = ecef[1];z = ecef[2];zp = Math.abs( z );w2 = x*x + y*y;w = Math.sqrt( w2 );r2 = w2 + z*z;r = Math.sqrt( r2 );geo[1] = Math.atan2( y, x );       //Lon (final)s2 = z*z/r2;c2 = w2/r2;u = a2/r;v = a3 - a4/r;if( c2 > 0.3 ){s = ( zp/r )*( 1.0 + c2*( a1 + u + s2*v )/r );geo[0] = Math.asin( s );      //Latss = s*s;c = Math.sqrt( 1.0 - ss );}else{c = ( w/r )*( 1.0 - s2*( a5 - u - c2*v )/r );geo[0] = Math.acos( c );      //Latss = 1.0 - c*c;s = Math.sqrt( ss );}g = 1.0 - e2*ss;rg = a/Math.sqrt( g );rf = a6*rg;u = w - rg*c;v = zp - rf*s;f = c*u + s*v;m = c*v - s*u;p = m/( rf/g + f );geo[0] = geo[0] + p;      //Latgeo[2] = f + m*p/2.0;     //Altitudeif( z < 0.0 ){geo[0] *= -1.0;     //Lat}return( geo );    //Return Lat, Lon, Altitude in that order}//Convert Lat, Lon, Altitude to Earth-Centered-Earth-Fixed (ECEF)//Input is a three element array containing lat, lon (rads) and alt (m)//Returned array contains x, y, z in meterspublic static double[] geo_to_ecef( double[] geo ) {double[] ecef = new double[3];  //Results go here (x, y, z)lat = geo[0];lon = geo[1];alt = geo[2];n = a/Math.sqrt( 1 - e2*Math.sin( lat )*Math.sin( lat ) );ecef[0] = ( n + alt )*Math.cos( lat )*Math.cos( lon );    //ECEF xecef[1] = ( n + alt )*Math.cos( lat )*Math.sin( lon );    //ECEF yecef[2] = ( n*(1 - e2 ) + alt )*Math.sin( lat );          //ECEF zreturn( ecef );     //Return x, y, z in ECEF}
}

(2)准确性

        奥尔森的算法计算成本低,并且与某些解决方案不同,不需要在极地或赤道进行特殊处理。它也非常准确。Olson 在他的原始论文中运行了大量的点,定期在纬度和经度上进行采样,并计算每个点的 3D 误差(以米为单位)。在-10公里和+100公里之间的高度,他发现平均误差为0.7 \times 10^{-9}米,最大误差为2.7 \times 10^{-9}米。在第二次测试中,海拔范围扩大到-3000公里(约地球半径的一半)至+30,000公里之间,平均误差为2.1 \times 10^{-9}米,最大误差为1.4 \times 10^{-8}米。

        使用上面所示的代码进行的测试中,从纬度、经度和海拔的随机均匀分布中生成了 1 亿个点,海拔限制在 -1000 公里到 +100,000 公里的范围内。我们生成大地坐标(lat、lon、alt)中的点,将它们转换为 ECEF,然后返回大地坐标。然后我们将原始大地坐标与双重转换的结果进行比较。

        对于纬度和经度测量,任何点的最大误差为 4.44 \times 10^{-16}弧度。在地球表面,这对应于2.8 \times 10^{-9}米的最大位置误差。任何点的最大高度误差为 4.47 \times 10^{-8}米。这些误差小于可见光的波长,这确实是准确的。

这篇关于地心坐标、地球固定坐标和大地坐标之间的转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/772783

相关文章

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

Python在固定文件夹批量创建固定后缀的文件(方法详解)

《Python在固定文件夹批量创建固定后缀的文件(方法详解)》文章讲述了如何使用Python批量创建后缀为.md的文件夹,生成100个,代码中需要修改的路径、前缀和后缀名,并提供了注意事项和代码示例,... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果5.

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

基于C#实现将图片转换为PDF文档

《基于C#实现将图片转换为PDF文档》将图片(JPG、PNG)转换为PDF文件可以帮助我们更好地保存和分享图片,所以本文将介绍如何使用C#将JPG/PNG图片转换为PDF文档,需要的可以参考下... 目录介绍C# 将单张图片转换为PDF文档C# 将多张图片转换到一个PDF文档介绍将图片(JPG、PNG)转

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };