爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 72154|回复: 30

[经验总结] 一次读取FY4A雷电数据(LMI)的过程总结

[复制链接]

新浪微博达人勋

发表于 2021-3-12 14:09:40 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

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)画图
结果:
1.png
发现并没有数据,可能性很多,就像最初怀疑数据有问题,那么,咱们不使用数据,直接输入一个经纬度(105,35)看看是否有结果
ax.scatter(105, 35, s=350, alpha=.6)
发现依旧没有结果,说明不是数据的问题,尝试加入投影参数
ax.scatter(lon, lat, s=350, alpha=.6,transform=ccrs.PlateCarree())


结果:
2.png
数据出现了,按最初的规律,应该是32个点,这里并没有。仔细看图,发现这两个点并不是圆,放大发现:
3.png
是有很多个点叠加的结果,应该是点的大小设置过大造成的。修改代码
ax.scatter(lon, lat, s=5, alpha=.6,transform=ccrs.PlateCarree())
4.png
至此,闪电位置标记成功。就此结束了吗,并没有,在最初找数据的过程中,我们发现了还有很多其他的量,比如EOT、ER、EFP、EA、EGA 这些都代表了什么呢?两条路,一条就是直接百度,第二条,就是去搞懂数据结构。



九、第八步查找数据结构
其实,拿到一个数据,最先搞明白的就是这个数据的结构,每个字节代表了什么意思。python好就好在很多通用的格式已经帮我们写好了读取方法,就比如这次帖子里面的数据。但是我们也要做好最坏的打算,万一没有普适性的方法,需要我们自己按字节去读取。
这里提供一个案例:《小白学习Basemap气象画地图的第五天(读取micaps站点数据,省级能见度分布)》,里面的read_mdfs.py就是按照micaps的格式文档,按字节读取的micaps数据,推荐对照文档研究一下
拿到FY4A雷电数据之后,通过这种论坛,七拐八拐来到了
5.png
网址:ttp://data.nsmc.org.cn/portalsite/default.aspx
在里面找到了
6.png
闪电仪的数据格式(可下载),这个网址还能下载风云数据
8.png
这里就有各个物理量的解释。当然,还是需要自己去翻译。
至此,单个数据文件我是怎么读出来的过程也介绍完毕了。

十、一些补充
1.因为网友给的不只是一个文件,所以下面给大家的py文件里面还有一些文件读取和循环的操作,我会注释好。
出图:
9.png 10.png
2.由于网友的要求,测试数据就不给大家了,但是上文提到的网站都能下载到,大家可以自行去下载。
3.这里做的是全国及其周边的,没有特地去做一个省的图,其实也很简单,两种方法,一种是画好全国,然后做掩膜,还有一种是在数据读取阶段做一个筛选,利用经纬度把不在范围内的数据剔除
4.本帖的目前是教会大家怎么去读取一个数据,怎么下手,所以写的段落符合思维顺序,不符合阅读顺序。
5.出的图没有做修饰,也没有很美观,因为目的不在于此,大家可以自己美化,比如闪电位置用“+”,写上时间等等。授人以鱼不如授人以渔。
6.我因为最开始以为xarray读取失败,所以最先研究的是数据格式文档,发现了数据格式为NetCDF,因此使用的库是netCDF4,前者更底层,后者更专业,结果都一样。
7.png
7.要画风云4云图靠这些还不够,还有很多东西要去搞懂,但思路是差不多的,别头大就好。
8.最坏的情况就是逐字节去读取,但是前提也是需要先知道数据格式。要学会看数据格式。


































画风云4闪电.rar

1017.49 KB, 下载次数: 113, 下载积分: 金钱 -5

评分

参与人数 3金钱 +60 贡献 +7 收起 理由
urnotcotton + 20 + 2 很给力!
珮瑶瑶 + 20
mofangbao + 20 + 5

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2021-3-12 14:50:21 | 显示全部楼层
本帖最后由 river 于 2021-3-12 14:51 编辑

很好的教程,我是第一个来学习的!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-3-12 14:59:47 来自手机 | 显示全部楼层
river 发表于 2021-03-12 14:50
本帖最后由 river 于 2021-3-12 14:51 编辑

很好的教程,我是第一个来学习的!{:soso__10169062262133571330_1:}


                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-3-12 15:14:58 | 显示全部楼层
很详细的教程,楼主很细心。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-3-12 15:40:46 来自手机 | 显示全部楼层
qinhantang10 发表于 2021-03-12 15:14
很详细的教程,楼主很细心。


                               
登录/注册后可看大图

                               
登录/注册后可看大图

                               
登录/注册后可看大图
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-3-13 16:10:48 | 显示全部楼层
感谢老师分享,那个网友受教了!!{:eb301:}{:eb301:}
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-3-16 11:12:22 | 显示全部楼层
最近和楼主一样在搞这个闪电数据,很有帮助。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-3-16 13:13:41 | 显示全部楼层
迷失的cherrry 发表于 2021-3-16 11:12
最近和楼主一样在搞这个闪电数据,很有帮助。

{:eb501:}
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2021-3-16 15:41:25 | 显示全部楼层
楼主是做闪电方向的吗
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2021-3-16 18:12:27 来自手机 | 显示全部楼层
星星当空照 发表于 2021-03-16 15:41
楼主是做闪电方向的吗

不是的,我没有方向

                               
登录/注册后可看大图
,啥都不会,就是个小白,这是有个网友让我读取一下试试。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表