rtklib-RINEX文件读取-rinex.c解析(一)


前言

       本文是按照rinex.c里面函数的顺序进行阐述的,宏定义和结构体到具体函数时一起解释,因为涉及到专业知识,有函数和实例解释起来会更容易理解。所有函数解释说明部分已经放在注释里面,可以和代码一起阅读,无奈注释看不太清,也在代码块下面加上了注释的放大版。

setstr-函数

/* set string without tail space ---------------------------------------------*/
static void setstr(char *dst, const char *src, int n)
{
    char *p=dst;
    const char *q=src;
    while (*q&&q<src+n) *p++=*q++;
    *p--='\0';
    while (p>=dst&&*p==' ') *p--='\0';
}//截取src中长度为n的一个子串复制给dst,且子串中空格与dst最后一格均补上'\0'

截取src中长度为n的一个子串复制给dst,且子串中空格与dst最后一格均补上’\0’

adjweek-函数

/* adjust time considering week handover -------------------------------------*/
static gtime_t adjweek(gtime_t t, gtime_t t0)
{
    double tt=timediff(t,t0);
    if (tt<-302400.0) return timeadd(t, 604800.0);
    if (tt> 302400.0) return timeadd(t,-604800.0);
    return t;
}//调整t与t0的时间在同一周,gtime_t包含c库函数time_t记录的是1970年1月1日00:00:00分(UTC)到某个时间的
//整数秒,另一个为sec记录的是1秒以下的小数部分,timediff为算出t与t0之间的差值,结果为带小数的秒。

调整t与t0的时间在同一周,gtime_t包含c库函数time_t记录的是1970年1月1日00:00:00分(UTC)到某个时间的整数秒,另一个为sec记录的是1秒以下的小数部分,timediff为算出t与t0之间的差值,结果为带小数的秒。

adjday-函数

/* adjust time considering week handover -------------------------------------*/
static gtime_t adjday(gtime_t t, gtime_t t0)
{
    double tt=timediff(t,t0);
    if (tt<-43200.0) return timeadd(t, 86400.0);
    if (tt> 43200.0) return timeadd(t,-86400.0);
    return t;
}//调整t与t0在同一天基本原理和上述的adjweek函数一样,两个函数会在下面使用,为什么会这样于之后解释。

调整t与t0在同一天基本原理和上述的adjweek函数一样,两个函数会在下面使用,为什么会这样于之后解释。

timestr_rnx-函数

/* time string for ver.3 (yyyymmdd hhmmss UTC) -------------------------------*/
static void timestr_rnx(char *str)
{
    gtime_t time;
    double ep[6];
    time=timeget();
    time.sec=0.0;
    time2epoch(time,ep);
    sprintf(str,"%04.0f%02.0f%02.0f %02.0f%02.0f%02.0f UTC",ep[0],ep[1],ep[2],
            ep[3],ep[4],ep[5]);
}//timeget()获取现在的UTC时间,time2epoch将UTC时间转换成calendar时间,存入str字符串中格式为:yyyymmdd hhmmss

timeget()获取现在的UTC时间,time2epoch将UTC时间转换成calendar时间,存入str字符串中格式为:yyyymmdd hhmmss

sat2code-函数

/* satellite to satellite code -----------------------------------------------*/
static int sat2code(int sat, char *code)
{//主要是将支持的GPS、GLONASS、Galileo、Beidou、QZSS等卫星种类和prn号结合起来,转化成特定的字符串供后序使用

    int prn;
    switch (satsys(sat,&prn)) {
        case SYS_GPS: sprintf(code,"G%2d",prn-MINPRNGPS+1); break;
        case SYS_GLO: sprintf(code,"R%2d",prn-MINPRNGLO+1); break;
        case SYS_GAL: sprintf(code,"E%2d",prn-MINPRNGAL+1); break;
        case SYS_SBS: sprintf(code,"S%2d",prn-100); break;
        case SYS_QZS: sprintf(code,"J%2d",prn-MINPRNQZS+1); break;
        case SYS_CMP: sprintf(code,"C%2d",prn-MINPRNCMP+1); break;
        case SYS_IRN: sprintf(code,"I%2d",prn-MINPRNIRN+1); break;
        default: return 0;
    }
    return 1;
}//从satsys函数返回值中得到了卫星类型和prn信息,然后就会把卫星所属星座类型以及PRN号存储在code字符串里,待后序函数使用

