卫星参数转换之二行转轨道六根数转经纬度坐标

本文主要是介绍卫星参数转换之二行转轨道六根数转经纬度坐标,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

生命无罪,健康万岁,我是laity。

我曾七次鄙视自己的灵魂:

第一次,当它本可进取时,却故作谦卑;

第二次,当它在空虚时,用爱欲来填充;

第三次,在困难和容易之间,它选择了容易;

第四次,它犯了错,却借由别人也会犯错来宽慰自己;

第五次,它自由软弱,却把它认为是生命的坚韧;

第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;

第七次,它侧身于生活的污泥中,虽不甘心,却又畏首畏尾。

说明

基于TLE数据(二行转六根)计算轨道六根数(calculateOrbitElement),再根据六根数求其经纬度(getInfo),通过给出的经纬高求距离太阳的距离(getDistanceToSun),最后通过余弦定理求其关照角(TriangleAngles); 主要依赖为:Java类包Orekit

依赖准备

Orekit依赖下载,下载后直接引入到工程中;
再引入个依赖文件(在使用Orekit库之前,我们需要读取Orekit文件)

代码实现

/*** @author: Laity* @Project: JavaLaity* @Package: Utils.TwoRowsToSixRoots.Demo* @Date: 2024年03月14日 18:50* @Description: */public class Demo {public static void main(String[] args) {// tle测试数据String tle = "USA 310\n" +"1 46918U 20083A   23250.72167034 0.00000000  00000-0  00000-0 0    06\n" +"2 46918  58.5225 136.1602 0006695 326.5223  33.4777  3.76176694    05";// 计算轨道参数计算轨道参数calculateOrbitElement(tle);// 获取数据获取位置getInfo();// 三角角三角形三个角的度数TriangleAngles();}/*** 计算轨道参数 (半长轴,离心率,轨道倾角,升交点赤经,近地点幅角,真近点角)* @param tle tle轨道参数(二行转六根)*/public static void calculateOrbitElement(String tle){File orekitData = new File("D:\\Stay_up_late_champion\\dataStructure\\src\\main\\resources\\file\\orekit-data-master\\");DataProvidersManager manager = DataContext.getDefault().getDataProvidersManager();manager.addProvider(new DirectoryCrawler(orekitData)); // 存放orekitdata路径String[] params = tle.split("\n");String line1= params[1];String line2= params[2];TLE tleObj = new TLE(line1,line2);TLEPropagator  tlePropagator= TLEPropagator.selectExtrapolator(tleObj);Orbit cartesianOrbit = tlePropagator.getInitialState().getOrbit(); // 笛卡尔轨道KeplerianOrbit keplerianOrbit = new KeplerianOrbit(cartesianOrbit);  // 转换为开普勒轨道System.out.println("半长轴:"+keplerianOrbit.getA());System.out.println("离心率:"+keplerianOrbit.getE());System.out.println("轨道倾角:"+keplerianOrbit.getI());System.out.println("升交点赤经:"+Math.toDegrees(keplerianOrbit.getRightAscensionOfAscendingNode())); // 弧度转化为度System.out.println("近地点幅角:"+Math.toDegrees(keplerianOrbit.getPerigeeArgument()));System.out.println("真近点角"+keplerianOrbit.getTrueAnomaly());}public static void getInfo(){// 定义J2000坐标系和ECFF坐标系// 定义J2000坐标系Frame J2000 = FramesFactory.getEME2000();// 定义ECFF坐标系Frame ecff = FramesFactory.getITRF(IERSConventions.IERS_2010, true);// 定义地心引力常数// gravitation coefficientfinal double mu =  3.986004415e+14;// 定义卫星基本参数并计算卫星的PV坐标// 轨道六根数double a = 6931700.6; // 半长轴 (m)double e = 0.001264070355890773;           // 离心率double i = 0.9262838362266536; // 轨道倾角 (弧度)double argOfPerigee = -64.04849998651345; // 升交点赤经 (弧度)double raan = 52.248882667192056;  // 升交点赤纬 (弧度)double meanAnomaly = -0.9119147488086196; // 真近点角 (弧度)// 定义时刻final TimeScale utc = TimeScalesFactory.getUTC();final AbsoluteDate initialDate = new AbsoluteDate(2024, 03, 12, 19, 16, 01.10, utc);// 计算PV坐标final Orbit initialOrbit = new KeplerianOrbit(a, e, i, argOfPerigee, raan, meanAnomaly, PositionAngle.MEAN,J2000, initialDate, mu);// 转换到J2000坐标系// 转换到J2000坐标系PVCoordinates pvCoordinates = initialOrbit.getPVCoordinates(J2000);// 转换到ECFF坐标系PVCoordinates pvInECFF = J2000.getTransformTo(ecff, initialDate).transformPVCoordinates(pvCoordinates);// 获取地球中心的坐标double x = pvInECFF.getPosition().getX();double y = pvInECFF.getPosition().getY();double z = pvInECFF.getPosition().getZ();// 计算经纬度double longitude = Math.atan2(y, x);double latitude = Math.atan2(z, Math.sqrt(x * x + y * y));double altitude = Math.sqrt(x * x + y * y + z * z) - Constants.WGS84_EARTH_EQUATORIAL_RADIUS;System.out.println("经度 (degrees): " + longitude);System.out.println("纬度 (degrees): " + latitude);System.out.println("高度 (meters): " + altitude);getDistanceToSun(longitude, latitude, altitude);}/*** 计算位置与太阳表面的距离* @param longitude 经度 单位:弧度* @param latitude 纬度 单位:弧度* @param altitude 高度 单位:米*/public static void getDistanceToSun(double longitude, double latitude, double altitude) {/* 经度,以弧度表示 *//*double longitude = Math.toRadians();*//* 纬度,以弧度表示 *//*double latitude = Math.toRadians();*//* 高度,以米为单位 *//*double altitude =  ;*/double earthRadius = 6371000; // 以米为单位// 计算太阳中心到地球中心的距离double sunEarthDistance = 149.6e9; // 以米为单位// 计算太阳的视直径double sunDiameter = 2 * Math.asin(696340e3 / (2 * sunEarthDistance)); // 以弧度为单位// 计算从位置到太阳表面的距离// 计算了从给定位置到太阳表面的距离。它利用了地球表面的位置与太阳表面的位置之间的直线距离,以及地球和太阳之间的距离,以及给定位置的海拔高度。double distanceToSun = Math.sqrt(Math.pow((sunEarthDistance * Math.cos(sunDiameter / 2) - earthRadius * Math.cos(latitude)), 2) + Math.pow((sunEarthDistance * Math.sin(sunDiameter / 2) - earthRadius * Math.sin(latitude)), 2) + Math.pow(altitude, 2));// 经度(longitude)并未直接用于计算距离。经度通常用于确定位置的东西方向,但在这种情况下,并不影响计算太阳与地球的距离。相反,纬度(latitude)是在计算中用到的,因为它影响到了太阳在天空中的位置。// double distanceToSun = Math.sqrt(Math.pow((sunEarthDistance * Math.cos(sunDiameter / 2) - earthRadius * Math.cos(latitude)), 2) + Math.pow((sunEarthDistance * Math.sin(sunDiameter / 2) - earthRadius * Math.sin(latitude)), 2) + Math.pow(altitude, 2));System.out.println("位置与太阳表面的距离:" + distanceToSun);}/*** 三角形三个角的度数*/public static void TriangleAngles(){double a = 3;double b = 4;double c = 5;double A = Math.toDegrees(Math.acos((b * b + c * c - a * a) / (2 * b * c)));double B = Math.toDegrees(Math.acos((a * a + c * c - b * b) / (2 * a * c)));double C = Math.toDegrees(Math.acos((a * a + b * b - c * c) / (2 * a * b)));// 角A由边b和边c组成,角B由边a和边c组成,角C由边a和边b组成。System.out.println("Angle A: " + A);System.out.println("Angle B: " + B);System.out.println("Angle C: " + C);}
}

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>dataStructure</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.hipparchus</groupId><artifactId>hipparchus-fitting</artifactId><version>3.0</version></dependency><dependency><groupId>org.hipparchus</groupId><artifactId>hipparchus-core</artifactId><version>3.0</version></dependency><dependency><groupId>org.hipparchus</groupId><artifactId>hipparchus-clustering</artifactId><version>3.0</version></dependency><dependency><groupId>org.hipparchus</groupId><artifactId>hipparchus-fft</artifactId><version>3.0</version></dependency><dependency><groupId>org.hipparchus</groupId><artifactId>hipparchus-filtering</artifactId><version>3.0</version></dependency><dependency><groupId>org.hipparchus</groupId><artifactId>hipparchus-geometry</artifactId><version>3.0</version></dependency><dependency><groupId>org.hipparchus</groupId><artifactId>hipparchus-ode</artifactId><version>3.0</version></dependency><dependency><groupId>org.hipparchus</groupId><artifactId>hipparchus-optim</artifactId><version>3.0</version></dependency><dependency><groupId>org.hipparchus</groupId><artifactId>hipparchus-stat</artifactId><version>3.0</version></dependency><dependency><groupId>org.hipparchus</groupId><artifactId>hipparchus-migration</artifactId><version>3.0</version></dependency></dependencies>
</project>

测试数据

USA 299
1 44071U 19014A   24057.09035528  .00000042  00000-0  00000+0 0  9897
2 44071   0.0276 127.9287 0000244 313.9012 146.3000  1.00266779 18261USA 214
1 38070U 12003A   24066.80118976 -.00000219  00000-0  00000+0 0  9894
2 38070   0.0177 132.4830 0000231  49.8698 349.4673  1.00271171 44370VELOX 20
1 41171U 15077F   24066.46653569  .00065376  00000-0  11856-2 0  9896
2 41171  14.9887 139.0649 0002567  32.3897 317.6586 15.47721355455793

梦想不会逃跑了,逃跑了的永远都是自己。我是Laity,正在前进的Laity。

这篇关于卫星参数转换之二行转轨道六根数转经纬度坐标的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

SpringMVC获取请求参数的方法

《SpringMVC获取请求参数的方法》:本文主要介绍SpringMVC获取请求参数的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下... 目录1、通过ServletAPI获取2、通过控制器方法的形参获取请求参数3、@RequestParam4、@

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t