rinex文件放在一起读取,主要是分为头部和body两部分读取。opt为prcopt->rnxopt[2][256] (rinex options {rover,base})
RINEX VERSION / TYPE:类型ver、格式type、系统sys、时间tsys
通过不同的读取文件格式进入子函数内(重点分析O和N,遇到c文件直接跳出头文件读取)
switch (*type) {
case 'O': decode_obsh(fp,buff,*ver,tsys,tobs,nav,sta); break;
case 'N': decode_navh (buff,nav); break;
case 'G': decode_gnavh(buff,nav); break;
case 'H': decode_hnavh(buff,nav); break;
case 'J': decode_navh (buff,nav); break;
case 'L': decode_navh (buff,nav); break;
}
观测文件(decode_obsh)
观测值信息存入此结构体内
typedef struct { /* station parameter type */
char name [MAXANT]; /* marker name */
char marker [MAXANT]; /* marker number */
char antdes [MAXANT]; /* antenna descriptor */
char antsno [MAXANT]; /* antenna serial number */
char rectype[MAXANT]; /* receiver type descriptor */
char recver [MAXANT]; /* receiver firmware version */
char recsno [MAXANT]; /* receiver serial number */
int antsetup; /* antenna setup id */
int itrf; /* ITRF realization year */
int deltype; /* antenna delta type (0:enu,1:xyz) */
double pos[3]; /* station position (ecef) (m) */
double del[3]; /* antenna position delta (e/n/u or x/y/z) (m) */
double hgt; /* antenna height (m) */
int glo_cp_align; /* GLONASS code-phase alignment (0:no,1:yes) */
double glo_cp_bias[4]; /* GLONASS code-phase biases {1C,1P,2C,2P} (m) */
} sta_t;
接收机名字name、编号marker、列号recsno、类型rectype、版本号recver、天线序列号antsno、天线类型antdes、接收机近似坐标pos、天线中心相对于天线标志位的下表面高度东向北向的偏心del、时间系统tsys、跳秒数nav->utc_gps。GLONASS略
重点在于读取观测类型char tobs[][MAXOBSTYPE][4],只考虑rinex3以上的版本。
C 28 C1X C2I C5X C6I C7I C7Z C8X D1X D2I D5X D6I D7I D7Z SYS / # / OBS TYPES
D8X L1X L2I L5X L6I L7I L7Z L8X S1X S2I S5X S6I S7I SYS / # / OBS TYPES
S7Z S8X SYS / # / OBS TYPES
用于修改观测类型第三位不能读取问题——frqcodes[]="1256789"和*defcodes[]={ "CWX ", GPS: L125____ "CCXX X ", GLO: L1234_6_ "C XXXX ", GAL: L1_5678_,"CXXX ", QZS: L1256___ "C X ", SBS: L1_5____ "XIXIIX ", BDS: L125678_ " A A" IRN: L__5___9 。
tobs[i][MAXOBSTYPE][4]中 i:系统; MAXOBSTYPE:观测数目,最大读取64,上例读取28; [4]:型号,例如C1X。tobs[5][0][0]表示北斗的第一个观测类型的第一个元素C。tobs[5][0]表示C1X。
在3.02版本中对北斗观测类型修改,x1x变为x2x
if (!(p=strchr(syscodes,buff[0]))) {
trace(2,"invalid system code: sys=%cn",buff[0]);
return;
}
i=(int)(p-syscodes); //属于什么系统
n=(int)str2num(buff,3,3);
for (j=nt=0,k=7;j<n;j++,k+=4) {
if (k>58) {
if (!fgets(buff,MAXRNXLEN,fp)) break;
k=7;
}
if (nt<MAXOBSTYPE-1) setstr(tobs[i][nt++],buff+k,3); /* 观测类型,i代表不同的系统,nt为不同的频点,后面的表示频点的字符组成如c1c */
}
*tobs[i][nt]=' ';
/* change BDS B1 code: 3.02 */
if (i==5&&fabs(ver-3.02)<1e-3) {
for (j=0;j<nt;j++) if (tobs[i][j][1]=='1') tobs[i][j][1]='2';
}
/* if unknown code in ver.3, set default code */
for (j=0;j<nt;j++) {
if (tobs[i][j][2]) continue;
if (!(p=strchr(frqcodes,tobs[i][j][1]))) continue;
tobs[i][j][2]=defcodes[i][(int)(p-frqcodes)];
trace(2,"set default for unknown code: sys=%c code=%sn",buff[0],
tobs[i][j]);
}
导航电文
IONOSPHERIC CORR_____各个系统的电离层参数nav->ion_gps/gal/qzs.....
TIME SYSTEM CORR_____GNSS系统时间与UTC或其他时间系统的差异nav->utc_gps/glo/gal......
LEAP SECONDS_________跳秒时间差nav->utc_gps
观测文件
信号索引读取,设置信号的tobs读取顺序、频点、优先级及优先级
typedef struct { /* signal index type */
int n; /* number of index */
int idx[MAXOBSTYPE]; /* signal freq-index */
int pos[MAXOBSTYPE]; /* signal index in obs data (-1:no) */
uint8_t pri [MAXOBSTYPE]; /* signal priority (15-0) */
uint8_t type[MAXOBSTYPE]; /* type (0:C,1:L,2:D,3:S) */
uint8_t code[MAXOBSTYPE]; /* obs-code (CODE_L??) */
double shift[MAXOBSTYPE]; /* phase shift (cycle) */
} sigind_t;
1.索引代码段(set_index)
for (i=n=0;*tobs[i];i++,n++) { /*存储的是观测值类型,CIC、C1W 在obscodes什么位置上*/
ind->code[i]=obs2code(tobs[i]+1); /*code存储的是观测值频率信号通道类型,映射为频率。L1、L2、L3、L4 code为在什么位置*/
ind->type[i]=(p=strchr(obscodes,tobs[i][0]))?(int)(p-obscodes):0; /*观测值类型0伪距1载波2多普勒3载噪比*/
ind->idx[i]=code2idx(sys,ind->code[i]); /*频点索引,记录频点信息,例如L1/L2/L3/L4*/
ind->pri[i]=getcodepri(sys,ind->code[i],opt); /*频率编号优先级,返回*/
ind->pos[i]=-1; /*有效标志位,先全部无效-1,后面优先级用哪个*/
}
static char *obscodes[]={ /* observation code strings */
"" ,"1C","1P","1W","1Y", "1M","1N","1S","1L","1E", /* 0- 9 */
"1A","1B","1X","1Z","2C", "2D","2S","2L","2X","2P", /* 10-19 */
"2W","2Y","2M","2N","5I", "5Q","5X","7I","7Q","7X", /* 20-29 */
"6A","6B","6C","6X","6Z", "6S","6L","8L","8Q","8X", /* 30-39 */
"2I","2Q","6I","6Q","3I", "3Q","3X","1I","1Q","5A", /* 40-49 */
"5B","5C","9A","9B","9C", "9X","1D","5D","5P","5Z", /* 50-59 */
"6E","7D","7P","7Z","8D", "8P","4A","4B","4X","" /* 60-69 */
};
优先级顺序codeepris中的[7][MAXFREQ][16] 15为最高优先级,最低为1,0为错误--------------例如gps频点为:C优先级14 ;P优先级13;Y优先级12;W优先级11
static char codepris[7][MAXFREQ][16]={ /* code priority for each freq-index */
/* L1/E1/B1 L2/E5b/B2 L5/E5a/L3 E6/LEX E5(a+b) */
{"CPYWMNSL","CPYWMNDLSX","IQX" ,"" ,"" ,""}, /* GPS */
{"CPABX" ,"CPABX" ,"IQX" ,"" ,"" ,""}, /* GLO */
{"CABXZ" ,"IQX" ,"IQX" ,"ABCXZ" ,"IQX" ,""}, /* GAL */
{"CLSXZ" ,"LSX" ,"IQXDPZ" ,"LSXEZ" ,"" ,""}, /* QZS */
{"C" ,"IQX" ,"" ,"" ,"" ,""}, /* SBS */
{"IQXDPAN" ,"IQXDPZ" ,"DPX" ,"IQXA" ,"DPX" ,""}, /* BDS */
{"ABCX" ,"ABCX" ,"" ,"" ,"" ,""} /* IRN */
};
系统频点代码段L1/L2/L3/L4,例子作为北斗频点的信息读取,主要通过观测类型的数字进行判断频点信息,例如C1X中的1
extern int code2idx(int sys, uint8_t code)
{
double freq;
switch (sys) {
case SYS_GPS: return code2freq_GPS(code,&freq);
case SYS_GLO: return code2freq_GLO(code,0,&freq);
case SYS_GAL: return code2freq_GAL(code,&freq);
case SYS_QZS: return code2freq_QZS(code,&freq);
case SYS_SBS: return code2freq_SBS(code,&freq);
case SYS_CMP: return code2freq_BDS(code,&freq);
case SYS_IRN: return code2freq_IRN(code,&freq);
}
return -1;
}
switch (obs[0]) {
case '1': *freq=FREQL1; return 0; /* B1C */
case '2': *freq=FREQ1_CMP; return 0; /* B1I */
case '7': *freq=FREQ2_CMP; return 1; /* B2I/B2b */
case '5': *freq=FREQL5; return 2; /* B2a */
case '6': *freq=FREQ3_CMP; return 3; /* B3 */
case '8': *freq=FREQE5ab; return 4; /* B2ab */
}
优先级排序,只对NFREQ个频点排序,选最高优先级,标志pos位作为选择,pos是信号标志位,-1表示该频点观测量不选择,有数据的话表示频点,即L1、L2等。
for (i=0;i<NFREQ;i++) {
for (j=0,k=-1;j<n;j++) {
if (ind->idx[j]==i&&ind->pri[j]&&(k<0||ind->pri[j]>ind->pri[k])) {
k=j;
}
}
if (k<0) continue;
for (j=0;j<n;j++) {
if (ind->code[j]==ind->code[k]) ind->pos[j]=i;
}
}
2.代码段
代码段以历元为单位,对于rinex3以上,先读卫星数目decode_obsepoch,然后读取历元内的数据,
typedef struct { /* observation data record */
gtime_t time; /* receiver sampling time (GPST) */
uint8_t sat,rcv; /* satellite/receiver number */
uint16_t SNR[NFREQ+NEXOBS]; /* signal strength (0.001 dBHz) */
uint8_t LLI[NFREQ+NEXOBS]; /* loss of lock indicator */
uint8_t code[NFREQ+NEXOBS]; /* code indicator (CODE_???) */
double L[NFREQ+NEXOBS]; /* observation data carrier-phase (cycle) */
double P[NFREQ+NEXOBS]; /* observation data pseudorange (m) */
float D[NFREQ+NEXOBS]; /* observation data doppler frequency (Hz) */
int timevalid; /* time is valid (Valid GNSS fix) for time mark */
gtime_t eventime; /* time of event (GPST) */
uint8_t qualL[NFREQ+NEXOBS]; /* quality of carrier phase measurement */
uint8_t qualP[NFREQ+NEXOBS]; /* quality of pseudorange measurement */
uint8_t freq; /* GLONASS frequency channel (0-13) */
} obsd_t;
注意:(1)有一块关于rinex2.11及以下的版本需要选择优先级。
(2)在数据分配位置时rinex2.11以上的以pos作为标志位,实际上也已经对优先级选择完成了。写入时pos标志位为-1时已经舍弃
分配方式:
for (i=n=m=q=0;i<ind->n;i++) {
p[i]=(ver<=2.11)?ind->idx[i]:ind->pos[i];
if (ind->type[i]==0&&p[i]==0) k[n++]=i; /* C1? index */
if (ind->type[i]==0&&p[i]==1) l[m++]=i; /* C2? index */
if (ind->type[i]==0&&p[i]==2) r[q++]=i; /* C3? index */
}
导航文件
这部分读取略,主要是对于文件的逐个读取
相关知识
rtklib学习——读取观测文件和导航电文
python 批量读取excel
易语言如何读取多个配置项
如何在魔物观测者中添加新宠物
宠物导航怎么用?
机器学习之K近邻
魔力百科如何在魔物观测者中添加新宠物
广东宠物GPS定位器「深圳市荣之鑫科技供应」
淮安市林业技术指导站淮安市境内野生鸟类观测及野生动物保护宣传采购成交公告
江苏省南通环境监测中心智能鸟类观测系统采购项目竞争性磋商公告
网址: rtklib学习——读取观测文件和导航电文 https://m.mcbbbk.com/newsview1212261.html
上一篇: 先观察下列等式,然后用你发现的规 |
下一篇: 观察乌龟日记(模板11篇) |