生命无罪,健康万岁,我是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 coefficient
final 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 18261
USA 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 44370
VELOX 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。