📄 getrnxo.cpp
字号:
#include "GetRnxO.h"
void* GetGMO (char *FileName)
{
int i,j;
char markname[][21] = //标签名称
{
"RINEX VERSION / TYPE",
"PGM / RUN BY / DATE",
"MARKER NAME",
"MARKER NUMBER",
"OBSERVER / AGENCY",
"REC # / TYPE / VERS",
"ANT # / TYPE",
"APPROX POSITION XYZ",
"ANTENNA: DELTA H/E/N",
"WAVELENGTH FACT L1/2",
"# / TYPES OF OBSERV",
"INTERVAL",
"TIME OF FIRST OBS",
"TIME OF LAST OBS",
"RCV CLOCK OFFS APPL",
"LEAP SECONDS",
"# OF SATELLITES",
"PRN / # OF OBS",
"END OF HEADER",
};
char mark_number[_MAX_RNXO_MARK_NUMBER]; //数据字符串
char mark_name[_MAX_RNXO_MARK_NAME]; //文件头标签
// long fpos,fpos0; //文件位置指针
PGMO gmo;
FILE *datafile;
long fpos, fpos0;
int nr1 = 100; //历元已分配空间的 历元 数
gmo = (PGMO) malloc ( sizeof (GMO));
if (gmo == NULL) {
printf ("内存分配错误!");
return NULL;
}
memset (gmo, 0, sizeof (GMO)); //结构中的所有都置 0
datafile = fopen (FileName, "r");
if (datafile == NULL) {
printf ("观测数据文件不存在,请检查文件是否存在!");
free (gmo);
return NULL;
}
for ( ; ; ) {
int tmp1=0; //数据类型标签序号
fgets (mark_number, _MAX_RNXO_MARK_NUMBER, datafile); //读入数据字符串
if (strlen(mark_number) < 60) {
continue;
}
fgets (mark_name, _MAX_RNXO_MARK_NAME, datafile); //读入标签字符串
for (i=0; i<19; i++) {
tmp1 = strncmp(mark_name, markname[i], strlen(markname[i])); //逐个比较标签
if (tmp1!=0) {
continue;
}
tmp1 = i;
switch (tmp1) {
case 0: //RINEX VERSION / TYPE
sscanf (mark_number, "%d.%d", &gmo->hdr.ver_major,
&gmo->hdr.ver_minor);
break;
case 1: //PGM / RUN BY / DATE
// strncpy (gmo->hdr.Pgm, mark_number, 20);
// strncpy (gmo->hdr.RunBy, mark_number+20, 20);
// strncpy (gmo->hdr.Date, mark_number+40, 20);
break;
case 2: //MARKER NAME
strncpy (gmo->hdr.marker_name, mark_number,
_MAX_RNX_MARKER_NAME - 1);
break;
case 3: //MARKER NUMBER
strncpy (gmo->hdr.marker_number, mark_number,
_MAX_RNX_MARKER_NUMBER - 1);
break;
case 4: //OBSERVER / AGENCY
break;
case 5: //REC # / TYPE / VERS
strncpy (gmo->hdr.rcvr_sn, mark_number, _MAX_RNX_RCVR_SN-1);
strncpy (gmo->hdr.rcvr_type, mark_number+_MAX_RNX_RCVR_SN-1,
_MAX_RNX_RCVR_TYPE - 1);
strncpy (gmo->hdr.rcvr_ver, mark_number + _MAX_RNX_RCVR_SN
+ _MAX_RNX_RCVR_TYPE - 2, _MAX_RNX_RCVR_VER - 1);
break;
case 6: //ANT # / TYPE
strncpy (gmo->hdr.ant_sn, mark_number, _MAX_RNX_ANT_SN - 1);
strncpy (gmo->hdr.ant_type, mark_number + _MAX_RNX_ANT_SN-1,
_MAX_RNX_ANT_TYPE - 1);
i=i;
break;
case 7: //APPROX POSITION XYZ
gmo->hdr.approx_pos.z = csatof(mark_number + 28, 14);
gmo->hdr.approx_pos.y = csatof(mark_number + 14, 14);
gmo->hdr.approx_pos.x = csatof(mark_number, 14);
break;
case 8: //ANTENNA: DELTA H/E/N
gmo->hdr.ant_delta.northing = csatof(mark_number + 28, 14);
gmo->hdr.ant_delta.easting = csatof(mark_number + 14, 14);
gmo->hdr.ant_delta.upping = csatof(mark_number, 14);
break;
case 9: //WAVELENGTH FACT L1/2
gmo->hdr.wavelen_fact[1] = csatol(mark_number + 6, 6);
gmo->hdr.wavelen_fact[0] = csatol(mark_number, 6);
break;
case 10: //# / TYPES OF OBSERV
sscanf(mark_number, "%6ld", &gmo->hdr.obs_type_number);
for (j=0; j<gmo->hdr.obs_type_number; j++) {
strncpy(gmo->hdr.obs_type[j], mark_number+10+j*6, 2);
}
break;
case 11: //INTERVAL
gmo->hdr.interval = csatof(mark_number, 10);
break;
case 12: //TIME OF FIRST OBS
gmo->hdr.start_time.second = csatof(mark_number + 30, 13);
gmo->hdr.start_time.minute = (unsigned char) csatol(mark_number + 24, 6);
gmo->hdr.start_time.hour = (unsigned char) csatol(mark_number + 18, 6);
gmo->hdr.start_time.day = (unsigned char) csatol(mark_number + 12, 6);
gmo->hdr.start_time.month = (unsigned char) csatol(mark_number + 6, 6);
gmo->hdr.start_time.year = (unsigned short) csatol(mark_number, 6);
break;
case 13: //TIME OF LAST OBS
gmo->hdr.end_time.second = csatof(mark_number + 30, 13);
gmo->hdr.end_time.minute = (unsigned char) csatol(mark_number + 24, 6);
gmo->hdr.end_time.hour = (unsigned char) csatol(mark_number + 18, 6);
gmo->hdr.end_time.day = (unsigned char) csatol(mark_number + 12, 6);
gmo->hdr.end_time.month = (unsigned char) csatol(mark_number + 6, 6);
gmo->hdr.end_time.year = (unsigned short) csatol(mark_number, 6);
break;
case 14: //RCV CLOCK OFFS APPL
gmo->hdr.rcvr_clock_offs_appl = csatol(mark_number, 6);
break;
case 15: //LEAP SECONDS
gmo->hdr.leap_seconds = csatol(mark_number, 6);
break;
case 16: //# OF SATELLITES
;
break;
case 17: //PRN / # OF OBS
;
break;
default :
break;
}
break;
}
//如果读到文件头结束标签则计算观测值种类并结束文件头读取
if (tmp1 == 18) {
for (i=0 ; i<gmo->hdr.obs_type_number; i++) {
for (j=0; j<_MAX_CNT_OBS_TYPE; j++) {
if (strncmp (gmo->hdr.obs_type[i], gop[j].obs_id,
_MAX_ROID - 1) == 0)
{
gmo->hdr.gop[i] = j;
if (j == 0 || j == 2) {
if (gmo->hdr.wavelen_fact[gop[j].wl_pos-1] == 2) {
gmo->hdr.gop[i]++;
}
}
break;
}
}
}
break;
}
}
gmo->record = (PGMOREC) malloc (nr1 * sizeof (GMOREC));
memset(gmo->record, 0, nr1 * sizeof (GMOREC));
for ( ; ; ) {
fpos0 = ftell (datafile); //取得读取前的文件指针位置
fpos = GetGMORecord (datafile, &gmo->record[gmo->hdr.epoch_number],
gmo->hdr.obs_type_number, fpos0);
if (fpos == -2) {
break;
}
if (fpos == -1) {
fseek (datafile, fpos0, SEEK_SET);
}
if (fpos > 0) {
gmo->hdr.epoch_number++;
if (gmo->hdr.epoch_number == nr1) {
PGMOREC rec;
nr1 += 100;
rec = (PGMOREC) malloc (nr1 * sizeof (GMOREC));
memset(rec, 0, nr1 * sizeof (GMOREC));
memcpy (rec,gmo->record, (nr1-100) * sizeof (GMOREC));
free (gmo->record);
gmo->record = rec;
}
fpos0 = fpos;
}
}
return gmo;
}
//读取单一历元的数据
long GetGMORecord (FILE *datafile, //包含观测数据的文件指针
PGMOREC rec, //记录结构指针
long obs_type_number, //观测类型数
long fpos) //文件位置
{
char str[_MAX_RNXO_DATA] = {0}; //单行数据
long counter = 0; //已读取观测数据个数
long sum = 0; //总观测数据个数
int i,j;
fseek (datafile, fpos, SEEK_SET);
if (feof(datafile) != 0) { //读到文件尾
return -2;
}
for ( ; ; ) {
fgets(str, _MAX_RNXO_DATA, datafile);
if (feof(datafile) != 0) { //读到文件尾
return -2;
}
if (strlen(str) < 14) { //字符串长度小于 一个数据长度
continue;
}
//读取历元时刻
rec->epoch.year = (unsigned short) csatol(str+1, 2);
rec->epoch.month = (unsigned char) csatol(str+4, 2);
rec->epoch.day = (unsigned char) csatol(str+7, 2);
rec->epoch.hour = (unsigned char) csatol(str+10, 2);
rec->epoch.minute = (unsigned char) csatol(str+13, 2);
rec->epoch.second = csatof(str+16, 11);
if (rec->epoch.year > 79) {
rec->epoch.year+=1900;
}
else {
rec->epoch.year+=2000;
}
rec->sat_num = csatol(str+30, 3);
//读取 PRN 列表
j = 0;
for (i=0; i < (rec->sat_num+11)/12; i++) {
if (i > 0) { //卫星数超过一行,使用续行
fgets(str, _MAX_RNXO_DATA, datafile);
}
for ( ; j<rec->sat_num && j<(i+1)*12; j++) {
rec->sat_list[j] = csatol(str+33+j%12*3, 2);
}
}
//如果有接收机钟的偏差
if (strlen(str) > 68) {
rec->rcvr_clk_bias = csatof(str+68, 12);
}
//读取观测值
rec->obs = (GPSOBS *) malloc (obs_type_number * rec->sat_num * sizeof (GPSOBS));
memset(rec->obs, 0, obs_type_number * rec->sat_num * sizeof (GPSOBS));
sum = obs_type_number * rec->sat_num;
for (counter = 0; counter < sum; ) { //读取观测值数据
if (feof(datafile) != 0) { //读到文件尾
return -2;
}
if (((counter % obs_type_number) % 5) == 0) { //是否读取新的数据行
fgets(str, _MAX_RNXO_DATA, datafile);
}
for (i=0; i < (long)strlen(str)/16; i++) {
csatoobs(str + i * 16, &rec->obs[counter]);
counter++;
}
}
if (counter == sum) {
return ftell(datafile);
}
}
return -1;
}
//将一个字符串转换成一个GPS观测数据
GPSOBS * csatoobs(const char *str, GPSOBS *obs)
{
obs->tag2 = csatol(str + 15, 1);
obs->tag1 = csatol(str + 14, 1);
obs->value = csatof(str, 14);
return obs;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -