爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 99663|回复: 106

[作图] 使用NCL画风云卫星TBB数据

  [复制链接]

新浪微博达人勋

发表于 2016-5-15 18:08:26 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 koala54 于 2016-6-2 10:26 编辑

论坛里关于用grads画TBB(相当黑体亮度温度)数据的帖子已经有很多了,这里分享一些用NCL画TBB的经验,TBB数据来自国家卫星气象中心,下载方法可见如下帖子点我去看。为了方便验证做图结果,使用了clare的帖子新手分析卫星云图用grads画TBB图里面的例子
作图思路:TBB是圆盘标称投影数据(何为圆盘标称投影?点我去看),投影坐标主要由中央经度和卫星高度两个参数确定,这样的数据分辨率一般是以实际距离m或km为单位,要用NCL画TBB主要问题就是把投影坐标转换到经纬度坐标。NCL可以直接打开hdf格式文件,用ncl_filedump查看一下文件,发现TBB数据在水平方向有2288*2288个格点,分辨率为5km(见文档1,P34)。这样的格点不是等经纬度的,可以通过格点参数计算出每个格点的经纬度(如用MeteoInfo的方法),或者根据卫星气象中心提供的经纬度查阅表(look-up table)读入格点的经纬度坐标。这里使用后一种方法,知道了格点的经纬度信息,就能直接用NCL画图了。
  1. ;---------------------------------------------------
  2. ; Plot FY2E TBB at 20130822_0000 (UTC)
  3. ;---------------------------------------------------
  4. load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
  5. load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"

  6. begin

  7. ;---- Read FY2 satellite data TBB.
  8.         f         = addfile("FY2E_TBB_IR1_NOM_20130822_0000.hdf","r")
  9.         tbb = f->FY2E_TBB_Hourly_Product

  10.         LVR = tbb@LowerValidRange ; The valid range of data is [LVR,UVR].
  11.         UVR = tbb@UpperValidRange

  12. ;---- Read FY2 LatLon lookup table.
  13.         f0                                 = "NOM_ITG_2288_2288(0E0N)_LE.dat"
  14.         dims                         = (/2288,2288/)
  15.         type                        = "float"
  16.         ; Band 1 is lon: data1
  17.         data1                        = fbindirread(f0,0,dims,type)
  18.         ; Band 2 is lat: data2
  19.         data2                         = fbindirread(f0,1,dims,type)
  20.         
  21.         lonCenter                 = 104.5                ; footpoint of FY-2E
  22.         latCenter           = 0
  23.         lon2d                         = data1+lonCenter
  24.         lat2d                   = data2+latCenter
  25.         lat2d@units         = "degrees_north"
  26.         lon2d@units         = "degrees_east"

  27. ;---- Add meta data for TBB.
  28.         tbb@lat2d                 = lat2d
  29.         tbb@lon2d                 = lon2d
  30.         tbb@units                 = "degree Kelvin"
  31.         tbb@long_name         = "Temperature of Bright Blackbody"
  32.         tbb@coordinates = "lat2d lon2d"
  33.         tbb@_FillValue  = -999.

  34. ;---- Replace data outside the valid range with missing value.
  35.         tbb_1d                                          = ndtooned(tbb)
  36.         ind_notValid                         = ind(tbb_1d.lt.LVR.or.tbb_1d.gt.UVR)
  37.         tbb_1d(ind_notValid)         = tbb@_FillValue
  38.         tbb                                         = onedtond(tbb_1d,dimsizes(tbb))

  39.         tbb = tbb-273.15        ;(convert degree Kelvin to degree Celsius)
  40.         tbb@units = "degree Celsius"
  41.         printMinMax(tbb,0)
  42.         printVarSummary(tbb)



  43. ;---- Begin to plot.
  44.         wks = gsn_open_wks("png","TBB_plot")
  45.         res = True

  46.         res@gsnDraw                                 = False
  47.         res@gsnFrame                                = False
  48.         res@gsnMaximize                                = True
  49.         res@gsnPaperOrientation                = "portrait"
  50.         res@gsnAddCyclic                         = False         ; regional data
  51.         ;tfDoNDCOverlay should be set False (default) when lat2d and lon2d are used.
  52.         ;res@tfDoNDCOverlay                        = True                        
  53.         res@pmTickMarkDisplayMode          = "Always"

  54.         ;---- Map Set
  55.         res@mpDataSetName                                = "Earth..4"
  56.         res@mpDataBaseVersion                        = "MediumRes"
  57.         res@mpOutlineSpecifiers                        = (/"China","China:Provinces"/)
  58.         res@mpOutlineBoundarySets           = "NoBoundaries"
  59.         res@mpNationalLineColor                        = "black"
  60.         res@mpProvincialLineColor                = "black"
  61.         res@mpGeophysicalLineColor          = "black"
  62.         res@mpNationalLineThicknessF         = 3
  63.         res@mpProvincialLineThicknessF  = 3
  64.         res@mpGeophysicalLineThicknessF = 3

  65.         res@mpMinLonF                                = 105
  66.         res@mpMaxLonF                                = 128
  67.         res@mpMinLatF                                = 18
  68.         res@mpMaxLatF                                = 35

  69.         res@trGridType                                = "TriangularMesh"
  70.         res@cnFillOn                                 = True
  71.         res@cnFillMode                                 = "RasterFill"
  72.         res@cnLinesOn                                 = False

  73.         res@gsnLeftString                        = "TBB"
  74.         res@gsnRightString                        = "~S~o~N~C"

  75.         ;---- Color set
  76.         cmap  = read_colormap_file("precip3_16lev")
  77.         cmap1 = cmap(4::,:)
  78.         cmap1(0,:) = cmap(0,:)
  79.         cmap1 = cmap1(::-1,:)
  80.         res@cnFillPalette = cmap1
  81.         
  82.         res@cnLevelSelectionMode = "ExplicitLevels"
  83.         res@cnLevels = (/-30,-40,-50,-60,-70,-80/)
  84.         res@lbOrientation = "vertical"

  85.         plot = gsn_csm_contour_map_ce(wks,tbb,res)
  86.         
  87.         draw(plot)
  88.         frame(wks)

  89. end
