爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 1726|回复: 5

沙尘模式地球坐标系三维动图

[复制链接]

新浪微博达人勋

发表于 2023-4-11 09:09:52 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 MeteoInfo 于 2023-4-11 09:46 编辑

今年沙尘暴目前发生比较频繁,很多沙尘暴模式能够比较好地模拟预报沙尘浓度的时空变化,这里利用中国气象局的沙尘暴模式 CUACE/Dust 预报结果绘制一个地球坐标系中的三维动图。在MeteoInfoLab中,axes3d(projection='earth') 创建一个三维地球坐标系,缺省绘制一个偏暗色的地形纹理图像,可以加上 image 参数指定地球表面的纹理图像(在MeteoInfo的map文件夹中有几个jpg文件可用)。模式预报结果是一个netCDF文件,读取沙尘浓度和风场U/V分量的三维数组。沙尘浓度可以用等值面(isosurface)来表示,这里用了两个浓度:100微克每立方米和500微克每立方米,高浓度用更深的颜色和更小的透明度可以展示出浓度的层次。风场用streamslice函数绘制850 hPa风场的流线图,geoshow函数绘制地图行政界线。

单个时次的示例脚本程序如下:

  1. #Set date
  2. sdate = datetime.datetime(2023, 4, 9, 0)

  3. #Set directory
  4. datadir = r'V:Asian-dustmodelCMA'
  5. datadir = os.path.join(datadir, sdate.strftime('%Y%m%d'))
  6. #datadir = r'D:Tempcuace‚21212'

  7. #Read data
  8. fn = os.path.join(datadir, 'CUACE-DUST_CMA_{}.nc'.format(sdate.strftime('%Y%m%d%H')))
  9. f = addfile(fn)
  10. st = f.gettime(0)
  11. t = 3
  12. dust = f['CONC_DUST'][t]
  13. u = f['U'][t]
  14. v = f['V'][t]
  15. speed = sqrt(u*u + v*v)
  16. levels = dust.dimvalue(0)
  17. #dust[dust<5] = 0
  18. height = meteolib.pressure_to_height_std(levels)
  19. height = height / 10
  20. lat = dust.dimvalue(1)
  21. lon = dust.dimvalue(2)

  22. #Plot
  23. ax = axes3d(projection='earth', image='shadedrelief.jpg')
  24. lighting(True)
  25. ax.set_rotation(160)
  26. ax.set_elevation(-50)
  27. ax.set_head(0)
  28. ax.set_pitch(-61.5)

  29. geoshow('cn_province', edgecolor='gray', lighting=False)
  30. geoshow('country', edgecolor='gray', lighting=False)
  31. #Beijing location
  32. plot3([116.39,116.39], [39.91,39.91], [0,1200], color='w', lighting=False)
  33. #ax.add_zaxis(116.39, 39.91)
  34. #streamslice
  35. ss = slice(None, None, 4)
  36. levs = arange(2, 20, 2)
  37. hidx = 4    # 850hPa
  38. #hidx = 11   # 500hPa
  39. gss = streamslice(lon[ss], lat[ss], height, u[:,ss,ss], v[:,ss,ss], u[:,ss,ss],
  40.     speed[:,ss,ss], levs=levs, zslice=[height[hidx]], interval=10)
  41. colorbar(gss[0], aspect=30, tickcolor='w', xshift=150, label='m/s')
  42. #isosurface
  43. isosurface(lon, lat, height, dust, 500, facecolor='r', edgecolor=None,
  44.     alpha=0.6, nthread=4)
  45. isosurface(lon, lat, height, dust, 100, facecolor=[255,180,0],
  46.     edgecolor=None, alpha=0.4, nthread=4)

  47. v = 1200
  48. axis([-v,v,-v,v,-v,v])

  49. tt = st + datetime.timedelta(hours=t*3)
  50. title('Dust concentration higher than 100/500 ug/m3 ({}UTC)'.format(tt.strftime('%Y-%m-%d %H:00')),
  51.     color='w')
  52. #savefig('D:/Temp/test/dust_3d_{}.png'.format(tt.strftime('%Y%m%d%H')), dpi=150)

earth_sds_4.png

