在上两文中给出了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.getEccentricAnomalyRadians();//真近点角(弧)double trueAnomalyRadians=Math.atan2(Math.sqrt(1-ephemeris.getE()*ephemeris.getE())*Math.sin(eccentricAnomalyRadians),Math.cos(eccentricAnomalyRadians)-ephemeris.getE());//升交距角(弧)double argumentOfLatitudeRadians=ephemeris.getOmega()+trueAnomalyRadians;//受摄卫星矢距(m)double radiusOfSatelliteOrbit=ephemeris.getSqurt_A()*ephemeris.getSqurt_A()*(1-ephemeris.getE()*Math.cos(eccentricAnomalyRadians));//计算摄动改正项/*升交距角改正项*/double argumentOfLatitudeCorrection=ephemeris.getCuc()*Math.cos(2*argumentOfLatitudeRadians)+ephemeris.getCus()*Math.sin(2*argumentOfLatitudeRadians);/*受摄卫星失距改正项*/double radiusCorrection=ephemeris.getCrc()*Math.cos(2*argumentOfLatitudeRadians)+ephemeris.getCrs()*Math.sin(2*argumentOfLatitudeRadians);/*受摄卫星轨道倾角改正*/double inclinationCorrectionRadians=ephemeris.getCic()*Math.cos(2*argumentOfLatitudeRadians)+ephemeris.getCIS()*Math.sin(2*argumentOfLatitudeRadians);/*改正后的值*/argumentOfLatitudeRadians+=argumentOfLatitudeCorrection;radiusOfSatelliteOrbit+=radiusCorrection;double inclinationRadians=ephemeris.getI0()+inclinationCorrectionRadians+ephemeris.getIDOT()*tkSec;//计算卫星再轨道平面坐标系的位置double xPosition=radiusOfSatelliteOrbit*Math.cos(argumentOfLatitudeRadians);double yPosition=radiusOfSatelliteOrbit*Math.sin(argumentOfLatitudeRadians);//计算观测瞬间升交点经度Ldouble omegaKRadians=ephemeris.getOMEGA()+(ephemeris.getOMEGA_DOT()-EARTH_ROTATION_RATE_RAD_PER_SEC)*tkSec-EARTH_ROTATION_RATE_RAD_PER_SEC*ephemeris.getToe();//计算卫星瞬时地球坐标中的位置X_Pos=xPosition*Math.cos(omegaKRadians)-yPosition*Math.cos(inclinationRadians)* Math.sin(omegaKRadians);Y_Pos=xPosition*Math.sin(omegaKRadians)+yPosition*Math.cos(inclinationRadians)*Math.cos(omegaKRadians);Z_Pos=yPosition*Math.sin(inclinationRadians);} catch (Exception e) {e.printStackTrace();}}satellitePosition.setSatellitePosition_X(X_Pos);satellitePosition.setSatellitePosition_Y(Y_Pos);satellitePosition.setSatellitePosition_Z(Z_Pos);return satellitePosition;}}
  • SatelliteClockCorrection.java

