在上两文中给出了Java编程实现对RINEX格式的观测值文件和广播星历文件的读取(读取观测值文件链接https://blog.csdn.net/qq_40449816/article/details/100695746读取广播星历文件链接https://blog.csdn.net/qq_40449816/article/details/100767851),本文给出根据广播星历对卫星某一时刻的空间位置计算的代码,包括对卫星钟差改正和相对论效应改正。代码详情如下:
-
SatellitePosCal.java
package PosCalcluate;
import ReadFile.DataClass.Ephemeris;
import ReadFile.ReadNavData;
import TimeSysTrans.GPST;
import Util.CorrectionCalculate.SatelliteClockCorrection;
import java.util.ArrayList;
import java.util.List;
/**
* 该类实现对某一时刻卫星位置的计算
* @author lhn
* */
public class SatellitePosCal {
//地球自转角速度
private static final double EARTH_ROTATION_RATE_RAD_PER_SEC = 7.2921151467e-5;
/**
* 实现对某一时刻,某一卫星的空间坐标位置计算(默认采用的坐标系时WGS-84空间大地坐标系)
* @param obs_t 观测时刻
* @param ephemeris 卫星星历数据
* @return satPos
*/
public static SatellitePosition CalSatPos(GPST obs_t, Ephemeris ephemeris){
double X_Pos=0.0;
double Y_Pos=0.0;
double Z_Pos=0.0;
SatellitePosition satellitePosition=new SatellitePosition();
/* *//**筛选出与观测时刻最近的历元星历数据*//*
Ephemeris ephemeris=null;
GPST temp=new GPST();
for(Ephemeris e:ephemerisList){
if(e.getPrn().equals(prn)){
temp=e.getGpst();
ephemeris=e;
break;
}
}
for(Ephemeris e:ephemerisList){
if(e.getPrn().equals(prn)){
GPST gpst=obs_t.sub(e.getGpst());
if(gpst.isLess(temp)){
temp=gpst;
ephemeris=e;
}
}
}*/
/**根据开普勒轨道6参数和摄动九参数确定卫星的空间坐标*/
if(ephemeris!=null){
try {
SatelliteClockCorrection satelliteClockCorrection=new SatelliteClockCorrection(ephemeris,obs_t);
//归化时间(s)
double tkSec=satelliteClockCorrection.getTimeFromRefEpochSec();
//偏近点角(弧)
double eccentricAnomalyRadians=satelliteClockCorrection.getEccentricAno