爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 31499|回复: 25

[作图] WRF数据转化为等经纬度格点数据的问题

[复制链接]

新浪微博达人勋

发表于 2017-5-7 16:03:26 | 显示全部楼层 |阅读模式

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

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

x
第一张图是我用WRF数据直接画出的图第二张图是我试图把数据转化为等间距的格点数据,然后画出的图,显然不是很符合实际情况

请教了很多大神,还是没能解决,这到底是投影问题还是没有插值的问题?

下面是画第二幅图所用的代码(WRF原数据经纬度分别为399和299个点):

  a = addfile("tibet_2016080100_5.nc","r")
  tt = wrf_user_getvar(a,"T2",-1)
  tt@units="degC"
  tt=tt-273

    lat2d=a->XLAT(0,:,:)
    lon2d=a->XLONG(0,:,:)
    printVarSummary(lat2d)
    printMinMax(lat2d, True)
    printMinMax(lon2d, True)

    imjm=dimsizes(lat2d)
    im=imjm(1)
    jm=imjm(0)

    lat1d  = new ((/jm/), float)
    lon1d  = new ((/im/), float)
    lat1d(:)=lat2d(:,398)
    lon1d(:)=lon2d(298,:)

    tt&south_north = lat1d
    tt&west_east = lon1d

  wks = gsn_open_wks("png","ex")   

  res                       = True
  res@cnFillOn              = True     ; turn on color fill
  res@cnLinesOn             = False    ; turn of contour lines
  res@cnFillPalette         = "NCV_blu_red"             ; send graphics to PNG file

  res@gsnAddCyclic          =False
  res@mpMinLatF=0.
  res@mpMaxLatF=40.
  res@mpMinLonF=60.
  res@mpMaxLonF=120.

  plot = gsn_csm_contour_map(wks,tt(0,:,:),res)


原数据画的图

原数据画的图

转化格点数据画的图

转化格点数据画的图
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-5-9 10:48:24 | 显示全部楼层
从你这个图上看,经纬度信息好像是没赋好,我自己简单画了下,你看看是不是有帮助。(1)
begin
  a = addfile("wrfout_d01_2010-10-14_00:00:00","r")
  lat2d = a->XLAT(0,:,:)
  lon2d = a->XLONG(0,:,:)
  tt = wrf_user_getvar(a,"T2",0)
  tt@lat2d = lat2d
  tt@lon2d = lon2d

  wks = gsn_open_wks("pdf","sp_tmp")
  res = True
  res@gsnDraw = True
  res@gsnMaximize = True
  res@cnFillOn = True
  res@cnLinesOn = False
  res@gsnAddCyclic = False
  plot = gsn_csm_contour_map(wks,tt,res)
end

得到的图如下:
1.png
模拟区域只有南海和西北太这么大的区域,并且是兰勃脱投影,底图是经纬网格,所以画出来模拟区域的数据是扇形。

(2)
接下来我把  tt@lat2d = lat2d
  tt@lon2d = lon2d这两句注释掉,得到如下图:
2.png
变量没了坐标信息,因此自动填充了整个画图区域,并且在运行ncl脚本时,会提示:
(0)        check_for_y_lat_coord: Warning: Data either does not contain a valid latitude coordinate array or doesn't
contain one at all.(0)        A valid latitude coordinate array should have a 'units' attribute equal to one of the following values:
(0)            'degrees_north' 'degrees-north' 'degree_north' 'degrees north' 'degrees_N' 'Degrees_north' 'degree_N'
'degreeN' 'degreesN' 'deg north'(0)        check_for_lon_coord: Warning: Data either does not contain a valid longitude coordinate array or doesn't
contain one at all.(0)        A valid longitude coordinate array should have a 'units' attribute equal to one of the following values:
(0)            'degrees_east' 'degrees-east' 'degree_east' 'degrees east' 'degrees_E' 'Degrees_east' 'degree_E' 'deg
reeE' 'degreesE' 'deg east'

(3)
接下来插值到经纬网格上去
begin
  a = addfile("wrfout_d01_2010-10-14_00:00:00","r")
  lat2d = a->XLAT(0,:,:)
  lon2d = a->XLONG(0,:,:)
  lat1d = lat2d(:,0)
  lon1d = lon2d(0,:)
  tt = wrf_user_getvar(a,"T2",0)
  tt@lat2d = lat2d
  tt@lon2d = lon2d
  tt2 = rcm2rgrid_Wrap(lat2d,lon2d,tt,lat1d,lon1d,0)

  wks = gsn_open_wks("pdf","sp_tmp")
  res = True
  res@gsnDraw = True
  res@gsnMaximize = True
  res@cnFillOn = True
  res@cnLinesOn = False
  res@gsnAddCyclic = False
  plot = gsn_csm_contour_map(wks,tt2,res)
