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"

相关推荐
后端AI实验室2 小时前
用AI写代码,我差点把漏洞发上线:血泪总结的10个教训
java·ai
程序员清风4 小时前
小红书二面:Spring Boot的单例模式是如何实现的?
java·后端·面试
belhomme4 小时前
(面试题)Redis实现 IP 维度滑动窗口限流实践
java·面试
Be_Better4 小时前
学会与虚拟机对话---ASM
java
开源之眼6 小时前
《github star 加星 Taimili.com 艾米莉 》为什么Java里面,Service 层不直接返回 Result 对象?
java·后端·github
Maori3167 小时前
放弃 SDKMAN!在 Garuda Linux + Fish 环境下的优雅 Java 管理指南
java
用户908324602738 小时前
Spring AI 1.1.2 + Neo4j:用知识图谱增强 RAG 检索(上篇:图谱构建)
java·spring boot
小王和八蛋8 小时前
DecimalFormat 与 BigDecimal
java·后端
beata8 小时前
Java基础-16:Java内置锁的四种状态及其转换机制详解-从无锁到重量级锁的进化与优化指南
java·后端
IT探险家8 小时前
你的第一个 Java 程序就翻车?HelloWorld 的 8 个隐藏陷阱
java