⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rinex.c

📁 针对GPS系统的全面的源程序 希望能够对学习GPS技术的朋友有所帮助
💻 C
📖 第 1 页 / 共 3 页
字号:
{  double var,dydt;
   dydt = (y2-y1)/(t2-t1);
   var = y1 + (t-t1)*dydt;   
   return(var);}
void id_i12j12(id,i1,i2,j1,j2)
/* 改变观测值的 id 放入 sta_i1, sta_i2, sat_j1, sat_j2 */
long *id;
int *i1,*i2,*j1,*j2;
{   if(*id>=1000000) 		/* 双差 id */
    { *i1 = (int)(*id/1000000);
      *i2 = (int)((*id-*i1*1000000)/10000);
      *j1 = (int)((*id-*i1*1000000-*i2*10000)/100);
      *j2 = (int)(*id-*i1*1000000-*i2*10000-*j1*100); }
   if(10000<*id && *id<1000000) /* 单差 id */
    { *i1 = (int)(*id/10000);
      *i2 = (int)((*id-*i1*10000)/100);
      *j1 = (int)(*id-*i1*10000-*i2*100);
      *j2 = 0; }
   if(*id<10000) 			/* 原始差 id */
    { *i1 = (int)(*id/100);
      *j1 = (int)(*id-*i1*100);
      *i2 = 0;
      *j2 = 0; }}
void getdat_o(fp,ista,xhidat,odat_t,odat_dt,odat_n,In0,rt,dt,odat,id_odat,iodat)
/* 此函数得到所有测站在Iepoches的 GPS RINEX 数据 。若 In0==0,由 epoch rt 开始读数据,直到下一个 Iepoches。否则将数据从( In0--Iepoches)移到( 0--Iepoches-In0),继续读数据 */
long ista;
FILE *fp[Ista];
long xhidat[Ista*Isat*2];
long odat_n[Iepoches],*In0;
double odat[Isato*I10*Ista*Iepoches],odat_t[Iepoches],rt,dt;
double odat_dt[Ista*Iepoches];
long id_odat[I10*Ista*Iepoches];
unsigned int iodat[Isato*I10*Ista*Iepoches];
{   long i,i1,i2,j,j1,j2,j3,k,k1,k2,ob_num;
    long xdidat1[Isat*Ista],io[Ista];
    double xddat1[I10*Isato*Ista],rit,sec;
    int hour,minute;
    unsigned int ixddat1[I10*Isato*Ista];
    ob_num = (int)xhidat[0];
/* 移动数据 */
    i2=Iepoches; 
    if(*In0==0) {i1=0; rit = rt-dt;}
else 
{ for(j2=0,k=*In0-1;k<i2;k++) 
  { k1 = k - (*In0-1);
        for(i=0;i<ista;i++) 
         { odat_dt[i+Ista*k1] = odat_dt[i+Ista*k];} 
        odat_n[k1] = odat_n[k];
        odat_t[k1] = odat_t[k];
        j2+=odat_n[k];
        for (j1=0;j1<odat_n[k];j1++) 
         {   id_odat[j1+I10*Ista*k1] = id_odat[j1+I10*Ista*k];
             for(j=0;j<ob_num;j++)
             odat[j+j1*Isato+Isato*I10*Ista*k1]= odat[j+j1*Isato+Isato*I10*Ista*k];
             for(j=0;j<ob_num;j++) 
             iodat[j+j1*Isato+Isato*I10*Ista*k1]=iodat[j+j1*Isato+Isato*I10*Ista*k];}}
       rit = odat_t[Iepoches-1];
       i1 = Iepoches - *In0 + 1; *In0 = 1; } 
/* 读取新值 */
    if(dt<=0.49) dt = xhidat[14]+xhidat[15]/10.;
for(k=i1;k<i2;k++) 
 { rit += dt; 
       getdat(fp,ista,&rit,xhidat,xdidat1,io,xddat1,ixddat1); 
       odat_t[k] = rit; odat_n[k] = 0;
       for(j2=0,i=0;i<ista;i++) 
        { odat_dt[i+k*Ista] = -rit + xdidat1[3+Isat*i]*3600. + xdidat1[4+Isat*i]*60. 
             + xdidat1[5+Isat*i] + xdidat1[6+Isat*i]/10000000.;
          if(io[i]==2) xdidat1[9+Isat*i]=0;
          odat_n[k] += xdidat1[9+Isat*i];
          for (j1=0;j1<xdidat1[9+Isat*i];j1++) 
           { id_odat[j2+I10*Ista*k] = (i+1)*100+xdidat1[9+Isat*i+1+j1];
             for(j=0;j<ob_num;j++) 
              {odat[j2*Isato+j+k*Ista*Isato*I10] = xddat1[j+j1*ob_num+Isato*I10*i];
               iodat[j2*Isato+j+k*Ista*Isato*I10] = ixddat1[j+j1*ob_num+Isato*I10*i]; }
             j2 += 1;}}} 				/* 为检查输出原始数据 */
}
void t_hms(t,hour,minute,sec)
/* 换算时间 t 为时、分、秒 */
double t,*sec;
int *hour,*minute;
{  *hour = (int)(t/3600);
   *minute = (int)((t-*hour*3600)/60);
   *sec = t - *hour*3600 - *minute*60;}