end

得到如下图:
3.png
小区域内已经变成直角矩形
(4)
修改底图范围:
  res@mpMinLatF = min(lat1d)
  res@mpMaxLatF = max(lat1d)
  res@mpMinLonF = min(lon1d)
  res@mpMaxLonF = max(lon1d)

得到如下图:
4.png
最下头的空白是因为,原始数据是兰勃脱投影,最下边是向上拱起来的,空白部分没有数据,因此插值出来也是缺省值,在插值时把lat1d的范围略调小,就可以解决。

评分

参与人数 1金钱 +10 贡献 +2 收起 理由
melonanswer + 10 + 2

查看全部评分

密码修改失败请联系微信:mofangbao
回复 支持 3 反对 0

使用道具 举报

新浪微博达人勋

发表于 2017-5-7 20:48:42 | 显示全部楼层
看图一你的wrf结果应该是兰勃脱投影吧,这样的数据如果不经过插值,直接放到等距经纬网格底图上,画出来的图像一定是个扇形。
    tt&south_north = lat1d
    tt&west_east = lon1d
通过这种方式赋给原始数据的经纬度信息,就是错的,数据和位置是不匹配的,画出来也不可能对。
密码修改失败请联系微信:mofangbao
回复 支持 0 反对 1

使用道具 举报

新浪微博达人勋

发表于 2017-5-7 20:52:43 | 显示全部楼层
你可以试试tt2 = rcm2rgrid_Wrap(lat2d,lon2d,tt,lat1d,lon1d,0)
lat1d、lon1d是规则网格(1维),lat2d、lon2d是wrf模式网格(2维)
插值后再看看
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-5-7 21:06:03 | 显示全部楼层
pandasp1213 发表于 2017-5-7 20:52
你可以试试tt2 = rcm2rgrid_Wrap(lat2d,lon2d,tt,lat1d,lon1d,0)
lat1d、lon1d是规则网格(1维),lat2d、 ...

非常感谢,按照你说的成啦!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-5-8 17:54:57 | 显示全部楼层
同求同求呢,好复杂
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-5-8 21:40:08 | 显示全部楼层
本帖最后由 Soaring 于 2017-5-8 21:59 编辑
pandasp1213 发表于 2017-5-7 20:52
你可以试试tt2 = rcm2rgrid_Wrap(lat2d,lon2d,tt,lat1d,lon1d,0)
lat1d、lon1d是规则网格(1维),lat2d、 ...

您好,我又做了如下改进,画出来的图还是有问题,而且不是扇形,这是为啥?还有,如果要变成常用的nc格式画图(即用gsn_contour_map命令)是不是必须要通过插值?
谢谢!

begin

  a = addfile("tibet_2016080100_5.nc","r")
  tt = wrf_user_getvar(a,"T2",0)

    lat2d=a->XLAT(0,:,:)
    lon2d=a->XLONG(0,:,:)

    tt@lat2d = lat2d                                  ;这两行好像没起作用
    tt@lat2d = lon2d                                 ;


  plot = gsn_csm_contour_map(wks,tt,res)

end


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

新浪微博达人勋

发表于 2017-5-9 10:53:21 | 显示全部楼层
Soaring 发表于 2017-5-8 21:40
您好,我又做了如下改进,画出来的图还是有问题,而且不是扇形,这是为啥?还有,如果要变成常用的nc格式 ...

1楼的plt_geo_5.png是用什么函数画的?画图时应该已经设置了兰勃脱投影,所以画出来的数据和底图是匹配的,都是扇形
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-5-9 13:35:14 | 显示全部楼层
pandasp1213 发表于 2017-5-9 10:48
从你这个图上看,经纬度信息好像是没赋好,我自己简单画了下,你看看是不是有帮助。(1)
begin
  a = ad ...

太感谢你了,受益匪浅啊
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-1-31 21:57:36 | 显示全部楼层
Soaring 发表于 2017-5-9 13:35
太感谢你了,受益匪浅啊

你好,请问一下“warning:gsnMaxmize is not a valid resource in sp_tmp_contour at this time”这个是什么情况引起的那?菜鸟,急需讲解破迷。谢谢
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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