爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 4435|回复: 1

MeteoInfoLab脚本示例:读取NOAA 16 AVHRR局地投影数据

[复制链接]

新浪微博达人勋

发表于 2016-3-7 11:08:58 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 MeteoInfo 于 2016-3-8 08:41 编辑

局地投影文件是对极轨资料原始文件进行辐射订正、投影变换、几何纠正等预处理工作后生成的文件格式。相对于原始文件来说,局地文件具备已完成投影、几何纠正和文件存储空间小等优势,是气象部门常用的存储格式,常见的文件后缀包括LD2和LDF。局地文件由头文件和通道数据2部分组成,其中头文件占128字节,通道数据依照BSQ(band sequential)格式排列,按波段依次存储数据。具体的数据格式可以参考下面的文章:


谭明艳,李程,李辉,2011,基于ENVI/IDL的气象卫星局地投影数据的提取,广东气象,33(2):62-64.


这里给出利用MeteoInfoLab脚本读取某个波段的数据并绘图的例子。首先利用Python读取二进制文件的模块(struct)将数据中的一些参数读取出来,然后利用MeteoInfoLab中的binread()函数读取某个波段的数据至一个二维数组并绘图。binread()函数的第一个参数是数据文件名,第二个参数是数据维的设置,第三个参数是数据类型,此外还有一些可选参数,skip参数指定了读取数据时跳过的字节数,byteorder指定了字节顺序(big_endian或者little_endian,缺省为little_endian)。局地投影数据每个数据是2个字节的整数(即short),数据读取后要除以10。


示例脚本:
  1. import struct
  2. fn = 'E:/Temp/jingjing/NOAA16_AVHRR_20050601.MOS.ldf'

  3. #Read data header parameters
  4. f = open(fn, 'rb')
  5. fid, = struct.unpack('2s', f.read(2))
  6. sid, = struct.unpack('<h', f.read(2))
  7. f.read(4)
  8. year, = struct.unpack('<h', f.read(2))
  9. month, = struct.unpack('<h', f.read(2))
  10. day, = struct.unpack('<h', f.read(2))
  11. hour, = struct.unpack('<h', f.read(2))
  12. minute, = struct.unpack('<h', f.read(2))
  13. f.read(2)
  14. channel_n, = struct.unpack('<h', f.read(2))
  15. proj, = struct.unpack('<h', f.read(2))
  16. xn, = struct.unpack('<h', f.read(2))
  17. yn, = struct.unpack('<h', f.read(2))
  18. xdelta, = struct.unpack('<f', f.read(4))
  19. ydelta, = struct.unpack('<f', f.read(4))
  20. lon_1, = struct.unpack('<f', f.read(4))
  21. lon_2, = struct.unpack('<f', f.read(4))
  22. raduis, = struct.unpack('<f', f.read(4))
  23. lat_min, = struct.unpack('<f', f.read(4))
  24. lat_max, = struct.unpack('<f', f.read(4))
  25. lon_min, = struct.unpack('<f', f.read(4))
  26. lon_max, = struct.unpack('<f', f.read(4))
  27. f.close()

  28. #Read one channel data
  29. cn = 3    #4th channel
  30. skipn = 128 + (xn * yn * 2) * cn
  31. data = binread(fn, [yn, xn], 'short', skip=skipn)
  32. data = data[::-1,:]
  33. data = data.astype('float')
  34. data[data<=0] = nan
  35. data = data / 10
  36. lon = arange1(lon_min, xn, xdelta)
  37. lat = arange1(lat_min, yn, ydelta)
  38. #Plot
  39. axesm()
  40. lworld = shaperead('D:/Temp/Map/country1.shp')
  41. lchina = shaperead('D:/Temp/Map/bou2_4p.shp')
  42. geoshow(lchina, edgecolor='b')
  43. geoshow(lworld, edgecolor='b')
  44. cmap = 'MPL_gist_gray'
  45. levs = arange(2200, 3001, 50)
  46. layer = imshowm(lon, lat, data, levs, cmap=cmap)
  47. colorbar(layer)
  48. t = datetime.datetime(year, month, day, hour, minute)
  49. title('AVHRR (' + t.strftime('%Y-%m-%d') + ')')


NOAA_16-AVHRR.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-8-22 17:32:34 | 显示全部楼层
老师您好,我遇到了类似的问题,二进制文件是C#通过读取数据库产生的站点地面要素文件,写成了为grads准备的格式,看到上面的程序里基本是逐要素读取。现在关键是我不清楚每个要素所占的字节,以及要素之间的空格有多少,因为那个C#程序并不是我写的,请问还有更方便的读取方式吗?pickle.load试过也不行
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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