1、坐标转换示例完整代码
java
import org.hipparchus.geometry.euclidean.threed.Vector3D;
import org.orekit.bodies.GeodeticPoint;
import org.orekit.bodies.OneAxisEllipsoid;
import org.orekit.data.DataProvidersManager;
import org.orekit.data.DirectoryCrawler;
import org.orekit.data.DataContext;
import org.orekit.frames.Frame;
import org.orekit.frames.FramesFactory;
import org.orekit.frames.Transform;
import org.orekit.time.AbsoluteDate;
import org.orekit.time.TimeScale;
import org.orekit.time.TimeScalesFactory;
import org.orekit.utils.IERSConventions;
import org.orekit.utils.PVCoordinates;
import org.orekit.utils.Constants;
import java.io.File;
public class CoordTransformTest {
// 静态初始化块,在类加载时初始化Orekit
static {
initOrekit();
}
// 常量定义
private static final double MU = Constants.IERS2010_EARTH_MU;
private static final Frame INERTIAL_FRAME = FramesFactory.getEME2000();
private static final Frame ecefFrame = FramesFactory.getITRF(IERSConventions.IERS_2010, true); //地固系
private static final TimeScale UTC = TimeScalesFactory.getUTC();
/**
* 初始化Orekit环境
*/
private static void initOrekit() {
try {
// 设置Orekit数据路径
String userHome = System.getProperty("user.home");
String orekitDataPath = userHome + File.separator + "orekit-data";
System.out.println("orekit-data:" + orekitDataPath);
File orekitData = new File(orekitDataPath);
if (!orekitData.exists()) {
System.err.println("警告: orekit-data目录不存在");
System.err.println("请从https://gitlab.orekit.org/orekit/orekit-data下载数据");
// 创建目录供用户放置数据
orekitData.mkdirs();
}
// 初始化数据提供者
DataProvidersManager manager = DataContext.getDefault().getDataProvidersManager();
manager.addProvider(new DirectoryCrawler(orekitData));
System.out.println("Orekit初始化完成");
} catch (Exception e) {
System.err.println("Orekit初始化警告: " + e.getMessage());
}
}
public static void main(String[] args)
{
AbsoluteDate date = new AbsoluteDate(2024, 1, 1, 0, 0, 0.0, UTC);
Vector3D position = new Vector3D(6678137, 0, 0);
Vector3D velocity = new Vector3D(0, 0, 0);
//1、J2000惯性系 ------> 地球固定坐标系
{
PVCoordinates j2000PV = new PVCoordinates(position, velocity);
Transform j2000ToEcef = INERTIAL_FRAME.getTransformTo(ecefFrame, date);
PVCoordinates ecefPV = j2000ToEcef.transformPVCoordinates(j2000PV);
System.out.println("ecefPV:" + ecefPV.getPosition());
}
//2、地球固定坐标系 ------> J2000惯性系
{
PVCoordinates ecefPV = new PVCoordinates(position, velocity);
Transform ecefToJ2000 = ecefFrame.getTransformTo(INERTIAL_FRAME, date);
PVCoordinates j2000PV = ecefToJ2000.transformPVCoordinates(ecefPV);
System.out.println("j2000PV:" + j2000PV.getPosition());
}
//3、从惯性系直接转大地坐标系经纬高
//创建地球参考椭球体(WGS84标准)
final OneAxisEllipsoid earth = new OneAxisEllipsoid(
Constants.WGS84_EARTH_EQUATORIAL_RADIUS,
Constants.WGS84_EARTH_FLATTENING,
FramesFactory.getITRF(IERSConventions.IERS_2010, true) // ITRF2000框架
);
GeodeticPoint observerLLA = earth.transform(position, INERTIAL_FRAME, date);
System.out.println("observerLLA:" + observerLLA);
}
/**
* 计算从观测点A到目标B的视方向赤经赤纬(输入惯性系)
* 如果需要计算惯性系某一点的赤经赤纬,参数传入B点,且A设置为(0,0,0)即可。
*
* @param ax 观测点A的X坐标 (km)
* @param ay 观测点A的Y坐标 (km)
* @param az 观测点A的Z坐标 (km)
* @param bx 目标点B的X坐标 (km)
* @param by 目标点B的Y坐标 (km)
* @param bz 目标点B的Z坐标 (km)
* @return 包含赤经(度)和赤纬(度)的数组 [RA, Dec]
*/
public static double[] calculateRaDec(Vector3D A, Vector3D B) {
double ax = A.getX();
double ay = A.getY();
double az = A.getZ();
double bx = B.getX();
double by = B.getY();
double bz = B.getZ();
// 计算从A到B的方向向量
double dx = bx - ax;
double dy = by - ay;
double dz = bz - az;
// 计算方向向量的模
double magnitude = Math.sqrt(dx*dx + dy*dy + dz*dz);
// 归一化方向向量
double ux = dx / magnitude;
double uy = dy / magnitude;
double uz = dz / magnitude;
// 计算赤纬 (arcsin(z))
double dec = Math.asin(uz);
// 计算赤经 (arctan2(y, x))
double ra = Math.atan2(uy, ux);
// 将赤经转换到 [0, 2π) 范围
if (ra < 0) {
ra += 2 * Math.PI;
}
return new double[]{ra, dec};
}
}
/*
Orekit初始化完成
ecefPV:{-1,141,867.4599997457; -6,579,772.96716301; 15,498.2306612817}
j2000PV:{-1,141,867.4599997457; 6,579,790.76761549; 2,439.0499603377}
observerLLA:{lat: 0.1338244447 deg, lon: -99.8451747745 deg, alt: 300,000.1157213367}
*/
2、环境配置(pom.xml)
XML
<?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>AdvancedGaussIODExample</groupId>
<artifactId>advancedgaussiod-example</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Orekit核心库 -->
<dependency>
<groupId>org.orekit</groupId>
<artifactId>orekit</artifactId>
<version>12.2</version>
</dependency>
<!-- 数学库 -->
<dependency>
<groupId>org.hipparchus</groupId>
<artifactId>hipparchus-core</artifactId>
<version>4.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>CoordTransformTest</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
3、Maven编译和运行命令
mvn clean compile
mvn exec:java -Dexec.mainClass="CoordTransformTest"