爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 80170|回复: 81

[源代码] NOAA全球sst海温资料.nc格式转化.grd或.txt步骤

  [复制链接]

新浪微博达人勋

发表于 2014-4-11 11:35:54 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬日的阳光 于 2014-4-24 21:48 编辑

NOAA全球sst海温资料.nc格式转化.grd或.txt步骤
                                                                                                   By@冬日的阳光

   以下内容主要是为基础比较薄弱的本科毕业生写的,内容也比较混乱,本人刚刚加入论坛属于菜鸟级别,希望各位大神包涵,谅解


主要内容介绍:
         近来很多师弟在做本科毕业论文的时候经常问到如何将nc文件数据读取出来,然后转换成十进制文件。这个问题其实不太难,但是需要大家有基本的grads语法知识和fortran语法知识,然后修改下面的程序就行了,基本原理是一样的,也许有些人处理的是海温资料,有些人处理的高度场,还有些人处理的是风场资料,这么多我就不一一论述了,下面我就以全球海温数据从.nc转化为.grd二进制格式为例,然后将grd二进制格式文件通过fortran程序转换成为十进制的txt文件,如下在数据转换过程中遇到作图不对称不符合常理或者数据缺测值不对的问题可以参考另一篇博文《NOAA全球sst资料.nc格式转化.grd或.txt问题解决方法》http://bbs.06climate.com/forum.php?mod=viewthread&tid=21430&extra=
第一步:.nc格式转化为.grd格式
1、首先是下载到自己所需要的资料:我下载的是月海温距平:sst.mon.anom.nc
1.jpg

新建一个gs文件,然后run一下就行了,详细命令如下:
gs程序:
*本程序提取(1951年-2012年)1月nc格式的全球海温距平值
'reinit'
'sdfopen C:\eof_sst_lijianping\data\sst.mon.anom.nc'
'set gxout fwrite'
'set fwrite C:\eof_sst_lijianping\data\sst1.grd'
tt=1151
t=1
while(t<=62)
'set t 'tt+2
*选取冬季1月份的海温距平值
'set x 1 72'
'set y 1 36'
*这个必须设定,x方向的格点数;
*这个必须设定,y方向的格点数;
'd sst'
t=t+1
tt=tt+12
endwhile
'disable fwrite'
;


        该命令可以根据个人需求修改,有些人只需要某一个月的数据,那就可以不用while循环过程了,有语法不懂的要自己加班修炼了,通过读懂别人的程序,然后再做修改。如果完成了以上步骤,run一下gs文件成功,也许你就会生成了grd格式文件:
01.jpg


第二步:如果生成了grd二进制文件,需要数据进一步处理,也许需要用到fortran程序了,下面命令时将数据转化成为十进制.txt文件


fortran程序如下:

! 在学习过程中我们必须引导自己养成良好的编程习惯,注意注释,注意格式!
!!!!!!!!!!!这是一个分别读取每一个格点数值,然后求平均的程序!!!!!!!
! m 纬向个点数72个与经向格点数36个,即:某一个时次全球共72*36=2592个格点;
! n 代表样本大小,也就是样本总年份;
!--------------------------------------------------------------------
   program main
   integer i,j,m,n
   parameter(m=2592,n=62)
   real  sst1(m,n),sst(m,n)
!--------------------------------------------------------------------
!读取1951—2012年冬季(12—2月)全球海表温度各月的距平值
    open(2,file='sst1.grd',form='binary')

             read(2) ((sst1(i,j),i=1,m),j=1,n)

    close(2)
!--------------------------------------------------------------------

!--------------------------------------------------------------------
!do循环求1951—2012年冬季距平值,外循环是样本数,内循环是格点数;

!然后将所求的冬季距平值输出到一个二进制格式和txt格式;

!总体而言数据是按照自南向北,自东向西的排列,同时按年份        

!注意:对于二进制格式文件,write(14)命令不能加*要求输出格式,即:write(14,*)会出现错误!

!注意:对于文本格式的文件,此处要求输出格式,即:write(15,*)要加'*'。

!--------------------------------------------------------------------
    open(4,file='sst.grd',form='binary')
    open(5,file='sst.txt')

      do j=1,n
         do i=1,m

             sst(i,j)=sst1(i,j)
                                   
                  write(*,*) 1950+j,"年冬季(12-2月)第",i,"个格点的海表温度值:",sst(i,j)                           
                 write(4)   sst(i,j)           
                 write(5,*) sst(i,j)   
                        
          enddo
      enddo

    close(4)
    close(5)
!--------------------------------------------------------------------

print*,'Hello,you do a good job !'

end program


在程序运行过程中最后将grd文件和f90程序放在同一目录下,以防处理路径错误;
02.jpg
如果能够将以上程序代码调试修改并且运行成功,并且生成如下sst.txt文件;
04.jpg

恭喜你,说明你的数据转化处理过程圆满完成了。


评分

参与人数 3金钱 +25 贡献 +6 收起 理由
chanhz + 2 很给力!
river + 8 + 1
mofangbao + 15 + 5

查看全部评分

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

新浪微博达人勋

发表于 2015-1-10 11:21:40 | 显示全部楼层
我想问一下那个tt=1151是怎么来的?'set x 1 72'  'set y 1 36',有特别要求吗?刚开始学,好多不懂,求指教~
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2014-4-20 17:25:26 | 显示全部楼层
楼主,麻烦问下,你那个TT代表的是什么呀?
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

0
早起挑战累计收入
发表于 2014-4-11 11:40:53 | 显示全部楼层
鼓励原创分享 谢谢  
如果是转载,请注明来源
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-4-11 12:36:35 | 显示全部楼层
太感谢了
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2014-4-11 14:20:32 | 显示全部楼层
谢谢分享。收下。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-4-11 14:38:35 | 显示全部楼层
{:soso_e179:}{:soso_e179:}
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-4-11 14:49:59 | 显示全部楼层
挺好的,基本知识掌握的不错,希望后来人都能向你学习。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-4-11 15:38:57 | 显示全部楼层
我知道你是谁~~ 师兄居然这里也发贴!感谢~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-4-13 00:09:39 | 显示全部楼层
chanhz 发表于 2014-4-11 15:38
我知道你是谁~~ 师兄居然这里也发贴!感谢~

你知道我是谁?我是这里的一员,当然是献出自己的力量了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-4-13 08:28:53 | 显示全部楼层
学习了!!!!!!!!!!!
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2014-4-13 17:08:10 | 显示全部楼层
谢谢楼主分享,很有用,收藏了
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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