Orekit常见坐标转换示例

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"

相关推荐
工程师老罗1 小时前
Image(图像)的用法
java·前端·javascript
leo_messi941 小时前
2026版商城项目(一)
java·elasticsearch·k8s·springcloud
美味蛋炒饭.2 小时前
Tomcat 超详细入门教程(安装 + 目录 + 配置 + 部署 + 排错)
java·tomcat
dreamxian2 小时前
苍穹外卖day11
java·spring boot·后端·spring·mybatis
Veggie262 小时前
【Java深度学习】PyTorch On Java 系列课程 第八章 17 :模型评估【AI Infra 3.0】[PyTorch Java 硕士研一课程]
java·人工智能·深度学习
weisian1512 小时前
Java并发编程--19-ThreadPoolExecutor七参数详解:拒绝Executors,手动掌控线程池
java·线程池·threadpool·七大参数
csdn5659738502 小时前
Java打包时,本地仓库有jar 包,Maven打包却还去远程拉取
java·maven·jar
Demon_Hao3 小时前
JAVA通过Redis实现Key分区分片聚合点赞、收藏等计数同步数据库,并且通过布隆过滤器防重复点赞
java·数据库·redis
华科易迅3 小时前
Spring装配对象方法-注解
java·后端·spring
庄周的大鱼4 小时前
分析@TransactionalEventListener注解失效
java·spring·springboot·事务监听器·spring 事件机制·事务注解失效解决