void getdat(fp,ista,rt,xhidat,xdidat1,io,xddat1,ixddat1) 
long ista;
FILE *fp[Ista];
long xhidat[Ista*Isat*2];
long xdidat1[Isat*Ista],io[Ista];
double xddat1[I10*Isato*Ista];
unsigned int ixddat1[I10*Isato*Ista];  
double *rt;
/* 函数 getdat 应用函数 r_rinexd 得到所有测站在时间 rt的gps数据,若某测站无数据,则取下一个历元的数据,并返回到时间rt */
{    int i,i1,i2,j,j1,j2,k;
     long xdidat[Isat],i3[Ista],ob_num;
     double xddat[I10*Isato],f3[Ista],f1,f2,f,rit;
     unsigned int ixddat[I10*Isato];
/* 设置初始值 */
     rit = *rt; for(i=0;i<ista;i++) i3[i] = ista;
     repeat:;
/* 读每一测站数据并放在一块 */
     for (i=0;i<ista;i++) 
      { if(i!=i3[i]) 
         { r_rinexd(fp[i],xhidat,rit,xdidat,xddat,ixddat,&i2);
           io[i] = i2;
           if(xdidat[7]==0) {io[i]=2;  }
           ob_num = (int)xhidat[0]; k=ob_num;
           for(j=0;j<10+xdidat[9];j++) xdidat1[j+Isat*i]=xdidat[j];
           for (j1=0;j1<xdidat1[9+Isat*i];j1++) 
            { for(j=0;j<ob_num;j++) xddat1[j+j1*k+Isato*I10*i]=xddat[j+j1*k];
              for(j=0;j<ob_num;j++)ixddat1[j+j1*k+Isato*I10*i]=ixddat[j+j1*k]; }}
     else io[i]=1; }
     /* printf("xx %f %d %d\n",rit,io[0],io[1]);*/
/* 如果某数据有缺,读下一个历元数据 */
     for(i1=0,i=0;i<ista;i++) 
      { if(io[i]==0) 
         { i1+=1; 
           f = xdidat1[3+Isat*i]*3600.+xdidat1[4+Isat*i]*60+xdidat1[5+Isat*i];
           f1 = xdidat1[6+Isat*i]/10000000.;
           if(0.4<f1 && f1<0.6) f += 0.5;
           if(0.9<f1 && f1<1.1) f += 1.;
           f3[i] = f;}
      else f3[i] = rit; }
     if(i1>=1) 
     {  f = f3[0]; 
        for(i=1;i<ista;i++) if(f<f3[i]) f=f3[i];
        for(i=0;i<ista;i++) if(fabs(f-f3[i])<0.1) i3[i] = i; 
        /* printf("%f %d \n",f,i1); */
        *rt = f; rit = f; goto repeat; }
/* 检查双频相位观测值,如果丢失,则删除该观测值 */
     if(Frequency_n==2) 
     { once1:;
       for (i=0;i<ista;i++) 
       {for (j1=0;j1<xdidat1[9+Isat*i];j1++) 
         {if(ixddat1[L1+j1*k+Isato*I10*i]==0||ixddat1[L2+j1*k+Isato*I10*i]==0)
           {for (j2=j1;j2<xdidat1[9+Isat*i]-1;j2++) 
            {for(j=0;j<ob_num;j++) 
             {   xddat1[j+j2*k+Isato*I10*i]=xddat1[j+(j2+1)*k+Isato*I10*i];
                 ixddat1[j+j2*k+Isato*I10*i]=ixddat1[j+(j2+1)*k+Isato*I10*i];}
              xdidat1[j2+10+Isat*i]=xdidat1[j2+10+1+Isat*i];}
           xdidat1[9+Isat*i]-=1;
           goto once1; }}}}
/* 为检查输出数据 */
}
void r_rinexd(fp,xhidat,rit,xdidat,xddat,ixddat,Id) 
/*   函数 r_rinexd 读取rinex 文件的数据部分 */  
FILE *fp;
long *Id;
long xdidat[Isat],xhidat[Ista*Isat*2];
double xddat[I10*Isato];
unsigned int ixddat[I10*Isato];
double rit;
{    int i,j,j1,j2,k,k1=0,c,c1,c2,c3,c4,ob_num;
     double f,f1;
     char str[Iline],str1[17],str2[4];
     *Id = 0;            ob_num = (int)xhidat[0];
     for(i=0;i<I10*Isato;i++) ixddat[i]=0;	 /* 读数据部分 */
     loop:; k1+=1; 					/* 第一行 */
     xdidat[7]=1;
     fgets(str,16,fp);
     if(str[2]!=' ' && str[3]==' ') 
      { sscanf(str,"%d %d %d %d %d", &c,&c1,&c2,&c3,&c4);
        xdidat[0]=(long)c; xdidat[1]=(long)c1;
        xdidat[2]=(long)c2; xdidat[3]=(long)c3;
        xdidat[4]=(long)c4;}
     else 
     { xdidat[7] = 0; goto finished; }
     fgets(str1,12,fp); f = atof(str1);
     xdidat[5] = (long)f;
     xdidat[6] = (long)((f-xdidat[5])*10000000);
     if (xdidat[6]>=9000000) /* 使 xdidat[6] 变小 */
      { xdidat[6] -= 10000000;
        xdidat[5] += 1; }
     if (xdidat[5]>=60) 	/* 避免 xdidat[5] >= 60 */
      { xdidat[5] -= 60;
        xdidat[4] += 1; }
     if (xdidat[4]>=60) 	/* 避免 xdidat[4] >= 60 */
      { xdidat[4] -= 60;
        xdidat[3] += 1; }
     for (i=8;i<10;i++) 
      { fgets(str2,4,fp);xdidat[i]=atoi(str2);}
     for (i=10;i<10+xdidat[9];i++) 
      { fgets(str2,4,fp);xdidat[i]=atoi(str2); }
     c = getline(fp,str); 
/* 时间检查 */
     f = xdidat[3]*3600.+xdidat[4]*60.+xdidat[5]+xdidat[6]/10000000.;
     f1 = rit;
     if (f-0.02 < f1 && f1 < f+0.02) 
      { *Id = 1; }
else 
  { if (f1 >= f+0.2) 
    {  ob_num = (int)xhidat[0];
           for (i=0;i<xdidat[9];i++) 
           c = getline(fp,str);	 /* 观测值第一行 */
           if(ob_num>=6) 
           for (i=0;i<xdidat[9];i++) 
           c = getline(fp,str); 	/* 观测值第二行 */
           goto loop; }}
     ob_num = (int)xhidat[0]; 	/* 每一卫星 */
     k = ob_num;
     for (i=0;i<xdidat[9];i++) 
      { c = getline(fp,str); 	/* 观测值第一行 */
        j2=ob_num; if(j2>=6) j2=5;
        for (j=0;j<j2;j++) 
         { if(str[10+j*16]==' ') xddat[j+i*k] = 0.;
           else 
            { for (j1=0;j1<14;j1++) str1[j1]=str[j1+j*16];
              xddat[j+i*k] = atof(str1);
              ixddat[j+i*k]=1;} }
           if(ob_num>=6) 
            { c = getline(fp,str); /* 观测值第二行 */
           for (j=5;j<ob_num;j++) 
            { if(str[10+(j-5)*16]==' ') xddat[j+i*k] = 0.;
              else 
               { for (j1=0;j1<14;j1++) str1[j1]=str[j1+(j-5)*16];
                 xddat[j+i*k] = atof(str1);
                 ixddat[j+i*k]=1;}}}}
     finished:;
}
void r_rinexh(fp,ifp,xhidat) 
/* 函数r_rinexh 读取rinex 文件的字头部分 */  
FILE *fp[Ista];
long ifp,xhidat[2*Isat*Ista];
{
     int i,i1,j,k,k1,c,c1,c2,c3,c4,c5;
     double f,f1,f2,d,dtstep;
     char str[Iline];
     for(i1=0;i1<ifp;i1++) 
      { for (i=0;i<2*Isat;i++) xhidat[i+i1*2*Isat] = 0;
        nextline:;    /* 读字头部分 */
        k1 = getline(fp[i1],str); 
        if(O_rinexh==0)
        fprintf(stdout,"%s",str); 
        if(strstr(str,"VERSION")) 
         { sscanf(str,"%d",&c); xhidat[11+i1*2*Isat]=(long)c; 
           goto nextline; }
        if(strstr(str,"APPROX")) 
         { sscanf(str,"%lf %lf %lf",&f,&f1,&f2);
           xhidat[23+i1*2*Isat]=(long)f;
           xhidat[24+i1*2*Isat]=(long)((f-xhidat[23+i1*2*Isat])*1000+0.5);
           xhidat[25+i1*2*Isat]=(long)f1;
           xhidat[26+i1*2*Isat]=(long)((f1-xhidat[25+i1*2*Isat])*1000+0.5);
           xhidat[27+i1*2*Isat]=(long)f2;
           xhidat[28+i1*2*Isat]=(long)((f2-xhidat[27+i1*2*Isat])*1000+0.5);
           goto nextline;}
        if(strstr(str,"ANTENNA")) 
         { sscanf(str,"%lf %lf %lf",&f,&f1,&f2);
           xhidat[29+i1*2*Isat]=(long)f;
           xhidat[30+i1*2*Isat]=(long)((f-xhidat[29+i1*2*Isat])*1000)+0.5;
           xhidat[31+i1*2*Isat]=(long)f1;
           xhidat[32+i1*2*Isat]=(long)((f1-xhidat[31+i1*2*Isat])*1000+0.5);
           xhidat[33+i1*2*Isat]=(long)f2;
           xhidat[34+i1*2*Isat]=(long)((f2-xhidat[33+i1*2*Isat])*1000+0.5);
           goto nextline;}
        if(strstr(str,"WAVELENGTH")) 
         { sscanf(str,"%d %d",&c,&c1);
           xhidat[12+i1*2*Isat]=(long)c; xhidat[13+i1*2*Isat]=(long)c1;
           goto nextline; }
        if(strstr(str,"TYPES")) 
         { sscanf(str,"%d",&c);xhidat[0+i1*2*Isat]=(long)c; 
           for (i=1;i<=xhidat[0+i1*2*Isat];i++) 
            { c = str[4+i*6]; k = str[5+i*6];
              switch(c) 
               { case 'L': {xhidat[i+i1*2*Isat] = 1;break;}
                 case 'C': {xhidat[i+i1*2*Isat] = 3;break;}
                 case 'P': {xhidat[i+i1*2*Isat] = 5;break;}
                 case 'D': {xhidat[i+i1*2*Isat] = 7;break;}
                 case 'T': {xhidat[i+i1*2*Isat] = 9;break;} }
              if (k=='2') xhidat[i+i1*2*Isat] += 1; }
           goto nextline; }
           if(strstr(str,"INTERVAL")) 
              { for(k=0,i=0;i<16;i++) if(str[i]=='.') k=1; 
                if(k==0) {sscanf(str,"%d",&c); xhidat[14+i1*2*Isat]=(long)c;}
                if(k==1) {sscanf(str,"%lf",&d); xhidat[14+i1*2*Isat]=(long)d; 
                  xhidat[15+i1*2*Isat]=(long)((d-xhidat[14+i1*2*Isat])*10.);}
           goto nextline; }
           if(strstr(str,"FIRST")) 
             { sscanf(str,"%d %d %d %d %d %lf",&c,&c1,&c2,&c3,&c4,&f);
               xhidat[16+i1*2*Isat]=(long)c; xhidat[17+i1*2*Isat]=(long)c1; 
               xhidat[18+i1*2*Isat]=(long)c2; xhidat[19+i1*2*Isat]=(long)c3; 
               xhidat[20+i1*2*Isat]=(long)c4; xhidat[21+i1*2*Isat]=(long)f;
               xhidat[22+i1*2*Isat]=(long)((f-xhidat[21+i1*2*Isat])*1000000);
               goto nextline; }
          if(strstr(str,"HEADER")) goto dataend;
          if(k1>10) goto nextline;;
          dataend:; 			/* 输出 xhidat[] */
     }
/* 检查是否数据有相同的结构 */
     for (i=0,i1=1;i1<ifp;i1++) 
     if(xhidat[0]!=xhidat[0+i1*2*Isat]) i+=1 ;  
     if(i==0) 
      { for(j=0,k=1;k<=xhidat[0];k++) 
         { for(i1=1;i1<ifp;i1++) if(xhidat[k]!=xhidat[k+i1*2*Isat]) j+=1 ;}
        if(j==0) printf("All rinex data files have the same structure\n");
        else printf("Rinex data files have not the same structure\n"); }
     else printf("Rinex data files have different obs_number\n");}
int getline(fp,s)
/* 从文件fp得到行写入s,返回s的长度。s最大长度为 Mline,现定义为100*/
FILE *fp;
char s[Iline];
{    int c,i=0;
     while ((c=fgetc(fp)) != EOF) 
      { s[i] = c; i += 1;
        if (c=='\n') { s[i]='\0'; return(i); } }
     return(c);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -