【MATLAB】根據SP3文件繪製星下點軌跡

【MATLAB】根據SP3文件繪製星下點軌跡

XYZ與BLH轉換的代碼參考:ground track.py
@Pan Li. Email:[email protected]
@Jiahuan Hu. Email:[email protected]

本方法通過讀取精密星曆中的衛星座標進行直接的星下點軌跡繪製,並實現了對GNSS系統的選擇,示例所給的SP3文件便給出了GPS、GLONASS、Galileo、BDS和QZSS,可進行系統的自由選擇,代碼如下所示:

%%%%根據SP3文件繪製星下點軌跡
h = geoshow('landareas.shp', 'FaceColor', 'c');
grid on
hold on
xlabel('Longitude');
ylabel('Latitude');
set(gca,'Ylim',[-90,90],'ytick',[-90:30:90]);
set(gca,'yticklabel',{'90°S','60°','30°','0°','30°','60°','90°N'});
set(gca,'Xlim',[-180,180],'xtick',[-180:30:180]);
set(gca,'xticklabel',{'180°W','150°','120°','90°','60°','30°','0°','30°','60°','90°','120°','150°','180°E'});
set(gca,'Box','on');
set(gca,'FontSize',10,'Fontname', 'Times New Roman','Fontweight', 'bold');
set(gca,'GridAlpha',1,'GridLineStyle','--');
title('BDS Satllite track','FontSize',14,'Fontweight', 'bold');

%sp3文件讀取
file='igs20730.sp3';
fid = fopen(file,'rt');
while 1			   %頭文件讀取
   line = fgetl(fid);
   answer = findstr(line(2),'##');
   if  ~isempty(answer)
       line = fgetl(fid);
       nsat=str2num(line(4:6));
       sys = line(10:60);
       for i=1:5
            line = fgetl(fid);
            sys = [sys,line(10:60)];
       end
   end;
   for i=1:5
       ss='GRECJ';
       sns(i)=length(findstr(sys,ss(i)));
   end
   answer = findstr(line(1),'/*');
   if  ~isempty(answer), break; end;        %到頭文件尾,則跳出循環
end
line = fgetl(fid);
line = fgetl(fid);
line = fgetl(fid);
for i=1:24*4
    line = fgetl(fid);
    for j=1:nsat
        line = fgetl(fid);
        X(i,j)=str2num(line(6:18));
        Y(i,j)=str2num(line(20:32));
        Z(i,j)=str2num(line(34:46));
        [B0,L0]=XYZtoBLH(X(i,j),Y(i,j),Z(i,j));
        B(i,j)=B0;
        L(i,j)=L0;
    end
end

%各系統對應衛星列數
G=1:sns(1);
R=sns(1)+1:sns(1)+sns(2);
E=sns(1)+sns(2)+1:sns(1)+sns(2)+sns(3);
C=sns(1)+sns(2)+sns(3)+1:sns(1)+sns(2)+sns(3)+sns(4);
J=sns(1)+sns(2)+sns(3)+sns(4)+1:sns(1)+sns(2)+sns(3)+sns(4)+sns(5);

% for j=[G,R,E,C]
for j=[C]  %%%%在此選擇GNSS系統(GRECJ)%%%%
    for i=1:95
        if L(i,j)-L(i+1,j)<6&& L(i,j)-L(i+1,j)>-6
           plot(L(i:i+1,j)*57.3,B(i:i+1,j)*57.3,'MarkerSize',8,'linewidth',2,'color',[18 53 85]/255);
           hold on
       end
    end
end

%WGS84座標轉換到大地經緯度
function [b,l] = XYZtoBLH(x,y,z)
v=6378137.0;
e2=(1.0/298.257223563)*(2-(1.0/298.257223563));
r2=x*x+y*y;
b=atan(z/(sqrt(r2)));
l=atan2(y,x);
h=sqrt(r2+z*z)-v;
end

若選擇的系統爲北斗,則最終繪製的結果如下:
在這裏插入圖片描述
若採用m_map提供的相關底圖,可得到類似如下結果:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章