最近导师安排的工作需要使用 IRI 模型提供的TEC(单位面积总电子含量)数据,从而计算电离层延时,在此记录一下MATLAB读取数据的过程
对于给定的位置,时间和日期,国际参考电离层(IRI)可以提供电离层高度范围内电子密度,电子温度,离子温度和离子组成的月平均值,官方网站链接: IRI官网
IRI数据可以在线查询,链接: 在线数据,然而想要大批量读取数据,很明显效率太低。
官方提供了使用Fortran,Python和MATLAB读取数据的代码,Fortran了解太少,因此选择使用MATLAB。MATLAB版本是实时读取IRI网页数据并进行处理保存,因此需要联网使用。
然而官方提供的matlab代码并不能运行,因此需要进行修改和完善。
官方MATLAB代码链接:代码
下载代码后,需要网络传输工具-curl来实时读取数据。
在curl工具下载,而后将bin目录下的curl.exe复制到与代码相同路径下。
iritest.m给出了运行示例,默认参数配置如下
可以看到,调用iri2016函数,读取网页数据。
运行代码,报错,信息如下:
iri2016函数1124行出现数据越界,该行代码如下:
data = sscanf(result(newlines(246)+1 : newlines(246 + sweeplen)-1), '%f');
对代码进行分析,result变量里存储了根据输入参数(日期,经纬度等)获取的临时网页数据,newlines里存储了网页数据里换行符 ‘\n’ 的位置。
该行代码目的是从临时网页数据里,读取查询到的数据(数据前面有一些说明语句,并不需要)
报错原因是:网页格式发生了变动,因此提取数据出错。对result数据分析,可以看到截至2022-8-5,网页数据是从第142行开始,因此将1124行改为
data = sscanf(result(newlines(142)+1 : newlines(142 + sweeplen)-1), '%f');
并且1115行改为
if length(newlines) < 142
即可运行。
修改后代码可以运行,然而大量读取数据时,会出现读取数据过于频繁,网页返回数据为空,具体表现如下:
这个问题比较烦人,因为总是会在读取一段时间后出现网页读取过于频繁的现象。
为了解决这个问题,我对iri2016函数进行了修改,增加了网页读取成功的标志,每次出现读取频繁时,返回读取失败标志,进行重新读取,直至成功,这样便可以满足大规模读取数据的需求了。
修改方式:修改iri2016函数里的parseresult子函数,增加有效标志,并对所有使用到parseresult的地方进行修改,并为iri2016添加读取有效标志,方便再顶层里调用。
修改后的所有代码见以下链接:
链接:https://pan.baidu.com/s/1261vWxFjM4DLRqUdryMA_w
提取码:ce5n
打开文件夹,直接运行iritest即可
在iritest文件里,调用iri2016函数,返回N*M的数据矩阵,
N是查询数据的维度,比如我一次查询361个经度的数据,则N=361.
M是数据维度,共44列,详细说明见iri2016.m里的说明,如下:
我所需要的TEC数据位于第13列,然而返回的数据,第13列全是-1.
对代码进行分析,发现要想读取TEC数据,需要给出要读取的TEC高度阈值,因为TEC数据是对电子密度数据在不同高度上的积分,因此在不输入高度上限的时候,无法给出TEC数据。
iri2016函数输入的第12个参数tec_hmax,是TEC上限,该值需要位于50至2000(单位 km)之间才有效:
因此,在调用iri2016函数的时候,给入tec_hmax数据,即可避免返回数据全是-1的情况。
到此,使用MATLAB读取数据任务完成。