- 积分
- 1050
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2012-3-16
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
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画图了。- ;---------------------------------------------------
- ; Plot FY2E TBB at 20130822_0000 (UTC)
- ;---------------------------------------------------
- load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
- load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_csm.ncl"
- begin
- ;---- Read FY2 satellite data TBB.
- f = addfile("FY2E_TBB_IR1_NOM_20130822_0000.hdf","r")
- tbb = f->FY2E_TBB_Hourly_Product
- LVR = tbb@LowerValidRange ; The valid range of data is [LVR,UVR].
- UVR = tbb@UpperValidRange
- ;---- Read FY2 LatLon lookup table.
- f0 = "NOM_ITG_2288_2288(0E0N)_LE.dat"
- dims = (/2288,2288/)
- type = "float"
- ; Band 1 is lon: data1
- data1 = fbindirread(f0,0,dims,type)
- ; Band 2 is lat: data2
- data2 = fbindirread(f0,1,dims,type)
-
- lonCenter = 104.5 ; footpoint of FY-2E
- latCenter = 0
- lon2d = data1+lonCenter
- lat2d = data2+latCenter
- lat2d@units = "degrees_north"
- lon2d@units = "degrees_east"
- ;---- Add meta data for TBB.
- tbb@lat2d = lat2d
- tbb@lon2d = lon2d
- tbb@units = "degree Kelvin"
- tbb@long_name = "Temperature of Bright Blackbody"
- tbb@coordinates = "lat2d lon2d"
- tbb@_FillValue = -999.
- ;---- Replace data outside the valid range with missing value.
- tbb_1d = ndtooned(tbb)
- ind_notValid = ind(tbb_1d.lt.LVR.or.tbb_1d.gt.UVR)
- tbb_1d(ind_notValid) = tbb@_FillValue
- tbb = onedtond(tbb_1d,dimsizes(tbb))
- tbb = tbb-273.15 ;(convert degree Kelvin to degree Celsius)
- tbb@units = "degree Celsius"
- printMinMax(tbb,0)
- printVarSummary(tbb)
- ;---- Begin to plot.
- wks = gsn_open_wks("png","TBB_plot")
- res = True
- res@gsnDraw = False
- res@gsnFrame = False
- res@gsnMaximize = True
- res@gsnPaperOrientation = "portrait"
- res@gsnAddCyclic = False ; regional data
- ;tfDoNDCOverlay should be set False (default) when lat2d and lon2d are used.
- ;res@tfDoNDCOverlay = True
- res@pmTickMarkDisplayMode = "Always"
- ;---- Map Set
- res@mpDataSetName = "Earth..4"
- res@mpDataBaseVersion = "MediumRes"
- res@mpOutlineSpecifiers = (/"China","China:Provinces"/)
- res@mpOutlineBoundarySets = "NoBoundaries"
- res@mpNationalLineColor = "black"
- res@mpProvincialLineColor = "black"
- res@mpGeophysicalLineColor = "black"
- res@mpNationalLineThicknessF = 3
- res@mpProvincialLineThicknessF = 3
- res@mpGeophysicalLineThicknessF = 3
- res@mpMinLonF = 105
- res@mpMaxLonF = 128
- res@mpMinLatF = 18
- res@mpMaxLatF = 35
- res@trGridType = "TriangularMesh"
- res@cnFillOn = True
- res@cnFillMode = "RasterFill"
- res@cnLinesOn = False
- res@gsnLeftString = "TBB"
- res@gsnRightString = "~S~o~N~C"
- ;---- Color set
- cmap = read_colormap_file("precip3_16lev")
- cmap1 = cmap(4::,:)
- cmap1(0,:) = cmap(0,:)
- cmap1 = cmap1(::-1,:)
- res@cnFillPalette = cmap1
-
- res@cnLevelSelectionMode = "ExplicitLevels"
- res@cnLevels = (/-30,-40,-50,-60,-70,-80/)
- res@lbOrientation = "vertical"
- plot = gsn_csm_contour_map_ce(wks,tbb,res)
-
- draw(plot)
- frame(wks)
- 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程序:
- program AWX2GRD
- implicit none
- integer,parameter :: N=1201
- character*1 :: ch(N,N+2)
- integer :: tbb(N,N),i,j
- open(10,file='F:\TBB\FY2E_TBB_IR1_OTG_20120816_0000.AWX',form='unformatted',access='direct',recl=1201*1023)
- open(20,file='F:\TBB\FY2E_TBB_IR1_OTG_20100818_0000.grd',form='unformatted')
-
- read(10,rec=1) ch
- tbb = ichar(ch(:,3:N+2))
- tbb = tbb+100
- write(20)((tbb(j,i),j=1,N),i=N,1,-1)
- end program AWX2GRD
复制代码
|
-
图1 风云2卫星观测的中央经纬度
-
NCL作图
-
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
原先的脚本
评分
-
查看全部评分
|