爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 372318|回复: 484

[分享资料] 【兰溪金盆洗手帖】将GrADS读取的数据写到ASCII文件(txt等)

  [复制链接]

新浪微博达人勋

 成长值: 19710
发表于 2011-11-26 02:03:33 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 兰溪之水 于 2013-9-22 21:46 编辑

grads2ascii第二版
【修改了中文用法部分】grads2ascii 修订版

兰溪闭关了一个星期还是没有什么大的进展啊,最近老师都在催了,兰溪压力大大啊,都是因为放不下论坛啊@版主 @超级版主 @管理员 凭这句话都应该加分吧!!!但老师始终是老师啊,所以兰溪只能来个【金盆洗手】帖啦!!!
废话少说了,直接上帖吧:
       将GrADS读取的数据写到ASCII文件(txt等)
  1. *==========================================================
  2. *-------*--------*--------*-------*--------*------
  3. * 函数说明:
  4. * grads2ascii 函数用于把GrADS读进来的数据输出到ASCII文件,
  5. * 如.txt, .csv等.
  6. *--------------------*-------------------*-----------
  7. * 使用方法:
  8. * ①使用前将 grads2ascii.gs  1.9版本GrADS放到安装目录的lib目录下,2.0版本放到*  OpenGrADS\Contents\Resources\Scripts目录下;
  9. * ②使用此函数前需用GrADS打开需要转换的数据文件;
  10. * ③用法:
  11. * grads2ascii expr filename [format numl numb [u]]
  12. * expr 要输出变量的变量名
  13. * filename 变量输出的ASCII文件路径及文件名
  14. * format 输出数据的格式,与C语言类似,默认是%g
  15. * numl 每个记录(行)输出的数据个数,默认是8
  16. * numb 每两个数据间插入的空格数,默认是1
  17. * u 输出'Undef'代替数据中的缺省值
  18. *--------------------*--------------------*------------
  19. * 编程思路:
  20. * grads2ascii 主要使用到了'set gxout print' 将产生的ASCII变量
  21. * 输出到缓存,并用临时变量temp存储起来,接着使用write函数把临时
  22. * 变量写到ASCII文件.其中使用了
  23. * 'set prnopts format numl numb <u>'
  24. * 控制变量输出的格式,用法可参照
  25. * http://www.iges.org/grads/gadoc/gradcomdsetprnopts.html
  26. *---------------------*--------------------*------------
  27. *
  28. * HUANG Yongjie(SYSU)
  29. * Nov 25 2011
  30. *
  31. *-------*--------*---------*----------*----------*------
  32. *==========================================================


  33. function grads2ascii(args)

  34. *=================
  35. * 截取变量
  36. *=================
  37. expr = subwrd(args,1)
  38. filename = subwrd(args,2)
  39. format = subwrd(args,3)
  40. numl = subwrd(args,4)
  41. numb = subwrd(args,5)
  42. u = subwrd(args,6)


  43. *=================================
  44. * 当参数为空时屏幕输出函数用法
  45. *=================================
  46. if(filename='')
  47. say ''
  48. say ' grads2ascii'
  49. say ' 将GrADS读进来的数据输出到ASCII文件,用法:'
  50. say ''
  51. say ' grads2ascii expr filename [format numl numb [u]]'
  52. say ' expr 要输出变量的变量名.'
  53. say ' filename 变量输出的ASCII文件路径及文件名.'
  54. say ' format 输出数据的格式,与C语言类似,默认是%g.'
  55. say ' numl 每个记录(行)输出的数据个数,默认是8.'
  56. say ' numb 每两个数据间插入的空格数,默认是1.'
  57. say ' u 输出'Undef'代替数据中的缺省值.'
  58. say ''
  59. say ' grads2ascii version "1.0" of Nov 25 2011 01:07:00 say ' Copyright (c) HUANG Yongjie (SYSU) ^_^'
  60. say ''
  61. return
  62. endif

  63. *===================================
  64. * 使用临时变量temp存储要输出的数据
  65. *===================================
  66. 'set gxout print'

  67. *--若数据格式参数不为空则设置输出数据格式
  68. if(format != '')
  69. 'set prnopts 'format' 'numl' 'numb' 'u''
  70. endif

  71. *---存储输出数据---
  72. 'd ' expr
  73. if (rc !=0); return -1; endif
  74. temp = result


  75. *==========================================================
  76. * 使用 sublin 获取每一行,并使用 write 写入ASCII文件中
  77. *==========================================================

  78. *--------------------------------------------------------
  79. * 第一行为:Printing Grid -- XXX Values -- Undef = XXX
  80. * 其中XXX表示数值,一般不把这行写入文件中
  81. *--------------------------------------------------------
  82. i = 1; line = sublin(temp,i)
  83. num = subwrd(line,4)
  84. undef = subwrd(line,9)

  85. *--从第二行开始把数据写入ASCII文件中--
  86. i = 2; line = sublin(temp,i)
  87. while(line !='')
  88. rc = write(filename,line)
  89. if (subwrd(rc,1) !=0); return -2; endif
  90. i = i + 1
  91. line = sublin(temp,i)
  92. endwhile

  93. *-----关闭文件------
  94. res = close(filename)
  95. if(res != 0); return -3; endif

  96. say ' 'num' Values have been written to 'filename'!'
  97. say ' Thanks to 兰溪! 兰溪哥哥亲亲!'

  98. return