读取多个时次的数据可以绘制时间动画 gif 图,主要用到 gifanimation, gifaddframe 等函数。

  1. #Set date
  2. sdate = datetime.datetime(2023, 4, 9, 0)

  3. #Set directory
  4. datadir = r'V:Asian-dustmodelCMA'
  5. datadir = os.path.join(datadir, sdate.strftime('%Y%m%d'))
  6. outdir = 'V:/Asian-dust/figures'
  7. outdir = os.path.join(outdir, 'CMA', sdate.strftime('%Y%m%d'))
  8. if not os.path.exists(outdir):
  9.     os.makedirs(outdir)

  10. #Read data
  11. fn = os.path.join(datadir, 'CUACE-DUST_CMA_{}.nc'.format(sdate.strftime('%Y%m%d%H')))
  12. f = addfile(fn)
  13. st = f.gettime(0)
  14. t = 10
  15. dust = f['CONC_DUST'][t]
  16. levels = dust.dimvalue(0)
  17. #dust[dust<5] = 0
  18. height = meteolib.pressure_to_height_std(levels)
  19. height = height / 10
  20. lat = dust.dimvalue(1)
  21. lon = dust.dimvalue(2)

  22. #Plot
  23. ax = axes3d(projection='earth', image='shadedrelief.jpg')
  24. lighting(True)
  25. ax.set_rotation(160)
  26. ax.set_elevation(-50)
  27. ax.set_head(0)
  28. ax.set_pitch(-61.5)

  29. geoshow('cn_province', edgecolor='gray', lighting=False)
  30. geoshow('country', edgecolor='gray', lighting=False)
  31. #Beijing location
  32. plot3([116.39,116.39], [39.91,39.91], [0,1200], color='w', lighting=False)
  33. #streamslice
  34. ss = slice(None, None, 4)
  35. levs = arange(2, 20, 2)

  36. #Loop
  37. giffn = os.path.join(outdir, 'Dust_3d_isosurface_relief_{}--loop_1.gif'.format(st.strftime('%Y%m%d%H')))
  38. print giffn
  39. animation = gifanimation(giffn)
  40. tn = f.timenum()
  41. tn = 24
  42. for t in range(1, tn):
  43.     print(t)
  44.     if t > 1:
  45.         cll()
  46.         cll()
  47.         cll()

  48.     dust = f['CONC_DUST'][t]
  49.     u = f['U'][t]
  50.     v = f['V'][t]
  51.     speed = sqrt(u*u + v*v)

  52.     gss = streamslice(lon[ss], lat[ss], height, u[:,ss,ss], v[:,ss,ss], u[:,ss,ss],
  53.         speed[:,ss,ss], levs=levs, zslice=[height[4]], interval=10)
  54.     colorbar(gss[0], aspect=30, tickcolor='w', xshift=135, label='m/s')
  55.     #isosurface
  56.     isosurface(lon, lat, height, dust, 500, facecolor='r', edgecolor=None,
  57.         alpha=0.6, nthread=4)
  58.     isosurface(lon, lat, height, dust, 100, facecolor=[255,180,0],
  59.         edgecolor=None, alpha=0.4, nthread=4)

  60.     vv = 1200
  61.     axis([-vv,vv,-vv,vv,-vv,vv])

  62.     tt = f.gettime(t)
  63.     title('Dust concentration higher than 100/500 ug/m3 ({}UTC)'.format(tt.strftime('%Y-%m-%d %H:00')),
  64.         color='w')
  65.     #Add frame to gif animation
  66.     gifaddframe(animation, width=1095, height=647)

  67. #Finish gif animation
  68. animation.finish()
  69. print 'Finished...'


动画图效果如下:

https://i0.hdslb.com/bfs/article/daf0448192b0394a9c9e766143c68f8bf9b6f036.gif@942w_558h_progressive.webp

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

新浪微博达人勋

发表于 2023-4-26 20:11:10 | 显示全部楼层
数据在哪里可以下载呢请问
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2023-4-27 16:54:08 | 显示全部楼层
网哇哇哇哇 发表于 2023-4-26 20:11
数据在哪里可以下载呢请问

可以用这个文件做测试:WMO_SDS-WAS_Asian_Center_Model_Forecasting_CUACE-DUST_CMA_2019041500.nc (http://www.meteothink.org/downloads/data.html
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2023-5-25 15:28:53 | 显示全部楼层
MeteoInfo 发表于 2023-4-27 16:54
可以用这个文件做测试:WMO_SDS-WAS_Asian_Center_Model_Forecasting_CUACE-DUST_CMA_2019041500.nc (ht ...

王老师您好,测试数据我看是19年4月15-18日的,要想获得其他时段的数据去哪里下载呢?比如今年的,谢谢
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2023-5-25 16:40:35 | 显示全部楼层
xrpamhf 发表于 2023-5-25 15:28
王老师您好,测试数据我看是19年4月15-18日的,要想获得其他时段的数据去哪里下载呢?比如今年的,谢谢

这是内部数据,没有公开下载渠道。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2023-5-25 17:17:01 | 显示全部楼层
MeteoInfo 发表于 2023-5-25 16:40
这是内部数据,没有公开下载渠道。

好的 谢谢王老师
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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