【MATLAB】根据SP3文件绘制星下点轨迹

【MATLAB】根据SP3文件绘制星下点轨迹

XYZ与BLH转换的代码参考:ground track.py
@Pan Li. Email:lipan.whu@gmail.com
@Jiahuan Hu. Email:hhu@whu.edu.cn

本方法通过读取精密星历中的卫星坐标进行直接的星下点轨迹绘制,并实现了对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提供的相关底图,可得到类似如下结果:

在这里插入图片描述

  • 8
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
您好,要绘制星下点轨迹,需要知道卫星的轨道参数和地球的形状参数。一般来说,可以使用开源的轨道计算工具如Orekit或者SPG4来计算卫星的位置信息,然后再将其投影到地球表面上得到星下点的位置。接下来使用Matlab中的绘图函数即可绘制星下点轨迹。 以下是一个简单的Matlab代码示例,用于绘制一个卫星在地球表面上的星下点轨迹: ```matlab % 定义地球形状参数 R = 6378.137; % 地球半径,单位:km f = 1/298.257223563; % 地球扁率 % 定义卫星轨道参数 a = 7000; % 半长轴,单位:km e = 0.001; % 偏心率 i = 45; % 轨道倾角,单位:度 Omega = 0; % 升交点赤经,单位:度 omega = 0; % 近地点幅角,单位:度 M0 = 0; % 平近点角,单位:度 n = sqrt(398600.4418/(a^3)); % 平均运动角速度,单位:rad/s % 计算卫星位置信息 t = linspace(0, 2*pi/n, 1000); % 时间序列 E = kepler(M0, e, t); % 求解偏近点角 r = a*(1 - e*cos(E)); % 距离 v = sqrt(398600.4418*(2/r - 1/a)); % 速度 theta = atan2(sqrt(1 - e^2)*sin(E), cos(E) - e); % 真近点角 u = omega + theta; % 真近点经度 i = i*pi/180; Omega = Omega*pi/180; u = u*pi/180; X = r.*(cos(Omega).*cos(u) - sin(Omega).*sin(u).*cos(i)); Y = r.*(sin(Omega).*cos(u) + cos(Omega).*sin(u).*cos(i)); Z = r.*sin(u).*sin(i); % 投影到地球表面上得到星下点位置 lat = asin(Z./sqrt(X.^2 + Y.^2 + Z.^2))*180/pi; % 纬度 lon = atan2(Y, X)*180/pi; % 经度 % 绘制星下点轨迹 figure; worldmap('World'); load coastlines; plotm(coastlat, coastlon); plotm(lat, lon, 'r'); title('Satellite Ground Track'); ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值