- 积分
- 750
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2018-12-25
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 jl2587t 于 2021-3-12 14:09 编辑
一次读取FY4A雷电数据(LMI)的过程总结
本帖介绍了一次作者读取FY4A雷电数据(LMI)的过程,介绍了一步一步怎么把自己从来没有碰到过的数据读取出来,涉及了一个库netCDF4,对于会的朋友没有任何知识点和借鉴意义,可以不看的,只在给新手小白朋友们去讲解当拿到一种数据之后该怎么一步一步把它读出来。
一、数据来源
来自于以为网友,让我尝试读一下,文件名:FY4A-_LMI---_N_REGX_1047E_L2-_LMIE_SING_NUL_20200701000000_20200701000449_7800M_N01V1.NC
事先告诉了我这是雷电数据。
二、第一步尝试
第一眼看到是NC后缀的文件,所以想利用《小白学习cartopy气象画地图的第二天》读取温度的方式进行读取,即:
import xarray as xr
ds = xr.open_dataset('FY4A-_LMI---_N_REGX_1047E_L2-_LMIE_SING_NUL_20200701000000_20200701000449_7800M_N02V1.NC')
运行结果:
SerializationWarning: variable 'EYP' has _Unsigned attribute but is not of integer type. Ignoring attribute.
new_vars[k] = decode_cf_variable(
进程已结束,退出代码0
从结果来看,程序跑结束了,返回值0,虽然报了很多警告,但是没有报错,说明数据可能读出来了。
三、第二步打印
print(ds)
运行结果:
<xarray.Dataset>
Dimensions: (o: 1, x: 36)
Dimensions without coordinates: o, x
Data variables:
LON (x) float32 ...
LAT (x) float32 ...
EOT (x) float32 ...
ER (x) float32 ...
EFP (x) float32 ...
EA (x) float32 ...
EGA (x) float32 ...
EXP (x) float32 ...
EYP (x) float32 ...
DQF (x) int8 ...
nominal_satellite_subpoint_lat (o) float32 ...
nominal_satellite_subpoint_lon (o) float32 ...
nominal_satellite_height (o) float32 ...
geospatial_lat_lon_extent (o) float32 ...
OBIType (o) int32 ...
processing_parm_version_container (o) int32 ...
algorithm_product_version_container (o) int32 ...
。。。。。。。。。。。。。
一大串英文加数字,咱们不一定能看懂,但是有两个东西值得注意LON、LAT,经纬度嘛。那这里面是不是就是存着数据呢,对应上下文,是不是一个以(x)为下标的数组,一组经度,一组纬度,然后下面就是各种物理量,上文提示了总共36个。然后再下面是以(o)为下标的,就一个。那么Data variables就是数据的意思。
四、第三步打印数据
print(ds.variables)
运行结果:
Frozen({'LON': <xarray.Variable (x: 36)>
array([82.64, 82.62, 82.57, 82.46, 82.48, 82.66, 82.64, 82.62, 82.57, 82.46,
82.48, 82.66, 82.53, 82.71, 82.51, 82.73, 82.6 , 82.59, 82.42, 82.64,
82.57, 82.46, 82.48, 82.66, 82.62, 82.53, 82.73, 98.07, 98.15, 98.07,
98.15, 98.14, 98.07, 97.99, 98.07, 98.15], dtype=float32)
。。。
'LAT': <xarray.Variable (x: 36)>
array([25.73, 25.82, 25.65, 25.73, 25.65, 25.65, 25.73, 25.82, 25.65, 25.73,
25.65, 25.65, 25.82, 25.81, 25.9 , 25.73, 25.9 , 25.56, 25.9 , 25.73,
25.65, 25.73, 25.65, 25.65, 25.82, 25.82, 25.73, 21.54, 21.47, 21.54,
21.47, 21.55, 21.46, 21.54, 21.54, 21.47], dtype=float32)
。。。})
仔细看,这其实是不是就是一个python的字典,那么就直接引出咱们的第四步了
五、第四步打印字典
print(ds.variables['LON'])
运行结果:
<xarray.Variable (x: 36)>
array([82.64, 82.62, 82.57, 82.46, 82.48, 82.66, 82.64, 82.62, 82.57, 82.46,
82.48, 82.66, 82.53, 82.71, 82.51, 82.73, 82.6 , 82.59, 82.42, 82.64,
82.57, 82.46, 82.48, 82.66, 82.62, 82.53, 82.73, 98.07, 98.15, 98.07,
98.15, 98.14, 98.07, 97.99, 98.07, 98.15], dtype=float32)
Attributes:
long_name: Event Longitude
standard_name: Event Longitude
FillValue: 65535.0
valid_range: [-180. 180.]
units: degree
resolution: 7800m
coordinates: x
ancillary_variables: DQF
Description: China
从结果来看,确实有一个数组,存的应该是经度信息,下面还有另外一些类似解释说明的信息(Attributes属性),这时候可能就在担心这些信息是否会影响我们读取数据。先不管啦,既然是数组,那么是否可以按下标索引呢?
六、第五步打印单个数据
print(ds.variables['LON'][0])
运行结果:
<xarray.Variable ()>
array(82.64, dtype=float32)
Attributes:
long_name: Event Longitude
standard_name: Event Longitude
FillValue: 65535.0
valid_range: [-180. 180.]
units: degree
resolution: 7800m
coordinates: x
ancillary_variables: DQF
Description: China
出现了第四步里面的第0个元素,虽然仍然跟着属性,咱们暂时先不管他,意味着ds.variables['LON']里面就是经度信息。那么其他的各个数据存放应该也是类似的规律。
拿着经纬度,利用散点图,是否就可以画出闪电的位置了呢?下面开始尝试。这里解释一下,上面的很多步骤都是用来摸清文件里面的数据结构,提取我们需要的数据。
七、第六步提取数据
根据上面的经验,我们可以写这样的代码
import xarray as xr
ds = xr.open_dataset('FY4A-_LMI---_N_REGX_1047E_L2-_LMIE_SING_NUL_20200701000000_20200701000449_7800M_N02V1.NC')
lon = ds.variables['LON']
lat = ds.variables['LAT']
这样我们就得到了闪电事件的位置,弄一张地图,再画个散点图,理论上应该就成功了。
八、第七步画图
画地图部分参照《小白学习cartopy气象画地图的第二天》这里就不做具体解释了,画好地图后利用
ax.scatter(lon, lat, s=350, alpha=.6)画图
结果:
发现并没有数据,可能性很多,就像最初怀疑数据有问题,那么,咱们不使用数据,直接输入一个经纬度(105,35)看看是否有结果
ax.scatter(105, 35, s=350, alpha=.6)
发现依旧没有结果,说明不是数据的问题,尝试加入投影参数
ax.scatter(lon, lat, s=350, alpha=.6,transform=ccrs.PlateCarree())
结果:
数据出现了,按最初的规律,应该是32个点,这里并没有。仔细看图,发现这两个点并不是圆,放大发现:
是有很多个点叠加的结果,应该是点的大小设置过大造成的。修改代码
ax.scatter(lon, lat, s=5, alpha=.6,transform=ccrs.PlateCarree())
至此,闪电位置标记成功。就此结束了吗,并没有,在最初找数据的过程中,我们发现了还有很多其他的量,比如EOT、ER、EFP、EA、EGA 这些都代表了什么呢?两条路,一条就是直接百度,第二条,就是去搞懂数据结构。
九、第八步查找数据结构
其实,拿到一个数据,最先搞明白的就是这个数据的结构,每个字节代表了什么意思。python好就好在很多通用的格式已经帮我们写好了读取方法,就比如这次帖子里面的数据。但是我们也要做好最坏的打算,万一没有普适性的方法,需要我们自己按字节去读取。
这里提供一个案例:《小白学习Basemap气象画地图的第五天(读取micaps站点数据,省级能见度分布)》,里面的read_mdfs.py就是按照micaps的格式文档,按字节读取的micaps数据,推荐对照文档研究一下。
拿到FY4A雷电数据之后,通过这种论坛,七拐八拐来到了
网址:ttp://data.nsmc.org.cn/portalsite/default.aspx
在里面找到了
闪电仪的数据格式(可下载),这个网址还能下载风云数据
这里就有各个物理量的解释。当然,还是需要自己去翻译。
至此,单个数据文件我是怎么读出来的过程也介绍完毕了。
十、一些补充
1.因为网友给的不只是一个文件,所以下面给大家的py文件里面还有一些文件读取和循环的操作,我会注释好。
出图:
2.由于网友的要求,测试数据就不给大家了,但是上文提到的网站都能下载到,大家可以自行去下载。
3.这里做的是全国及其周边的,没有特地去做一个省的图,其实也很简单,两种方法,一种是画好全国,然后做掩膜,还有一种是在数据读取阶段做一个筛选,利用经纬度把不在范围内的数据剔除。
4.本帖的目前是教会大家怎么去读取一个数据,怎么下手,所以写的段落符合思维顺序,不符合阅读顺序。
5.出的图没有做修饰,也没有很美观,因为目的不在于此,大家可以自己美化,比如闪电位置用“+”,写上时间等等。授人以鱼不如授人以渔。
6.我因为最开始以为xarray读取失败,所以最先研究的是数据格式文档,发现了数据格式为NetCDF,因此使用的库是netCDF4,前者更底层,后者更专业,结果都一样。
7.要画风云4云图靠这些还不够,还有很多东西要去搞懂,但思路是差不多的,别头大就好。
8.最坏的情况就是逐字节去读取,但是前提也是需要先知道数据格式。要学会看数据格式。
|
评分
-
查看全部评分
|