最近再写手机端的SPP程序,需要读取包括Rinex格式的观测值文件和广播星历文件,上一篇文章中给出了Java读取Rinex2.11格式的观测值o文件(链接https://blog.csdn.net/qq_40449816/article/details/100695746),接下来,本文将给出读取广播星历文件的代码。
package ReadFile;
import ReadFile.DataClass.Ephemeris;
import TimeSysTrans.GPST;
import TimeSysTrans.TimeSysTrans;
import TimeSysTrans.UTC;
import Util.CharTrans;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 该类实现对Rinex2.11格式的广播星历o文件的读取
* @author lhn
*/
public class ReadNavData {
/**星历列表*/
private List ephemerisList;
/**构造函数*/
public ReadNavData(String filePath){
ephemerisList=new ArrayList<>();
readNavFile(filePath);
}
private void readNavFile(String path){
FileReader fr=null;
BufferedReader br=null;
try{
fr=new FileReader(path);
br=new BufferedReader(fr);
/*****************读取头文件部分数据*********************/
String str="";
while((str=br.readLine())!=null){
switch (str.substring(60).trim()){
case "END OF HEADER":
break;
default:
continue;
}
break;
}
/*****************读取头文件部分数据结束*********************/
/*****************读取广播星历数据部分*********************/
while ((str=br.readLine())!=null){
Ephemeris ephemeris=new Ephemeris();
String sv_prn= CharTrans.strOpera(str.substring(0,2).trim());
/*获取观测历元时刻*/
int year=Integer.valueOf(str.substring(3,5).trim());
int month=Integer.valueOf(str.substring(6,8).trim());
int day=Integer.valueOf(str.substring(9,11).trim());
int hour=Integer.valueOf(str.substring(12,14).trim());
int minute=Integer.valueOf(str.substring(15,17).trim());
int sec=Integer.valueOf(str.substring(18,20).trim());
UTC utc=new UTC(year,month,day,hour,minute,sec); /*UTC时间*/
GPST obs_t=new GPST();
TimeSysTrans.UTCToGPST(utc,obs_t);
ephemeris.setPrn(sv_prn);
ephemeris.setGpst(obs_t);
double a0=CharTrans.SignTrans(str.substring(22,41).trim());
ephemeris.setA0(a0);
double a1=CharTrans.SignTrans(str.substring(41,60).trim());
ephemeris.setA1(a1);
double a2=CharTrans.SignTrans(str.substring(60,79).trim());
ephemeris.setA2(a2);
/*****************读轨道1-4数据****************************/
double[]data=new double[16];
for(int i=0;i<4;i++){
int tag=i*4;
str=br.readLine();
data[tag]=CharTrans.SignTrans(str.substring(3,22).trim());
data[tag+1]=CharTrans.SignTrans(str.substring(22,41).trim());
data[tag+2]=CharTrans.SignTrans(str.substring(41,60).trim());
data[tag+3]=CharTrans.SignTrans(str.substring(60,79).trim());
}
if(data!=null){
ephemeris.setIODE(data[0]);
ephemeris.setCrs(data[1]);
ephemeris.setDelta_n(data[2]);
ephemeris.setM0(data[3]);
ephemeris.setCuc(data[4]);
ephemeris.setE(data[5]);
ephemeris.setCus(data[6]);
ephemeris.setSqurt_A(data[7]);
ephemeris.setToe(data[8]);
ephemeris.setCic(data[9]);
ephemeris.setOMEGA(data[10]);
ephemeris.setCIS(data[11]);
ephemeris.setI0(data[12]);
ephemeris.setCrc(data[13]);
ephemeris.setOmega(data[14]);
ephemeris.setOMEGA_DOT(data[15]);
}
/**轨道5*/
str=br.readLine();
double idot=CharTrans.SignTrans(str.substring(3,22).trim());
ephemeris.setIDOT(idot);
/**轨道6*/
str=br.readLine();
double tgd=CharTrans.SignTrans(str.substring(41,60).trim());
ephemeris.setTGD(tgd);
ephemerisList.add(ephemeris);
/**轨道7*/
br.readLine();
}
/*****************读取广播星历数据部分结束*********************/
}catch (IOException e){
e.printStackTrace();
}finally {
//关闭文件输入流
try {
if(br!=null) {
br.close();
}
if(fr!=null) {
fr.close();
}
}catch(IOException e) {
e.printStackTrace();
}
}
}
public List getEphemerisList() {
return ephemerisList;
}
}
package ReadFile.DataClass;
import TimeSysTrans.GPST;
/**
* 广播星历类
*/
public class Ephemeris {
private String prn; /*卫星PRN*/
private GPST gpst; /*卫星的GPS时*/
private double a0;/*卫星钟差(s)*/
private double a1;/*卫星钟速(s/s)*/
private double a2;/*卫星钟速变化率(s/s2)*/
private double IODE;/*星历表数据龄期*/
/**开普勒六参数及轨道摄动九参数*/
private double Crs;
private double Delta_n;
private double M0;
private double Cuc;
private double e;
private double Cus;
private double squrt_A;
private double Toe;
private double Cic;
private double OMEGA;
private double CIS;
private double i0;
private double Crc;
private double omega;
private double OMEGA_DOT;
private double IDOT;
private double TGD;
public double getTGD() {
return TGD;
}
public void setTGD(double TGD) {
this.TGD = TGD;
}
/**
* get()和set()函数
* */
public String getPrn() {
return prn;
}
public void setPrn(String prn) {
this.prn = prn;
}
public GPST getGpst() {
return gpst;
}
public void setGpst(GPST gpst) {
this.gpst = gpst;
}
public double getA0() {
return a0;
}
public void setA0(double a0) {
this.a0 = a0;
}
public double getA1() {
return a1;
}
public void setA1(double a1) {
this.a1 = a1;
}
public double getA2() {
return a2;
}
public void setA2(double a2) {
this.a2 = a2;
}
public double getIODE() {
return IODE;
}
public void setIODE(double IODE) {
this.IODE = IODE;
}
public double getCrs() {
return Crs;
}
public void setCrs(double crs) {
Crs = crs;
}
public double getDelta_n() {
return Delta_n;
}
public void setDelta_n(double delta_n) {
Delta_n = delta_n;
}
public double getM0() {
return M0;
}
public void setM0(double m0) {
M0 = m0;
}
public double getCuc() {
return Cuc;
}
public void setCuc(double cuc) {
Cuc = cuc;
}
public double getE() {
return e;
}
public void setE(double e) {
this.e = e;
}
public double getCus() {
return Cus;
}
public void setCus(double cus) {
Cus = cus;
}
public double getSqurt_A() {
return squrt_A;
}
public void setSqurt_A(double squrt_A) {
this.squrt_A = squrt_A;
}
public double getToe() {
return Toe;
}
public void setToe(double toe) {
Toe = toe;
}
public double getCic() {
return Cic;
}
public void setCic(double cic) {
Cic = cic;
}
public double getOMEGA() {
return OMEGA;
}
public void setOMEGA(double OMEGA) {
this.OMEGA = OMEGA;
}
public double getCIS() {
return CIS;
}
public void setCIS(double CIS) {
this.CIS = CIS;
}
public double getI0() {
return i0;
}
public void setI0(double i0) {
this.i0 = i0;
}
public double getCrc() {
return Crc;
}
public void setCrc(double crc) {
Crc = crc;
}
public double getOmega() {
return omega;
}
public void setOmega(double omega) {
this.omega = omega;
}
public double getOMEGA_DOT() {
return OMEGA_DOT;
}
public void setOMEGA_DOT(double OMEGA_DOT) {
this.OMEGA_DOT = OMEGA_DOT;
}
public double getIDOT() {
return IDOT;
}
public void setIDOT(double IDOT) {
this.IDOT = IDOT;
}
}
最后,接下来,根据广播星历数据计算某一信号发射时刻中圆轨道GPS卫星的空间大地坐标系下的坐标(GPS采用的坐标系是WGS-84),其实现的代码将在下一篇文章给出。