卫星观测值文件简介
头文件数据
我们需要读取第一行的版本号2.11,第11行的观测值类型。其余数据无需读写
观测值数据
上图为一个时刻的观测值数据,以上图数据为例,75行到108行数据为一组数据,观测值文件有多组该数据,我们需要做的就是将每组数据提取出来。
首先我们需要了解下一组数据的构成,75行数据中,“22”是2022年的后两位数字;“04”是4月份;“03”是第三天;后面第一个“00”是小时;第二个“00”是分钟,再往后面“0.0000000”是秒;再后面的“0”是卫星状态,0代表正常,1代表数据异常;后面16表示接收机共接收16颗卫星,依次为“G03”、“G04”等等。该行只能容纳12颗卫星的名字,如果接收卫星数多于12颗,则将在下一行显示卫星名称。
在读取完以上数据后,下面的数据即是每颗卫星的每个观测值类型的数据。每行可容纳5个观测值数据,当观测值类型多于5个,则将有两行数据显示该颗卫星的观测值。本数据共有6类观测值数据,分别为C1、L1、P2、C5、L5.但并不是所有卫星都能观测到这6类数据,有的卫星观测不到完整的数据,则为空。
需要用到的MATLAB函数或者功能
函数名 | 作用 | |
---|---|---|
fopen(filepath) | 打开文件,filepath为文件路径 | |
fgetl(file) | 按行读取数据 | |
contains(str1,str2) | 将字符串str1和str2比较,相等返回true,不相等返回false | |
pad(str,num) | 如果字符串长度小于num,则将用空格将字符串str长度补充到num | |
feof(file) | 判断file文件是否读取到最后,是则返回true,不是则返回false | |
strrep(str,str1,str2) | 将字符串str中的str1替换为str2 |
完整代码
由于时间有限,代码具体细节不再做介绍,请读者自行研读,代码中有不完善地方,欢迎大家批评指正。
%读取观测值文件
clc;
clearvars;
%打开文件
ObsFilePath=".\观测值文件\hksl0930.22o";
obsfile=fopen(ObsFilePath);
if obsfile<0
error("文件打开失败");
end
tic
%读取头文件
while(1)
str=fgetl(obsfile);
%读到文件头结尾,跳出循环
if contains(str,"END OF HEADER")
break;
end
%观测值文件版本
if contains(str,"RINEX VERSION")
Obs.version=str2double(str(6:9));
end
%读取 APPROX POSITION XYZ
if contains(str,"APPROX POSITION XYZ")
Obs.ApproxPositionXYZ.X=str2double(strrep(str(1:14),' ',''));
Obs.ApproxPositionXYZ.Y=str2double(strrep(str(15:28),' ',''));
Obs.ApproxPositionXYZ.Z=str2double(strrep(str(29:42),' ',''));
end
%读取观测值类型
if contains(str,"# / TYPES OF OBSERV")
Obs.ObservTypes.count=str2double(strrep(str(1:6),' ',''));
for i=1:Obs.ObservTypes.count
k=strrep(str(11+(i-1)*6:12+(i-1)*6),' ','');
Obs.ObservTypes.Type(i)=string(k);
end
end
end
%读取数据
m=1;%读取的数据行数
while ~feof(obsfile)
str=fgetl(obsfile);
%判断字符串是否有80位,否则用空格补齐至80位
if length(str)<80
str=pad(str,80);
end
%读取第一行数据 年 月 日 时 分 秒 观测状态 观测到的卫星数量
Obs.data(m).Year=str2double(str(2:3));
Obs.data(m).Month=str2double(str(5:6));
Obs.data(m).Day=str2double(str(8:9));
Obs.data(m).Hour=str2double(str(11:12));
Obs.data(m).Minute=str2double(str(14:15));
Obs.data(m).Second=str2double(str(18:26));
Obs.data(m).Tag=str2double(str(29:29));
Obs.data(m).SatelliteCount=str2double(str(31:32));
%读取卫星名称
%卫星数量小于12颗
if Obs.data(m).SatelliteCount<=12
for n=1:Obs.data(m).SatelliteCount
Obs.data(m).obsdata(n).name=str(33+(n-1)*3:35+(n-1)*3);
end
%卫星数据多于12颗
else
for n=1:12
Obs.data(m).obsdata(n).name=str(33+(n-1)*3:35+(n-1)*3);
end
str=fgetl(obsfile);
if length(str)<80
str=pad(str,80);
end
for n=13:Obs.data(m).SatelliteCount
Obs.data(m).obsdata(n).name=str(33+(n-13)*3:35+(n-13)*3);
end
end
%读取各卫星的观测数据
for n=1:Obs.data(m).SatelliteCount
str=fgetl(obsfile);
if length(str)<80
str=pad(str,80);
end
%判断观测值类型是否多于5个
if length(Obs.ObservTypes.Type)>5
for i=1:5
Obs.data(m).obsdata(n).(Obs.ObservTypes.Type(i))=str2double(strrep(str(1+(i-1)*16:16+(i-1)*16),' ',''));
end
%下一行还有观测值
str=fgetl(obsfile);
if length(str)<80
str=pad(str,80);
end
for i=6:length(Obs.ObservTypes.Type)
Obs.data(m).obsdata(n).(Obs.ObservTypes.Type(i))=str2double(strrep(str(1+(i-6)*16:16+(i-6)*16),' ',''));
end
%观测值数量小于5个
else
for i=1:length(Obs.ObservTypes.Type)
Obs.data(m).obsdata(n).(Obs.ObservTypes.Type(i))=str2double(strrep(str(1+(i-1)*16:16+(i-1)*16),' ',''));
end
end
end
m=m+1;
end
toc