package Util.CorrectionCalculate;import ReadFile.DataClass.Ephemeris;
import TimeSysTrans.GPST;/*** 该类实现为卫星钟差改正*/
public class SatelliteClockCorrection {//光速(m)private static final double SPEED_OF_LIGHT_MPS = 299792458.0;//GM(万有引力常数与地球质量的乘积)private static final double EARTH_UNIVERSAL_GRAVITATIONAL_CONSTANT_M3_SM2 = 3.986005e14;//相对论改正常数private static final double RELATIVISTIC_CONSTANT_F = -4.442807633e-10;//地球自转角速度private static final double EARTH_ROTATION_RATE_RAD_PER_SEC = 7.2921151467e-5;//一周的秒数private static final int SECONDS_IN_WEEK = 604800;//精度限差private static final double ACCURACY_TOLERANCE = 1.0e-11;//迭代最大次数private static final int MAX_ITERATIONS = 100;//卫星钟差改正(m)private double satelliteClockCorrectionMeter;//偏近点角(弧)private double eccentricAnomalyRadians;//归化时间tk(s)private double timeFromRefEpochSec;/*** @param e 星历数据* @param transmissionTime 信号传播的时间*/public SatelliteClockCorrection(Ephemeris e, GPST transmissionTime) throws Exception {if(e!=null && transmissionTime!=null){calculateSatelliteClockCorrectionAndEccentricAnomalyRadians(e,transmissionTime);}}private void calculateSatelliteClockCorrectionAndEccentricAnomalyRadians(Ephemeris ephemeris,GPST transmissionTime) throws Exception {//平近点角(弧)double meanAnomallyRad;//偏近点角double eccentricAnomallay;//长半轴(m)double a=ephemeris.getSqurt_A()*ephemeris.getSqurt_A();//卫星平均角速度(弧/秒)double n0=Math.sqrt(EARTH_UNIVERSAL_GRAVITATIONAL_CONSTANT_M3_SM2/(a*a*a));double n=n0+ephemeris.getDelta_n();//GPST时转为秒double transmissionSec=transmissionTime.getWeeks()*SECONDS_IN_WEEK+transmissionTime.getSeconds();//初始时间间隔double tcSec=transmissionSec-ephemeris.getGpst().getWeeks()*SECONDS_IN_WEEK-ephemeris.getGpst().getSeconds();tcSec=fixWeekRollerover(tcSec);//设置偏近点角等初始值用于迭代计算double oldEccentricAnomalyRad = 0.0;double newSatClockCorrectionSeconds = 0.0;double relativisticCorrection = 0.0;double changeInSatClockCorrection = 0.0;final double initSatClockCorrectionSeconds=ephemeris.getA0()+ephemeris.getA1()*tcSec+ephemeris.getA2()*tcSec*tcSec-ephemeris.getTGD();//卫星钟差改正数(s)double satClockCorrrection=initSatClockCorrectionSeconds;double tkSec;int satClockCorrectionsCounter = 0;do {int eccentricAnomalyCounter = 0;//归化时间tkSec=transmissionSec-(ephemeris.getGpst().getWeeks()*SECONDS_IN_WEEK+ephemeris.getGpst().getSeconds()+satClockCorrrection);tkSec=fixWeekRollerover(tkSec);double meanAnomally=ephemeris.getM0()+n*tkSec;//初始偏近点角等于平近点角eccentricAnomallay=meanAnomally;//迭代运算求出偏近点角do {oldEccentricAnomalyRad=eccentricAnomallay;eccentricAnomallay=meanAnomally+ephemeris.getE()*Math.sin(eccentricAnomallay);eccentricAnomalyCounter++;if(eccentricAnomalyCounter>MAX_ITERATIONS){throw new Exception("Kepler Eccentric Anomaly calculation did not converge in "+ MAX_ITERATIONS + " iterations");}}while (Math.abs(oldEccentricAnomalyRad-eccentricAnomallay)>ACCURACY_TOLERANCE);relativisticCorrection=RELATIVISTIC_CONSTANT_F*ephemeris.getE()*ephemeris.getSqurt_A()*Math.sin(eccentricAnomallay);newSatClockCorrectionSeconds=initSatClockCorrectionSeconds+relativisticCorrection;changeInSatClockCorrection=Math.abs(satClockCorrrection-newSatClockCorrectionSeconds);satClockCorrrection=newSatClockCorrectionSeconds;satClockCorrectionsCounter++;if(satClockCorrectionsCounter>MAX_ITERATIONS){throw new Exception("Satellite Clock Correction calculation did not converge in "+ MAX_ITERATIONS + " iterations");}}while (changeInSatClockCorrection>ACCURACY_TOLERANCE);tkSec=transmissionSec-(ephemeris.getGpst().getWeeks()*SECONDS_IN_WEEK+ephemeris.getGpst().getSeconds()+satClockCorrrection);this.satelliteClockCorrectionMeter=satClockCorrrection*SPEED_OF_LIGHT_MPS;this.timeFromRefEpochSec=tkSec;this.eccentricAnomalyRadians=eccentricAnomallay;}/*** 将time的范围调整为-302400-302400之间* @param time* @return*/private double fixWeekRollerover(double time){double newTime=time;if(time > SECONDS_IN_WEEK / 2.0){newTime=time-SECONDS_IN_WEEK;}if(time <- SECONDS_IN_WEEK / 2.0){newTime=time+SECONDS_IN_WEEK;}return newTime;}public double getSatelliteClockCorrectionMeter() {return satelliteClockCorrectionMeter;}public double getEccentricAnomalyRadians() {return eccentricAnomalyRadians;}public double getTimeFromRefEpochSec() {return timeFromRefEpochSec;}
}
  • SatellitePosition.java

package PosCalcluate;/*** 该类为卫星的位置信息类*/
public class SatellitePosition {//X坐标(m)private double satellitePosition_X;//Y坐标(m)private double satellitePosition_Y;//Z坐标(m)private double satellitePosition_Z;public double getSatellitePosition_X() {return satellitePosition_X;}public void setSatellitePosition_X(double satellitePosition_X) {this.satellitePosition_X = satellitePosition_X;}public double getSatellitePosition_Y() {return satellitePosition_Y;}public void setSatellitePosition_Y(double satellitePosition_Y) {this.satellitePosition_Y = satellitePosition_Y;}public double getSatellitePosition_Z() {return satellitePosition_Z;}public void setSatellitePosition_Z(double satellitePosition_Z) {this.satellitePosition_Z = satellitePosition_Z;}
}

卫星某一时刻的空间位置计算完后,接下来,就是根据观测历元伪距等相位观测值数据迭代计算求出测站坐标,代码实现将在下文中给出。