复制代码
兰溪的程序已经写得很清楚怎么用的了,来个测试gs吧:
'reinit '
'sdfopen H:\test\slp.2010.nc'
'grads2ascii slp H:\test\slp.txt %8.0f 144 1'
'reinit'
;


结果如何?不要急,看看吧:
test.bmp

因为文件存在格式问题,所以我们一般用写字板打开,兰溪用Notepad++打开,上图吧:
txt.JPG

其实也就这样啦,没啥东西的啦,再上张图吧
test0.jpg

看到这里深深@言深深肯定很想要这个gs文件啦,别忘了XX哦!!!
到你们啦@超级版主 @版主 @管理员 @审核员快给分啊!!!贡献啊!!!不要被兰溪发现比妹纸少哦!!!!{:soso_e151:}

grads2ascii.gs (3.75 KB, 下载次数: 688, 售价: 2 贡献)

评分

参与人数 26威望 +22 金钱 +243 贡献 +50 积分流量 +22 收起 理由
iamyanghappy + 2
Zhuming + 2 赞一个!
SCH + 2 很给力!
Heather_Dooo + 2 很给力!
懒洋洋233 + 5 赞一个!
zhangkf_7 + 2 很给力!
yaoyao121200 + 5 很给力!
ninashanshan + 1 很给力!
carpenter3 + 2 赞一个!
vera~~ + 2 很给力!
njzqxt + 20 + 2 很给力!
winter6789 + 2 赞一个!
fgrace + 2
meehooqq + 2
dawnwinny + 2 赞一个!
qxtlyf + 5 + 2
godenflame135 + 12 + 2
传说中的谁 + 4 + 18 + 6
athlon8048 + 5 + 24 + 10 很给力!
善人/jw + 2

查看全部评分

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

新浪微博达人勋

发表于 2012-4-28 23:51:42 | 显示全部楼层

哈哈,嗯。我也发现了。用您的办法弄出结果来了!灰常感谢!
这个方法是一个文件一个文件读取的,如果想一次进行多个文件读取有什么办法呢?是不是可以在 gs 上面动动手脚?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 19710
发表于 2015-5-6 12:54:17 | 显示全部楼层
abd 发表于 2015-5-6 10:51
我那个gs文件里输出对应的内容是如下:

*确定需要取平均的区域的经纬度

哦,我知道了,你输出时间序列就带了这字符串,你可以用grads2ascii第二版循环输出,
http://bbs.06climate.com/forum.php?mod=viewthread&tid=11515

'set z 'zi
it=1
while(it<=90)
    'set t 'it
    '/home/grads2ascii.gs  aave(div.1*1e+3,lon='lonb1',lon='lonb2',lat='latb1',lat='latb2')  /home/div/a-div-'z.zi'.txt a %f '
    it = it + 1