复制代码

2016-05-15:
几点心得:
1)经纬度查阅表提供的是二维经纬度信息 ,即经度和纬度都有2288*2288个格点,在NCL中二维经纬度不能作为变量的坐标变量,而要放在变量的属性中(如 tbb@lat2d=lat2d,而不是tbb!lat2d=lat2d);
2)知道二维经纬度后可以把图画在任意的地图投影里(脚本以极射赤面投影为例);
3)经纬度查阅表中的格点是默认以0°E和0°N为起点,使用时要加上卫星观测的中央经纬度(图1);
4)tbb变量的属性中有两个属性LowerValidRange和UpperValidRange分别代表有效数据的范围,范围之外的数据在脚本中设为了缺省值;
5)我看很多用grads画tbb的帖子中,最后把tbb-173和tbb+100分别转换成℃和K为单位;而我画hdf格式的tbb时,觉得tbb单位是K, tbb-273.15单位为℃时画出来结果和用grads画出结果比较一致,我没有找到相关的说明文档,大家知道的话请告诉我一下

2016-05-27 更新:
1)使用了兰溪之水版主重制的中国地图,边界准确,绘图快速,使用方便,在这里推荐给大家(去看看);
2)地图投影更改为低纬地区常用的等距圆柱投影;
3)关于GrADS绘制风云卫星AWX格式的数据,为什么要将TBB-173和TBB+100分别转换成℃和K为单位,我的理解是:
    AWS文件是二进制格式,数据格点的空间分辨率为0.1°x0.1°,东西和南北方向各有1201个格点,空间范围为:45-165°E,-60°S-60°N。数据开头有两行说明,所以数据可以看作有1203行和1201列。为了节约存储空间,TBB数据并没有以整型(4字节)存储,而是以ASCII字符(1字节)存储,并以ASCII字符的标号表示TBB。因为ASCII字符标号的范围只有0-255,而TBB(单位K)的范围要超过这个范围,所以TBB先减去了100再将其转换成ASCII字符存储。如果直接用GrADS画AWX格式数据,数据会向北偏移0.2°(有两行说明的缘故),可以先用Fortran提取出TBB数据再画图(程序见附件)。
    HDF格式的TBB直接是用K为单位存储的,故可直接使用。
    提取AWS二进制格式卫星数据的Fortran程序:
   
  1. program AWX2GRD

  2.     implicit none   
  3.     integer,parameter :: N=1201

  4.     character*1 :: ch(N,N+2)
  5.     integer :: tbb(N,N),i,j

  6.     open(10,file='F:\TBB\FY2E_TBB_IR1_OTG_20120816_0000.AWX',form='unformatted',access='direct',recl=1201*1023)
  7.     open(20,file='F:\TBB\FY2E_TBB_IR1_OTG_20100818_0000.grd',form='unformatted')
  8.       
  9.     read(10,rec=1) ch

  10.     tbb = ichar(ch(:,3:N+2))
  11.     tbb = tbb+100

  12.     write(20)((tbb(j,i),j=1,N),i=N,1,-1)

  13. end program AWX2GRD