Java实现对某一时刻GPS中圆轨道卫星的空间位置计算相关推荐

  1. java string对象放在什么区域_java中String对象的存储位置

    packagetest.string.equal;public classMain {/**创建了三个对象,"helloworld对象创建在常量池中",每次new String() ...

  2. java实验3 判断二维坐标系中2个圆的位置关系

    关键字: Java基本语法 输入输出 算术运算 关系运算 选择语句 内容要求: 编写程序,实现如下功能: 提示用户输入2个圆的圆心坐标和各自的半径值,判断并输出这两个圆之前的位置关系. 两个圆之间的位 ...

  3. GPS中的空间坐标系

    GPS空间坐标系通常可分为惯性坐标系和地球坐标系两大类,不同的坐标系对于描述卫星和用户的空间位置具有不同的特点.熟悉空间坐标系可以在大脑中生成形象的空间位置体系,便于之后的GPS原理学习.       ...

  4. java什么是栈和堆_JAVA中的栈和堆

    JAVA在程序运行时,在内存中划分5片空间进行数据的存储.分别是:1:寄存器.2:本地方法区.3:方法区.4:栈.5:堆. 基本,栈stack和堆heap这两个概念很重要,不了解清楚,后面就不用学了. ...

  5. JTS Java空间几何计算、距离、最近点、subLine等 稳健的一比,持续更新中

    文章目录 前言 地理坐标系和投影坐标系 地理坐标系 投影坐标系 地图投影 墨卡托/Web墨卡托 常见坐标系 地理坐标系和投影坐标系互转 EPSG:3857和EPSG:4326 Java各坐标系之间的转 ...

  6. 天球坐标系、地球坐标系与地球自转有无关系,哪一种便于描述地面观测站的空间位置,哪一种便于描述人造地球卫星的位置?请用类似思维导图的方式总结GNSS定位的时空基准?GPS卫星定位中时间系统有何重要意义?

    答: 1.天球坐标系.地球坐标系与地球自转有无关系,哪一种便于描述地面观测站的空间位置,哪一种便于描述人造地球卫星的位置? 卫星定位中常采用空间直角坐标系及其相应的大地坐标系,一般取地球质心为坐标系的 ...

  7. 天球坐标系、地球坐标系与地球自转有无关系?哪一种便于描述地面观测站的空间位置?哪一种便于描述人造地球卫星的位置?总结GNSS定位的时空基准? GPS卫星定位中,时间系统有何重要意义?

    1. 天球坐标系.地球坐标系与地球自转有无关系?哪一种便于描述地面观测站的空间位置?哪一种便于描述人造地球卫星的位置? 天球坐标系与地球自转无关,地球坐标系与地球自转有关.地球坐标系便于描述地面观测站 ...

  8. java面试大全(7w字,更新中)

    1.杂题 1.maven依赖冲突的解决方法 依赖冲突的原因 举个例子,A依赖于B与C,B依赖于D的1.0版本,C依赖于D的2.0版本,这就导致加载的时候到底会引入那个版本的jar包的问题 解决方法: ...

  9. java的对象是什么意思_Java中对象和对象引用的区别,引用、指向是什么意思

    Java的变量分为两大类:基本数据类型和引用数据类型. 其中基本类型变量有四类8种:byte short int long float double char boolean,除了8种基本数据类型变量 ...

最新文章

  1. 拜耳与Recursion联手加强数字化药物发现
  2. 复数特征值求特征向量_深刻地认识特征值
  3. 过期页面SEO该如何进行处理?
  4. 服务器虚拟交换机到网卡不通,浅析虚拟化环境网卡绑定模式
  5. ssl certificate 验证
  6. [Redis6]配置文件详解
  7. 查看ftp创建的用户
  8. 用计算机模拟病毒,计算机模拟揭露HIV病毒体内传播细节,有望为治疗提供新途径...
  9. php7视频处理扩展_PHP7扩展开发之类型处理
  10. 计算机网络——网络安全基础笔记
  11. android助手最新版本,Android 开发助手功能及版本介绍
  12. C++之策略(Strategy)模式
  13. 天原笔记(3)气旋与反气旋
  14. 海量资源!开发人员成功转行数据科学必备清单
  15. Jetson Nano 按键切换摄像头
  16. Android:AppBarLayout设置elevation为0,结果消失
  17. 计算机毕业设计Java宠物用品交易网站(源码+系统+mysql数据库+lw文档)
  18. 字面量、直接量、常量
  19. 2021年宾阳开智中学高考成绩查询,喜报!宾阳2020年中考成绩揭晓,106人全A+!...
  20. 普歌 - SpringSecurity入门(1)

热门文章

  1. 陕西师范大学计算机类专业咋样,陕西师范大学计算机类专业2016年在陕西理科高考录取最低分数线...
  2. spring-webflux中FluxDataBuffer 转String
  3. 抖音android x86,抖音数据采集教程,详解Hook框架frida,让你在逆向工作中效率成倍提升!...
  4. python学习记录之随机生成姓名
  5. 整型与字符串间的转换
  6. 《电路基础》同相运算放大器
  7. ads操作(1)——关于ads版图的导出和设计
  8. 图书管理demo(课程小作业,较简单)
  9. 导体电阻夹具对导体长度要求
  10. iOS App 审核被拒的原因搜罗