endwhile
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

 成长值: 19710
发表于 2015-1-16 20:02:09 | 显示全部楼层
damien1987 发表于 2015-1-16 19:52
谢谢兰溪,我也遇到个问题,我是用第二版的grads2ascii读WRF后处理之后产生的ctl dat文件,ctl描述是附件这 ...

WRF不是等经纬度的,所以GrADS是经过插值,你可以把504和436都改成201,并把pdef那行注释掉,这样就可以输出201*201的等距离数据。
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2014-10-17 19:37:50 | 显示全部楼层
本帖最后由 xiaocaoqiqiao 于 2014-10-17 19:38 编辑
兰溪之水 发表于 2014-10-17 17:06
建议你去看看NetCDF的数据存储~用我的那个方法的数据是对的,我只能告诉你这么多了~
其实关于NetCDF的数 ...

我知道原因了,非常感谢你的指点。用GrADS打开nc文件时,GrADS会自动把short型数据转换为float型,换算公式为

float_value = (short_value * scale_factor) + add_offset

grads生成的txt最后一行数据 grads.png
原nc文件第一行数据 nc.png
由于nc中的lat是90到-90,grads里的lat是-90到90,所以grads生成的txt文档的最后一个值相当于nc文件的第一个值。
代入公式正好符合:207.6100=-12004*0.01+327.65


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

使用道具 举报

新浪微博达人勋

发表于 2012-4-30 12:40:33 | 显示全部楼层
浪迹天涯 发表于 2012-4-29 00:11
你是想把多个文件的变量写在同一个txt?

多个变量的话估计蛮难。如果有牛人研究那就是更好了。。。。。
我的意思是一个变量的nc文件(月或者日数据)是每1年或者每10年一个文件,需要50年的数据的话,怎么能一次把这个变量50年的nc数据读取了?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 19710
发表于 2011-11-26 02:07:07 | 显示全部楼层
沙发当然自己坐啦~@版主@超级版主@管理员

评分

参与人数 1威望 +5 金钱 +20 贡献 +10 收起 理由
Mouse + 5 + 20 + 10 好吧,我当和事佬,再追加点,免得醋劲太大.

查看全部评分

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

新浪微博达人勋

发表于 2011-11-26 08:05:20 | 显示全部楼层
必须给兰溪多多加分~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 19710
发表于 2011-11-26 08:46:59 | 显示全部楼层
Mouse 发表于 2011-11-26 08:05
必须给兰溪多多加分~

看,有付出才会有收获的嘛~

评分

参与人数 1金钱 +1 贡献 +1 收起 理由
topmad + 1 + 1 那你就再收获点吧

查看全部评分

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

新浪微博达人勋

发表于 2011-11-26 08:47:42 | 显示全部楼层
哇塞,好东西,抢
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2011-11-26 08:54:37 | 显示全部楼层
兰溪你好生猛啊  不愧是吃海鲜长大的娃娃  可惜偶看不懂的说啊

待到grads大作完成,希望有幸一阅,学习啊
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2011-11-26 09:09:08 | 显示全部楼层
满足了吧
密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2011-11-26 09:45:26 | 显示全部楼层
功能很不错,就是那个 兰溪哥哥有点2啊,哈哈哈,难道老五也发现了么

这个帖子值这么多分的,期待你的后续!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2011-11-26 11:27:15 | 显示全部楼层
兰溪之水 发表于 2011-11-26 02:07
沙发当然自己坐啦~@版主@超级版主@管理员

真是太厉害了,太帅了。羡慕ing!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 19710
发表于 2011-11-26 12:22:07 | 显示全部楼层
topmad 发表于 2011-11-26 08:54
兰溪你好生猛啊  不愧是吃海鲜长大的娃娃  可惜偶看不懂的说啊

待到grads大作完成,希望有幸一阅,学习啊 ...

这个已经完成了啊,可以用了,我好像不是GrADS里面的翻译人员哦,毫无压力~

点评

不错  发表于 2014-3-8 17:05
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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