多系统精密星历下载与分析

article/2025/10/12 11:10:08
  • 概述

精密星历是由若干卫星跟踪站的观测数据,经事后处理算得的供卫星精密定位等使用的卫星轨道信息。

IGS精密星历采用sp3格式,其存储方式为ASCII文本文件,内容包括表头信息以及文件体,文件体中每隔15 min给出1个卫星的位置,有时还给出卫星的速度。它的特点就是提供卫星精确的轨道位置。采样率为15分钟,实际解算中可以进行精密钟差的估计或内插,以提高其可使用的历元数。

IGS多系统精密星历下载地址:ftp://cddis.gsfc.nasa.gov/pub/gps/products/mgex/

文件根据GPS周分为很多文件夹,计算GPS周可以通过以下小程序:

https://download.csdn.net/download/gou_hailong/11739153

 

  • 命名规则

用的sp3格式的命名规则为:tttwwwwd.sp3
其中:ttt表示精密星历的管理机构名称,包括{wum(武汉大学)、tum(慕尼黑大学)}wwww表示GPS周;d表示星期,0表示星期日,1~6表示星期一至星期六。文件名如:igs20121.sp3,其中igs为计算单位名,2012为GPS周,1为星期一。

  • 文件格式

文件可以分为文件头与文件正文两部分,其中文件头格式如下:

第一行:文件版本 年 月 日 时 分 秒  历元数量 数据类型  协调系统 轨道类型  管理机构

第二行:GPS周 第一个历元周内秒 历元间隔 约化儒略历整数 约化儒略历小数

第三至十二行:卫星数量 卫星序号

第十三至二十二行:卫星序号对应的卫星精度

第二十三至二十四行:未使用

。。。。。。

文件正文格式如下:

‘P’表示‘卫星位置’,‘V’表示‘卫星速度’,‘G’表示‘GPS卫星’,‘R’表示'GLONASS卫星',‘E’表示‘伽利略卫星’,‘C’表示‘北斗卫星’

第一列:位置速度选项 系统类型 卫星序号

第二列:x坐标

第三列:y坐标

第四列:z坐标

第五列:钟差

文件读取程序如下:

%读取精密星历文件夹中的数据
global SP3_data
folders = dir('C:\Users\zhupf\Desktop\IGS数据\SP3\DATA\mix\解压后');
folders = {folders.name};
folders = setdiff(folders,{'.','..'})';
num = length(folders);
t=1;
for j = 1:numtline = folders{j};fid=fopen(['C:\Users\zhupf\Desktop\IGS数据\SP3\DATA\mix\解压后\' tline ],'rt');
Head_data=struct;
SP3_data =struct;
if(fid==-1)msgbox('输入的文件或者路径不正确,无法正确打开sp3文件','警告信息');return;
end
% 读取文件头,并将其存入Head_data结构数组中
Head=[];
for i=1:31 %制度文件头的前16行line=fgetl(fid);Head=[Head;line];%将sp3文件的文件头以字符的形式显示出来,切记此处要保证sp3文件中的头文件的每行字符数是相同的,否则读取将失败
end
line=fgetl(fid);
%提取文件头第一行的数据
Head_data.Version=Head(1,1:2);
Head_data.P_or_V=Head(1,3);
Head_data.start_year=str2num(Head(1,4:7));
Head_data.start_month=str2num(Head(1,9:10));
Head_data.start_day=str2num(Head(1,12:13));
Head_data.start_hour=str2num(Head(1,15:16));
Head_data.start_minute=str2num(Head(1,18:19));
Head_data.start_second=str2num(Head(1,21:31));
Head_data.EpochNum=str2num(Head(1,33:39));
Head_data.data_type=Head(1,41:45);
Head_data.Coordinate_system=Head(1,47:51);
Head_data.Orbit_type=Head(1,53:55);
Head_data.Institution=Head(1,57:60);
%第二行
Head_data.GPS_week=str2num(Head(2,4:7));
Head_data.FirstEpoch_weeksecond=str2num(Head(2,9:23));
Head_data.Epoch_interval=str2num(Head(2,25:38));
Head_data.MJD_zhengshu=str2num(Head(2,40:44));
Head_data.MJD_xiaoshu=str2num(Head(2,46:60));
%第三 至 七行-------提取观测卫星的PRN编号
Head_data.SatNum=str2num(Head(3,5:6));
PRN=strcat(Head(3,10:60),Head(4,10:60),Head(5,10:60),Head(6,10:60),Head(7,10:60));
L=length(PRN)/3;
SP3_PRN=[];
for i=1:LSp3_PRN=str2num(PRN((3*i-1):3*i));if Sp3_PRN==0continue;endSP3_PRN=[SP3_PRN Sp3_PRN];
end
Head_data.SP3_PRN=SP3_PRN;
%第十三 至 十七行-----提取相应卫星的精度
SatAccu=strcat(Head(13,10:60),Head(14,10:60),Head(15,10:60),Head(16,10:60),Head(17,10:60));
L=length(SP3_PRN);
SP3_SatAccu=[];
for i=1:LSp3_SatAccu=str2num(SatAccu((3*i-1):3*i));if Sp3_SatAccu==0continue;endSP3_SatAccu=[SP3_SatAccu Sp3_SatAccu];
end
Head_data.SP3_SatAccu=SP3_SatAccu;
%第二十五,二十六行-----读取标准差的浮点基数
Head_data.pos_jishu=str2num(Head(25,4:13));
Head_data.Satclock_jishu=str2num(Head(25,15:26));
%--------------------End of the reading of the Fileheader------------------%--------------------读取卫星坐标及卫星钟钟差--------------------------------
%读取的卫星的三维坐标的单位为km,卫星钟差的单位为uswhile 1 line=fgetl(fid);result=findstr(line,'EOF');if(isempty(result))SP3_data(t).year=str2num(line(4:7));SP3_data(t).month=str2num(line(9:10));SP3_data(t).day=str2num(line(12:13));SP3_data(t).hour=str2num(line(15:16));SP3_data(t).minute=str2num(line(18:19));SP3_data(t).second=str2num(line(21:22));SP3_data(t).mm=SP3_data(t).hour*60+SP3_data(t).minute+ SP3_data(t).second/60;%将该历元的时分秒化为分钟,方便后面和观测历元比较for j=1:Head_data.SatNumline=fgetl(fid);SP3_data(t).PRN(j)=str2num(line(3:4));%将每个历元的卫星编号保存在一个数组中SP3_data(t).x(j)=str2num(line(5:18)); %提取卫星的三维坐标,单位为kmSP3_data(t).y(j)=str2num(line(19:32));SP3_data(t).z(j)=str2num(line(33:46));SP3_data(t).Clock_corr(j)=str2num(line(47:60));%提取卫星钟差,单位为us%判断是否有坏的或空缺的位置值if(SP3_data(t).x(j)==0||SP3_data(t).y(j)==0||SP3_data(t).z(j)==0)fprintf('注意:星历文件中的第%g个历元的%g号卫星的位置值是坏的或空缺的!\n',t,SP3_data(t).PRN(j))end%判断是否为坏的或空缺的钟差值if(SP3_data(t).Clock_corr(j)==999999.999999)fprintf('注意:星历文件中的第%g个历元的%g号卫星的钟差值是坏的或空缺的!\n',t,SP3_data(t).PRN(j))end%判断X的标准差是否为未知,若是将其置为0if(length(line)>=73 && isempty(str2num(line(62:63))))SP3_data(t).X_mi(j)=0;elseif(length(line)>=73 && ~isempty(str2num(line(62:63))))SP3_data(t).X_mi(j)=str2num(line(62:63));end%判断Y的标准差是否为未知,若是将其置为0if(length(line)>=73 && isempty(str2num(line(65:66))))SP3_data(t).Y_mi(j)=0;elseif(length(line)>=73 && ~isempty(str2num(line(65:66))))SP3_data(t).Y_mi(j)=str2num(line(65:66));end%判断Z的标准差是否为未知,若是将其置为0if(length(line)>=73 && isempty(str2num(line(68:69))));SP3_data(t).Z_mi(j)=0;elseif(length(line)>=73 && ~isempty(str2num(line(68:69))))SP3_data(t).Z_mi(j)=str2num(line(68:69));end%判断卫星钟差的标准差是否为未知,若是将其置为0if(length(line)>=73 && isempty(str2num(line(71:73))))SP3_data(t).Clock_mi(j)=0;elseif(length(line)>=73 && ~isempty(str2num(line(71:73))))SP3_data(t).Clock_mi(j)=str2num(line(71:73));end%查看某个卫星坐标和星站距离变化if PRN(3*j-2:3*j) == 'G01' %选择需要查看的卫星序号x(t) = SP3_data(t).x(j);y(t) = SP3_data(t).y(j);z(t) = SP3_data(t).z(j);if t== 96*7QD = [-2665073.9893,4556123.9737,3776821.7794];  %测站坐标d = sqrt((x*1000-QD(1)).^2+(y*1000-QD(2)).^2+(z*1000-QD(3)).^2);figure(1);plot(x,'r','LineWidth',2.5);ylabel('x坐标');xlabel('时间');title('GPS 1号卫星x坐标');set(gca,'Xtick',[0 96 192 288 384 480 576]);set(gca,'Xticklabel',{'星期日','星期一','星期二','星期三','星期四','星期五','星期六'});figure(2);plot(y,'r','LineWidth',2.5);ylabel('y坐标');xlabel('时间');title('GPS 1号卫星y坐标');set(gca,'Xtick',[0 96 192 288 384 480 576]);set(gca,'Xticklabel',{'星期日','星期一','星期二','星期三','星期四','星期五','星期六'});figure(3);plot(z,'r','LineWidth',2.5);ylabel('z坐标');xlabel('时间');title('GPS 1号卫星z坐标');set(gca,'Xtick',[0 96 192 288 384 480 576]);set(gca,'Xticklabel',{'星期日','星期一','星期二','星期三','星期四','星期五','星期六'});figure(4);plot(d,'r','LineWidth',2.5);ylabel('星站距离');xlabel('时间');title('GPS 1号卫星与测站距离');
%                     legend('星站距离');set(gca,'Xtick',[0 96 192 288 384 480 576]);set(gca,'Xticklabel',{'星期日','星期一','星期二','星期三','星期四','星期五','星期六'});endendendelseif(~isempty(result))break;%判断读到文件的末尾,到达文件尾则退出endt=t+1;%记录文件体的行数
end
fclose(fid);
end

程序运行结果:


 

 


http://chatgpt.dhexx.cn/article/UJ4IDyc9.shtml

相关文章

2022年GPS广播星历精密星历如何下载

注意:!!网上现有很多教程的星历下载地址 ftp://cddis.gsfc.nasa.gov/已经访问不了了,最新的方法见下文,亲测有效~ 1、星历下载网址(需要注册一下)Earthdata Loginhttps://cddis.nasa.gov/archiv…

GPS广播星历和精密星历的下载

1.广播星历 1.1 广播星历下载路径 原路径:ftp://cddis.gsfc.nasa.gov/ 已经无法使用 新的下载路径如下:https://cddis.nasa.gov/archive/gnss/data/daily/2022/brdc/ 路径中的年份是2022年,可以根据需要进行设置不同年份。往下翻&#xff0…

Shader(GLSL)

GLSL语言编写,主要两类Vertex shader,Fragement shader Shader构造: 预处理 变量定义 通过输入参数和函数算法,计算输出结果(main函数) 预处理: 预处理的运算在编译时执行 只有一个#行的一行…

【Android -- 开源库】图片加载 Glide 的基本使用

一、简介 Glide 是一个快速高效的 Android 图片加载库,注重于平滑的滚动。 二、开始 1. 在 app/build.gradle 文件当中添加如下依赖: dependencies {compile com.github.bumptech.glide:glide:4.8.0; }2. 在 AndroidManifest.xml 添加网络权限&#…

Glide知识简介

首先Glide是Google为我们推荐的一个快速高效的图片加载库,使用简单。 第一步:添加依赖: //glide的依赖 implementation com.github.bumptech.glide:glide:4.9.0 annotationProcessor com.github.bumptech.glide:compiler:4.9.0 简单使用&…

OpenGL API - glDeleteShader

文章目录 名称原型参数描述错误 https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDeleteShader.xhtml OpenGL API - 笔记汇总 名称 glDeleteShader ---- 删除一个 shader 对象 原型 void glDeleteShader(GLuint shader);参数 shader 指定需要删除的 shader…

Android中的Glide

引入glide <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"androi…

android Glide介绍

目录 1.Glide的基本使用 1. 介绍 2. Glide占位符 2.Glide的进阶使用 1. 过渡动画 2. 变化 transform&#xff08;&#xff09; 3. Generated API 4. GlideExtension与GlideOption 1.Glide的基本使用 1. 介绍 Glide是一个快速高效的Android图片加载库&#xff0c;可以自…

Glide(二)Glide的with,load,into

Glide的with&#xff0c;load&#xff0c;into 在Glide的常规使用中&#xff0c;我们是这样使用的&#xff1a; protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ImageView imageView fin…

Glide学习

Glide框架学习 介绍with&#xff08;生命周期&#xff09;into缓存LRU缓存三级缓存为什么要有两种内存缓存加载顺序活动缓存为什么使用弱引用 介绍 常规方式&#xff1a;Glide.with(this).load(URL).into(imageView) 虽然with方法重载了很多个&#xff0c;我们可以传入不同的对…

Glide讲解

目录 Glide简介Glide的优点Glide的生命周期Glide如何实现图片缓存的内存缓存实现原理磁盘缓存实现原理引入缓存的目的Glide缓存流程从内存缓存读取总结从磁盘缓存读取总结写入磁盘缓存写入内存缓存汇总 Glide源码总结图解with&#xff08;&#xff09;load&#xff08;&#xf…

Glide详解

现在Android上的图片加载框架非常成熟&#xff0c;从最早的老牌图片加载框架UniversalImageLoader&#xff0c;到后来Google推出的Volley&#xff0c;再到后来的新兴军Glide和Picasso&#xff0c;当然还有Facebook的Fresco。每一个都非常稳定&#xff0c;功能也都十分强大。但是…

Android Glide

1.Glide Glide是Google主导的图片加载开源库。它有很多优势&#xff1a; ①使用简单&#xff0c;链式调用。 ②支持多种图片格式&#xff0c;如Gif、WebP、缩略图、Video等。 ③支持生命周期集成。Glide可以感知调用页面的生命周期&#xff0c;根据Activity或Fragment的生命…

[软件更新]gladder2.0.3.3

介绍 gladder是一个Firefox插件&#xff0c;名字被解释为Great Ladder (Ladder for Great Firewall)&#xff0c;目标是帮助人们跨过Great Firewall访问境外被查封的网站。 安装 https://addons.mozilla.org/en-US/firefox/addon/2864 (点击页面中的Install Now按钮) 功能 * 自…

飞机游戏代码(JAVA)

&#xff2d;yGameFrame类: 主要的调用类 package sc.wh.game;import javax.swing.JFrame; import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import sc.wh.game.*; import java.awt.event.KeyAdapte…

基于java的拼图经典游戏(附代码)

拼图游戏是一款经典的益智游戏&#xff0c;游戏开始前图片被随机打乱&#xff0c;空块位于最右下角&#xff0c;玩家通过点击空块周围图片或者按键方式对图片和空块进行相互交换&#xff0c;直到所有图片都回到原位即为游戏胜利。 本次制作的拼图游戏运行界面如下&#xff1a;…

java推箱子游戏源代码_java实现推箱子小游戏(附源码)

先上效果图 可以通过AWSD进行移动和推箱子 自己弄出来的代码玩起来还是很有意思的。 代码一共是三个.java文件,代码内容如下所示 package ss; import java.awt.Graphics; import java.awt.Image; import java.awt.Point; import java.awt.event.KeyEvent; import java.awt.eve…

免费Java游戏源代码素材推荐

家人们&#xff0c;最近我找到了一个很好用的Java游戏源代码免费素材网站 资源贼多&#xff0c;重点是免费&#xff01;&#xff01;&#xff01;白嫖一时爽&#xff0c;一直白嫖一直爽&#xff0c;嘿嘿嘿&#xff01;&#xff01;&#xff01;感兴趣的可以进去看看 接下来就…

java连连看代码_java实现连连看游戏

本文实例为大家分享了java实现连连看游戏的具体代码,供大家参考,具体内容如下 代码会实现共享的,这个是截图 代码: package com.lr.bean; import java.util.Scanner; import java.util.Random; import com.lr.bean.Point; public class Link{public static void main(Strin…

JAVA版扫雷游戏,清晰易懂,注释多

这是一篇关于JAVA的扫雷游戏&#xff0c;所有的图片均用文字代替&#xff0c;代码可直接运行。 文章目录 开发环境一、下载方法二、运行效果展示三、代码部分1.代码如下 总结 开发环境 开发工具&#xff1a;eclipse2021-12 JDK版本&#xff1a;JDK15.0.1 一、下载方法 链接&a…