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"

相关推荐
青云计划9 小时前
知光项目知文发布模块
java·后端·spring·mybatis
赶路人儿9 小时前
Jsoniter(java版本)使用介绍
java·开发语言
探路者继续奋斗10 小时前
IDD意图驱动开发之意图规格说明书
java·规格说明书·开发规范·意图驱动开发·idd
消失的旧时光-194311 小时前
第十九课:为什么要引入消息队列?——异步系统设计思想
java·开发语言
A懿轩A11 小时前
【Java 基础编程】Java 面向对象入门:类与对象、构造器、this 关键字,小白也能写 OOP
java·开发语言
乐观勇敢坚强的老彭11 小时前
c++寒假营day03
java·开发语言·c++
biubiubiu070611 小时前
谷歌浏览器无法访问localhost:8080
java
大黄说说12 小时前
新手选语言不再纠结:Java、Python、Go、JavaScript 四大热门语言全景对比与学习路线建议
java·python·golang
烟沙九洲12 小时前
Java 中的 封装、继承、多态
java
识君啊12 小时前
SpringBoot 事务管理解析 - @Transactional 的正确用法与常见坑
java·数据库·spring boot·后端