readsp3(infile[i],nav,0)和readrnxc(infile[i],nav)
读取sp3文件
对.sp3/.SP3/.eph/.EPH读取,分别对头文件和body部分
头文件:卫星数目ns和卫星系统与prn码,系统类型tsys(M),Base for Pos/Vel(mm or 10**-4 mm/sec)和Base for Clk/Rate(psec or 10**-4 psec/sec) bfact
#dP2020 12 1 0 0 0.00000000 288 u+U IGb14 FIT GFZ
## 2134 172800.00000000 300.00000000 59184 0.0000000000000
+ 122 C01C02C03C04C05C06C07C08C09C10C11C12C13C16C19C20C21
+ C22C23C24C25C26C27C28C29C30C32C33C34C35C36C37C38C39
+ C40C41C42C43C44C45C46C60E01E02E03E04E05E07E08E09E11
+ E12E13E14E15E18E19E21E24E25E26E27E30E31E33E36G01G02
+ G03G04G05G06G07G08G09G10G11G12G13G14G15G16G17G18G19
+ G20G21G22G23G24G25G26G27G28G29G30G31G32J01J02J03J07
+ R01R02R03R04R05R07R08R09R12R13R14R15R16R17R18R19R20
+ R21R22R24 00 00 00 00 00 00 00 00 00 00 00 00 00 00
精密星历储存的结构体
typedef struct { /* precise ephemeris type */
gtime_t time; /* time (GPST) */
int index; /* ephemeris index for multiple files */
double pos[MAXSAT][4]; /* satellite position/clock (ecef) (m|s) */
float std[MAXSAT][4]; /* satellite position/clock std (m|s) */
double vel[MAXSAT][4]; /* satellite velocity/clk-rate (m/s|s/s) */
float vst[MAXSAT][4]; /* satellite velocity/clk-rate std (m/s|s/s) */
float cov[MAXSAT][3]; /* satellite position covariance (m^2) */
float vco[MAXSAT][3]; /* satellite velocity covariance (m^2) */
} peph_t;
分别储存在特定的位置,注意xyz的单位,需要10的3次方
读取clk文件
头文件读取:
3.00 C RINEX VERSION / TYPE
EPOS-8 GFZ 20201202 092331 LCL PGM / RUN BY / DATE
2 AS AR # / TYPES OF DATA
GFZ GeoForschungsZentrum Potsdam ANALYSIS CENTER
1 # OF CLK REF
brst 10004M004 ANALYSIS CLK REF
Clocks are re-aligned to broadcast GPS time COMMENT
97 IGb14 # OF SOLN STA / TRF
body读取:
body部分储存的结构体
typedef struct { /* precise clock type */
gtime_t time; /* time (GPST) */
int index; /* clock index for multiple files */
double clk[MAXSAT][1]; /* satellite clock (s) */
float std[MAXSAT][1]; /* satellite clock std (s) */
} pclk_t;
只读取这块
核心代码段
while (fgets(buff,sizeof(buff),fp)) {
if (str2time(buff,8,26,&time)) {
trace(2,"rinex clk invalid epoch: %34.34s\n",buff);
continue;
}
strncpy(satid,buff+3,4);
/* only read AS (satellite clock) record */
if (strncmp(buff,"AS",2)||!(sat=satid2no(satid))) continue;
if (!(satsys(sat,NULL)&mask)) continue;
for (i=0,j=40;i<2;i++,j+=20) data[i]=str2num(buff,j,19);
if (nav->nc>=nav->ncmax) {
nav->ncmax+=1024;
if (!(nav_pclk=(pclk_t *)realloc(nav->pclk,sizeof(pclk_t)*(nav->ncmax)))) {
trace(1,"readrnxclk malloc error: nmax=%d\n",nav->ncmax);
free(nav->pclk); nav->pclk=NULL; nav->nc=nav->ncmax=0;
return -1;
}
nav->pclk=nav_pclk;
}
if (nav->nc<=0||fabs(timediff(time,nav->pclk[nav->nc-1].time))>1E-9) {
nav->nc++;
nav->pclk[nav->nc-1].time =time;
nav->pclk[nav->nc-1].index=index;
for (i=0;i<MAXSAT;i++) {
nav->pclk[nav->nc-1].clk[i][0]=0.0;
nav->pclk[nav->nc-1].std[i][0]=0.0f;
}
}
nav->pclk[nav->nc-1].clk[sat-1][0]=data[0];
nav->pclk[nav->nc-1].std[sat-1][0]=(float)data[1];
}
需要注意:只读取了卫星钟差。