爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 16806|回复: 37

MeteoInfoLab脚本示例:读取BUFR数据

[复制链接]

新浪微博达人勋

发表于 2017-6-24 20:38:24 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 MeteoInfo 于 2020-9-21 16:21 编辑

BUFR是WMO规定的一种表格码驱动数据格式,是针对站点观测数据存储的,GRIB数据格式是针对格点数据的。BUFR格式过于灵活,而且有数据重复机制,如果没有约定的话很难自动解析出特定的信息。netCDF Java库可以读取BUFR格式,但读出来是Sequence数组ArraySequence,里面的数据可能“多层嵌套”。addfile函数打开数据时要加上keepopen=True参数,数据读完后用关闭文件。obs变量的get_members方法可以获取变量所有的Members,member_array函数可以获取某个Member的数值,如果Member是Squence,还需要进一步获取其内部member的数据。

>>> v.get_members()
[SATELLITE_IDENTIFIER, IDENTIFICATION_OF_ORIGINATING_GENERATING_CENTRE, SATELLITE_CLASSIFICATION, SEGMENT_SIZE_AT_NADIR_IN_X-DIRECTION, SEGMENT_SIZE_AT_NADIR_IN_Y-DIRECTION, YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, ROW_NUMBER, COLUMN_NUMBER, LATITUDE_(HIGH_ACCURACY), LONGITUDE_(HIGH_ACCURACY), CLOUD_AMOUNT_IN_SEGMENT, AMOUNT_OF_LOW_CLOUDS, NUMBER_OF_OBSERVATIONS, struct1, AMOUNT_OF_MIDDLE_CLOUDS, NUMBER_OF_OBSERVATIONS-2, struct2, AMOUNT_OF_HIGH_CLOUDS, NUMBER_OF_OBSERVATIONS-3, struct3, DATA_PRESENT_INDICATOR, IDENTIFICATION_OF_ORIGINATING_GENERATING_CENTRE-2, GENERATING_APPLICATION, OBSERVATION_QUALITY]

Unidata网站可以下载toolsUI软件来打开数据看里面的具体信息和一些常用的表格。

示例脚本:
  1. fn = 'D:/Temp/bufr/MSG3-SEVI-MSGCLAP-0000-0000-20150101004500.000000000Z-20150101005935-1187380.bfr'
  2. f = addfile(fn, keepopen=True)
  3. v = f['obs']
  4. lon = v.member_array('LONGITUDE_(HIGH_ACCURACY)')
  5. lat = v.member_array('LATITUDE_(HIGH_ACCURACY)')
  6. lon = (lon - 1.8E7) * 1.E-5
  7. lat = (lat - 9.E6) * 1.E-5
  8. struct1 = v.member_array('struct1')
  9. temp = struct1.member_array('TEMPERATURE_AIR_TEMPERATURE')
  10. temp = temp * 0.1
  11. temp = temp[:,0]
  12. f.close()

  13. #Plot
  14. axesm()
  15. geoshow('country')
  16. layer = scatterm(lon, lat, temp, 20, size=4, edge=False, zorder=0)
  17. colorbar(layer)
  18. title('Bufr data example')


bufr_1.png

MeteoInfo 2.1.2版本以后增加了中国气象局的Bufr表格,可以读取中国气象局的Bufr文件。下面是一个例子:

  1. fn = r'D:\Temp\bufr\bufr_data\Z_SURF_I_57377_20200225000000_O_AWS_FTM.BIN'
  2. f = addfile(fn, keepopen=True)
  3. obs = f['obs']
  4. lon = obs.member_array('Longitude_high_accuracy')
  5. lat = obs.member_array('Latitude_high_accuracy')
  6. lon = (lon - 1.8E7) * 1.E-5
  7. lat = (lat - 9.E6) * 1.E-5
  8. alt = obs.member_array('Height_of_station_ground_above_mean_sea_level')
  9. alt = (alt - 4000) * 1.E-1
  10. st_name = obs.member_array('Station_or_site_name')
  11. st_id = obs.member_array('WMO_station_number')
  12. year = obs.member_array('Year')
  13. month = obs.member_array('Month')
  14. day = obs.member_array('Day')
  15. hour = obs.member_array('Hour')
  16. seq1 = obs.member_array('seq1')
  17. pres = seq1.member_array('Pressure') * 1e1
  18. seq2 = obs.member_array('seq2')
  19. temp = seq2.member_array('Temperature-air_temperature') * 1e-1
  20. print('Pressure: {}; Temperature: {}'.format(pres, temp))

  21. f.close()




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

新浪微博达人勋

发表于 2017-6-24 20:46:34 | 显示全部楼层
赞           
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-6-24 21:04:34 | 显示全部楼层
niubility!
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2017-7-21 16:29:35 | 显示全部楼层
请高手这个运行在什么环境下
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-7-21 17:19:03 | 显示全部楼层
MrrChenqili 发表于 2017-7-21 16:29
请高手这个运行在什么环境下

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

新浪微博达人勋

发表于 2017-10-25 22:44:05 | 显示全部楼层
File "C:\Users\Ice\Desktop\MeteoInfo\pylib\mipylib\dataset\midata.py", line 91, in addfile
    fname, isweb = __getfilename(fname)
  File "C:\Users\Ice\Desktop\MeteoInfo\pylib\mipylib\dataset\midata.py", line 47, in __getfilename
    if os.path.exists(fname):
  File "C:\Users\Ice\Desktop\MeteoInfo\lib\jython-standalone-2.7.1.jar\Lib\genericpath.py", line 18, in exists我运行后报错
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-10-25 23:48:04 | 显示全部楼层
磨人的小妖精儿 发表于 2017-10-25 22:44
File "C:%users\Ice\Desktop\MeteoInfo\pylib\mipylib\dataset\midata.py", line 91, in addfile
    fna ...

是不是文件路径写得不对,仔细看1楼的脚本。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-11-1 10:19:11 来自手机 | 显示全部楼层
谢谢楼主分享~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-11-25 11:59:54 | 显示全部楼层
王老师好,struct1 = data.getArray('struct1')这句报错,没有这个语句,Traceback (most recent call last):
  File "<iostream>", line 15, in <module>
        at ucar.ma2.StructureData.getArray(StructureData.java:160)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
java.lang.IllegalArgumentException: java.lang.IllegalArgumentException: illegal member name =struct1
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-11-25 14:14:41 | 显示全部楼层
磨人的小妖精儿 发表于 2017-11-25 11:59
王老师好,struct1 = data.getArray('struct1')这句报错,没有这个语句,Traceback (most recent call last ...

data里面没有'struct1'这个成员名,你可以先运行前面的代码,然后在Console里输入 data ,回车,看看data 里面有什么成员。burf格式很灵活,不可能一套代码包打天下,需要根据文件的内容调整。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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