MATLAB--读取2.11版本卫星观测值文件

该博客介绍了如何使用MATLAB读取RINEX观测值文件,重点关注文件头信息如版本号、观测类型以及观测数据中的时间、卫星状态和观测值。代码示例详细展示了读取过程,包括对数据行的处理,如判断数据行的卫星数量、观测值类型数量,并解析卫星名称和观测数据。
摘要由CSDN通过智能技术生成

卫星观测值文件简介

头文件数据

在这里插入图片描述
我们需要读取第一行的版本号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
RINEX(Receiver Independent Exchange Format)是全球卫星导航系统(GNSS)接收机观测数据的标准格式。RINEX 2.11版本是目前广泛使用的版本之一。要提取RINEX 2.11观测文件数据,可以按以下步骤进行: 第一步是选择合适的工具或软件。有很多软件可供选择,如RTKLIB、Trimble Business Center、Topcon Tools等。这些软件具有不同的功能和特点,用户可以根据需要选择适合自己的软件。 第二步是将接收机的原始观测数据导入到软件中。接收机会将观测数据存储在一个或多个文件中,可以通过串口或USB接口将其传输到计算机上。若软件支持直接从接收机中读取数据,则可以省略此步骤。 第三步是解压缩RINEX观测文件。RINEX 2.11文件可能以“.YYO”或“.YYD”为扩展名,其中YY表示年份,O表示观测文件,D表示数据文件。解压缩后,观测数据存储在.txt文件中。 第四步是选择需要提取的数据类型。RINEX观测文件包含多种测量和数据类型,如卫星位置、信号强度、信号时偏等。用户可以根据需求选择需要的数据类型。 第五步是提取数据并进行处理。一般情况下,用户需要进行数据预处理、数据分析和数据可视化等步骤,以获得所需的信息和结果。这些步骤需要根据所使用的软件和具体应用进行操作。 总之,提取RINEX 2.11观测文件数据需要借助合适的软件和工具,并按照以上步骤进行处理和分析,以实现不同的应用需求。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值