if (*fopt->satantp&&!(readpcv(fopt->satantp,pcvs)))和if (*fopt->rcvantp&&!(readpcv(fopt->rcvantp,pcvr)))
.atx文件读取主要涉及到body部分,对于头文件并未对其详细读取,body部分主要读取的范围如下
START OF ANTENNA
BLOCK IIA G01 G032 1992-079A TYPE / SERIAL NO
0 29-JAN-17 METH / BY / # / DATE
0.0 DAZI
0.0 17.0 1.0 ZEN1 / ZEN2 / DZEN
2 # OF FREQUENCIES
1992 11 22 0 0 0.0000000 VALID FROM
2008 10 16 23 59 59.9999999 VALID UNTIL
IGS14_2136 SINEX CODE
G01 START OF FREQUENCY
279.00 0.00 2319.50 NORTH / EAST / UP
NOAZI -0.80 -0.90 -0.90 -0.80 -0.40 0.20 0.80 1.30 1.40 1.20 0.70 0.00 -0.40 -0.70 -0.90 -0.90 -0.90 -0.90
G01 END OF FREQUENCY
G02 START OF FREQUENCY
279.00 0.00 2319.50 NORTH / EAST / UP
NOAZI -0.80 -0.90 -0.90 -0.80 -0.40 0.20 0.80 1.30 1.40 1.20 0.70 0.00 -0.40 -0.70 -0.90 -0.90 -0.90 -0.90
G02 END OF FREQUENCY
END OF ANTENNA
从START OF ANTENNA开始,END OF ANTENNA结束。
结构体储存
typedef struct { /* antenna parameters type */
int n,nmax; /* number of data/allocated */
pcv_t *pcv; /* antenna parameters data */
} pcvs_t;
typedef struct { /* antenna parameter type */
int sat; /* satellite number (0:receiver) */
char type[MAXANT]; /* antenna type */
char code[MAXANT]; /* serial number or satellite code */
gtime_t ts,te; /* valid time start and end */
double off[NFREQ][ 3]; /* phase center offset e/n/u or x/y/z (m) */
double var[NFREQ][19]; /* phase center variation (m) */
/* el=90,85,...,0 or nadir=0,1,2,3,... (deg) */
} pcv_t;读取数据部分主要是:
NORTH / EAST / UP储存在pcv.off。接收天线:平均天线相位中心相对于天线参考点(ARP)的偏心距。北、东、上分量(以毫米计)。卫星天线:在X、Y和z方向上,平均天线相位中心相对于卫星质心的偏心距(以毫米为单位)。
NOAZI储存在pcv.var。与方位角无关的模式的值。标志'NOAZI'表示一个非方位相关的模式,在任何情况下都必须指定。相位模式值以毫米为单位从'ZEN1'到'ZEN2'(增量为'DZEN')。
主要读取代码
while (fgets(buff,sizeof(buff),fp)) {
if (strlen(buff)<60||strstr(buff+60,"COMMENT")) continue;
if (strstr(buff+60,"START OF ANTENNA")) {
pcv=pcv0;
state=1;
}
if (strstr(buff+60,"END OF ANTENNA")) {
addpcv(&pcv,pcvs);
state=0;
}
if (!state) continue;
if (strstr(buff+60,"TYPE / SERIAL NO")) {
strncpy(pcv.type,buff ,20); pcv.type[20]='\0';
strncpy(pcv.code,buff+20,20); pcv.code[20]='\0';
if (!strncmp(pcv.code+3," ",8)) {
pcv.sat=satid2no(pcv.code);
}
}
else if (strstr(buff+60,"VALID FROM")) {
if (!str2time(buff,0,43,&pcv.ts)) continue;
}
else if (strstr(buff+60,"VALID UNTIL")) {
if (!str2time(buff,0,43,&pcv.te)) continue;
}
else if (strstr(buff+60,"START OF FREQUENCY")) {
if (!pcv.sat&&buff[3]!='G') continue; /* only read rec ant for GPS */
if (sscanf(buff+4,"%d",&f)<1) continue;
for (i=0;freqs[i];i++) if (freqs[i]==f) break;
if (freqs[i]) freq=i+1;
/* for Galileo E5b: save to E2, not E7 */
if (satsys(pcv.sat,NULL)==SYS_GAL&&f==7) freq=2;
}
else if (strstr(buff+60,"END OF FREQUENCY")) {
freq=0;
}
else if (strstr(buff+60,"NORTH / EAST / UP")) {
if (freq<1||NFREQ<freq) continue;
if (decodef(buff,3,neu)<3) continue;
pcv.off[freq-1][0]=neu[pcv.sat?0:1]; /* x or e */
pcv.off[freq-1][1]=neu[pcv.sat?1:0]; /* y or n */
pcv.off[freq-1][2]=neu[2]; /* z or u */
}
else if (strstr(buff,"NOAZI")) {
if (freq<1||NFREQ<freq) continue;
if ((i=decodef(buff+8,19,pcv.var[freq-1]))<=0) continue; //解码天线参数字段
for (;i<19;i++) pcv.var[freq-1][i]=pcv.var[freq-1][i-1];
}
}
需要注意:(1)该代码只对GPS单系统天线文件读取,并未对其它系统读取。
(2)数据储存的部分只是储存了与相位角无关的值。
(3)接收机天线文件应用的同样的读取方法。
(4)freqs[]={1,2,5,0}。
(5)一个卫星读取完成后,通过判断END OF ANTENNA写入pcv结构体内,pcvs->n++。(pcvs->pcv[pcvs->n++]=*pcv;)