主要是将支持的GPS、GLONASS、Galileo、Beidou、QZSS等卫星种类和prn号结合起来,转化成特定的字符串供后序使用,从satsys函数返回值中得到了卫星类型和prn信息,然后就会把卫星所属星座类型以及PRN号存储在code字符串里,待后序函数使用。

satsys-函数

/* satellite number to satellite system ----------------------------------------
* convert satellite number to satellite system
* args   : int    sat       I   satellite number (1-MAXSAT)
*          int    *prn      IO  satellite prn/slot number (NULL: no output)
* return : satellite system (SYS_GPS,SYS_GLO,...)
*-----------------------------------------------------------------------------*/
extern int satsys(int sat, int *prn)
{
    int sys=SYS_NONE;
    if (sat<=0||MAXSAT<sat) sat=0;
    else if (sat<=NSATGPS) {
        sys=SYS_GPS; sat+=MINPRNGPS-1;
    }
    else if ((sat-=NSATGPS)<=NSATGLO) {
        sys=SYS_GLO; sat+=MINPRNGLO-1;
    }
    else if ((sat-=NSATGLO)<=NSATGAL) {
        sys=SYS_GAL; sat+=MINPRNGAL-1;
    }
    else if ((sat-=NSATGAL)<=NSATQZS) {
        sys=SYS_QZS; sat+=MINPRNQZS-1; 
    }
    else if ((sat-=NSATQZS)<=NSATCMP) {
        sys=SYS_CMP; sat+=MINPRNCMP-1; 
    }
    else if ((sat-=NSATCMP)<=NSATIRN) {
        sys=SYS_IRN; sat+=MINPRNIRN-1; 
    }
    else if ((sat-=NSATIRN)<=NSATLEO) {
        sys=SYS_LEO; sat+=MINPRNLEO-1; 
    }
    else if ((sat-=NSATLEO)<=NSATSBS) {
        sys=SYS_SBS; sat+=MINPRNSBS-1; 
    }
    else sat=0;
    if (prn) *prn=sat;
    return sys;
}//最主要的函数就是这个satsys(),这个函数位于rtkcmn.c中,sat,prn为输入的参数,返回的结果是该卫星所在的星座
//以及相应在这个星座中第几颗卫星,可能读者会有所疑惑,这是怎么判断的?例如GPS星座有32颗卫星且sat的数值在
//1<=sat<=32,sys=SYS_GPS,GLONASS星座有27颗,当33<=sat<=59,减去GPS的32颗卫星,数值正好在1-27以内,认定sys=SYS_GLO
//(所以rtklib导航星座的排序是有用的,不能乱的,否则在if-else if判断中导致sys系统判断出错)

最主要的函数就是这个satsys(),这个函数位于rtkcmn.c中,sat,prn为输入的参数,返回的结果是该卫星所在的星座以及相应在这个星座中第几颗卫星,可能读者会有所疑惑,这是怎么判断的?例如GPS星座有32颗卫星且sat的数值在1<=sat<=32,sys=SYS_GPS,GLONASS星座有27颗,当33<=sat<=59,减去GPS的32颗卫星,数值正好在1-27以内,认定sys=SYS_GLO.
(所以rtklib导航星座的排序是有用的,不能乱的,否则在if-else if判断中导致sys系统判断出错)

init_sta-函数

/* initialize station parameter ----------------------------------------------*/
static void init_sta(sta_t *sta)
{
    int i;
    *sta->name   ='\0';
    *sta->marker ='\0';
    *sta->antdes ='\0';
    *sta->antsno ='\0';
    *sta->rectype='\0';
    *sta->recver ='\0';
    *sta->recsno ='\0';
    sta->antsetup=sta->itrf=sta->deltype=0;
    for (i=0;i<3;i++) sta->pos[i]=0.0;
    for (i=0;i<3;i++) sta->del[i]=0.0;
    sta->hgt=0.0;
}//初始化测站信息,将结构体sta_t中包含的数据类型都设置为0,或者空字符。

初始化测站信息,将结构体sta_t中包含的数据类型都设置为0,或者空字符。

结构体-sta_t

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) */
} sta_t;

参考

学习rtklib(一)

结论

上述都是比较基础的函数。为能够成功读取RINEX文件准备的辅助函数,理解起来相对比较容易,接下来的函数就真的进入读取RINEX中,因为软件的兼容性,rtklib可以读取RINEX2/3版本的文件,至于如何学习这些文件格式类型以及在哪里学习,大家可以先看看我之前写的RINEX文件读取的绪论,里面提供了其他博主介绍相关文件的说明,并且在资源区可以免费下载英文版本的RINEX2/3版本的说明书。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值