复制代码





图1 风云2卫星观测的中央经纬度

图1 风云2卫星观测的中央经纬度

NCL作图

NCL作图

GrADS作图

GrADS作图

fy2_02_1b_format.pdf

1.26 MB, 下载次数: 134, 下载积分: 金钱 -5

文档1

FY2E_TBB_IR1_NOM_20130822_0000.hdf

19.98 MB, 下载次数: 442, 下载积分: 金钱 -5

TBB数据

NOM_ITG_2288_2288(0E0N)_LE.dat

39.94 MB, 下载次数: 977, 下载积分: 金钱 -5

LatLon_lookup_table

plot_TBB.ncl

2.89 KB, 下载次数: 233, 下载积分: 金钱 -5

NCL脚本

AWX2GRD.f90

481 Bytes, 下载次数: 87, 下载积分: 金钱 -5

AWX格式转换程序

plot_TBB_old.ncl

2.95 KB, 下载次数: 52, 下载积分: 金钱 -5

原先的脚本

点评

图很漂亮: 5.0 谢谢共享: 5.0
已经有人发过了: 0.0
图很漂亮: 5 谢谢共享: 5 已经有人发过了: 0
期待更多大作!  发表于 2016-5-15 21:05

评分

参与人数 6金钱 +56 贡献 +4 收起 理由
谷艳茹 + 1 很给力!
anlizheng + 4
KIMO23 + 10 很给力!
karenlk + 20 + 2 很给力!
当年明月 + 1 赞一个!
风子 + 20 + 2 赞一个!

查看全部评分

本帖被以下淘专辑推荐:

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

新浪微博达人勋

发表于 2020-9-27 21:10:08 | 显示全部楼层
FY-2E自2015年7月1日起漂移至东经86.5度赤道上空,所以2015年7月1日以后的数据中心经度都要改成东经86.5度
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2016-5-17 19:14:30 | 显示全部楼层
谢楼主分享
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2016-5-15 22:10:24 | 显示全部楼层
很好,谢谢分享!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-5-16 14:04:10 | 显示全部楼层
请问楼主,这里加载的load "$GEODIAG_ROOT/geodiag.ncl"是什么呀
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-5-16 16:26:58 | 显示全部楼层
谢谢分享。      
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-5-16 18:25:21 | 显示全部楼层
锦叶seven 发表于 2016-5-16 14:04
请问楼主,这里加载的load "$GEODIAG_ROOT/geodiag.ncl"是什么呀

加载的是大气所董理老师制作的NCL地理数据诊断包,这里用来绘制地图底图(;----Map set后的内容),具体介绍可见http://www.lasg.ac.cn/Sylm/2012/2/ni52mtkrni.htm,下载及安装见https://github.com/dongli/geodiag
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-5-16 18:39:33 | 显示全部楼层
koala54 发表于 2016-5-16 18:25
加载的是大气所董理老师制作的NCL地理数据诊断包,这里用来绘制地图底图(;----Map set后的内容),具体 ...

好的,谢谢楼主
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-5-18 19:38:39 | 显示全部楼层
感谢楼主分享
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-5-19 09:21:47 | 显示全部楼层
真给力的教材啊  点赞
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-5-19 10:21:10 | 显示全部楼层
koala54 发表于 2016-5-16 18:25
加载的是大气所董理老师制作的NCL地理数据诊断包,这里用来绘制地图底图(;----Map set后的内容),具体 ...

你好,我想下载$GEODIAG_ROOT/geodiag.ncl脚本,但在官网上下载不成功,能否分享一下,谢谢你
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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