GrADS站点文件作图详细解决方案
- 格式:pdf
- 大小:1.35 MB
- 文档页数:20
以下技巧总结都是笔者从学习实践过程中总结出来的,基本的问题。
不求全面,希望对读者学习有用,如果有问题,敬请留言指正,以促进交流学习!1、软件综述:grads软件是一款绘图软件除了绘制图形,还可以提取数据,主要应用是在大气科学中,当然只要是数据处理成grads能够读取的数据文件就可以进行相关绘图。
软件版本问题,软件本身不是很大,我接触到1.8、1.9、2.0版本的,1.8版本的安装很多情况还要修改环境变量、1.9版本的不识别‘sdfopen’命令,最稳定的版本是2.0版本,所以笔者推荐学习者安装2.0版本,选择默认安装路径就可以。
2、文件类型简述:grads处理的是网格数据,可以处理的数据类型有:grd、grib、nc(海洋常用的数据),cdf(雷达卫星数据),其中nc、cdf数据都是自带描述文件,不需要ctl,grib数据要通过命令生成ctl、index数据才可以调用,常用的是grd数据,需要ctl。
3、数据文件转换:grads软件识别的数据是二进制无格式数据,文件类型是‘binary’,写入和生成时是不需要格式的如read(20) sst(i,j,iz,it),20为文件号,通常是十进制数据与grd数据间转换,这里给一个grd转换成txt数据的fortran程序:parameter(nx=56,ny=41,nz=1,nt=360)dimension sst(nx,ny,nz,nt)real sstopen(15,file='sst.grd',form='binary') !固定的用form=‘binary’就是二进制数据open(16,file='sst.txt') !新建txt文件do it=1,ntdo iz=1,nzread(15) ((sst(i,j,iz,it),i=1,nx),j=1,ny) !read后只有文件号,数据是无格式的enddoenddodo it=1,ntdo iz=1,nzwrite(16,*) ((sst(i,j,iz,it),i=1,nx),j=1,ny) !输出时是txt文件可直接看的数据,有格式输出,有*enddoenddoclose(15)close(16)end写程序时:注意格点数要与数据对应,如:上程序对应的数据是经度90~200,纬度-20~60,时间:1971.01~2000.12共360个月的海面温度数据,数据格点精度2*2 ,nx=(200-90)/2+1,ny=(60-(-20))/2+1,nt=360,nz=1,大气的数据要根据数据的层次确定几层。
GrADS绘图软件实用手册2002年1月目录第一章 GrADS绘图软件概述1.GrADS绘图软件简介2.Internet上的GrADS资源2.1GrADS在Internet上的主页2.2 windows环境下GrADS资源3.GrADS绘图软件的安装(windows环境)3.1在windows环境下安装GrADS软件包3.2X server 的安装第二章 GrADS绘图模板1.GrADS示例演示1.1 启动GrADS1.2 退出GrADS1.3 示例演示GrADS命令的使用2.GrADS绘图模板3.GrADS模板的高级应用3.1GrADS描述语言3.2GrADS高级模板的应用第三章 GrADS数据格式1.格点数据描述文件1.1 数据描述文件各项解释1.2 生成model.le.dat和model.le.ctl文件的程序代码片段2.站点数据的格式附录1.如何精确控制图形输出的尺寸—Landscape纸型2.台站资料的显示3.Linux环境下的安装第一章 GrADS绘图软件概述1GrADS绘图软件简介The Grid Analysis and Display System(GrADS) 是一套应用广泛、使用方便的科学数据绘图软件包。
其主要特点:z GrADS属于自由软件,可以从Internet上免费获得。
z可运行于各种Windows 和Unix工作平台。
z GrADS可用于4D数据的分析。
既经度、纬度、层(气压层、高度层等)和时间/xyzt 4维。
数据可以是格点化的数据或离散点数据。
GrADS特别适用于气象类数据的分析。
但也完全可以用于更广泛类型的数据分析。
z GrADS有多种显示方式:等值线、流线、矢量图、风矢量图、站点填图、折线图、直方图等多种两维图形。
z可处理多种数据格式的数据。
GRIB、NetCDF、HDF-SDS等通用数据格式和系统自定义的一种二进制数据格式。
z采用命令行输入的方式交互式地显示图形。
Grads站点资料的多层次绘图看了很多关于如何使用grads和fortran转换站点资料的帖子,大多数都集中在地面或者单层的,对于高空的多个层次很少有提到,而且大多数有些模糊,不好理解,我把自己做的一些整理传上来,供大家参考参考。
欢迎大家指出理解和程序的错误。
一,首先是数据的说明选用micaps高空观测资料850hpa,700hpa,600 hpa,500hpa,200hpa,100 hpa 六个层次作为例子。
为了方便,时间层次就选择1个时间。
micaps高空观测资料的说明如下:diamond 2 10年07月28日20时200百帕高空观测10 07 28 20 200 419因此定义mt=419,nz=4数据每行的排列分别是:站号,经度,纬度,高度……..具体详见micaps 的使用手册,这里不再赘述。
根据这些定义变量。
二,fortran读取站点资料注:1.根据micaps的高空资料定义相应的变量,由于850-100这6个层次的站点是相同的,站号,经纬度等只需定义成一维的,如lat(mt),而lev(nz)表示有6个层次,也为一维;高度场等又有mt个站的资料又有nz个层次,因此定义为2维的。
2.由于micaps资料分别在不同的文件内,文件名重复,我修改为100_2820,200_2820,500_2820…….然后使用trim函数顺序读取资料。
3.为了更好的说明地面和高空资料的读取,将地形高度high(mt)设置为地面的量,nlev定义为7,即高空六层,地面一层4.以输出地面一个变量,高空三个变量为例。
先进行站点的循环,再进行高空层次的循环。
5.前面我们定义了lev(nz),现在给lev(nz)赋值,使用select case.,分别赋值为850,700,600,500,200,100。
在使用是发现如果不进行赋值,后续工作也无法进行,会出现错误。
程序如下:program stationparameter (mt=419,nz=6) ! mt 总站数,nz总层次character stid(mt)*8integer flag,nlevreal lat(mt),lon(mt),tim,high(mt),number(mt),lev(nz) realheight(mt,nz),temp(mt,nz),ttd(mt,nz),ud(mt,nz),us(mt,nz),u(mt,nz),v(m t,nz),td(mt,nz)!顺序读取资料character stationfile(6)*8data stationfile/'850','700','600','500','200','100'/do k=1,nzopen(k,file=''//trim(stationfile(k))//'_2820.000')read(k,*)read(k,*)!跳过micaps开头两行的说明文字do i=1,mtread(k,*)stid(i),lon(i),lat(i),high(i),number(i),height(i,k),temp(i,k ),ttd(i,k),ud(i,k),us(i,k)end doend do !结束k的循环tim=0.0flag=1nlev=7 !高空+地面open(40,file='20.grd',form='binary')do i=1,mt !站点循环write(40)stid(i),lat(i),lon(i),tim,nlev,flag,high(i)do k=1,nz !高空循环!对lev(nz)进行赋值select case(k)case(1)lev(k)=850.0case(2)lev(k)=700.0case(3)lev(k)=600.0case(4)lev(k)=500.0case(5)lev(k)=200.0case defaultlev(k)=100.0end select!在lev(k)后将要输出的所有高空变量一次性输出write(40)lev(k),height(i,k),temp(i,k),ttd(i,k)end doend donlev=0write(40)stid(mt-1),lat(mt-1),lon(mt-1),tim,nlev,flag close(40)end三,ctl及map文件的生成注:看到相关帖子说在站点资料的ctl文件中也要设置zdef,我试了下,设置和不设置都是可以的Ctl文件如下:dset f:\20.grddtype stationstnmap f:\20.mapundef 9999.0title 20zdef 6 levels 850 700 600 500 200 100tdef 1 linear 28jul2010 1DYvars 4high 0 99 Terrain Heighth 6 99 heightt 6 99 temperaturettd 6 99 ttdendvarsCtl文件编写完成后,就可以在grads中生成map文件了,相关命令如下:! stnmap -i f:/20.ctl注意,斜杠一定是“/”,方向不能反第三步结束后,站点资料的读取就结束了,可以通过grads打开Ctl文件看到相关站点的值了。
Fortran+GrADS站点作图详解mofangbao@气象家园帖子导读:以前论坛也有过相关的帖子,但是到目前为止,仍然不断的有朋友看了那些帖子之后还是不知道如何下手,于是我打算为纯粹的新手写一份说明,这份文档会非常详细,因此适合刚接触GrADS的朋友来参考。
帖子介绍了fortran文件中读写数据的基本知识,grads的站点文件的存放格式,如何通过fortran来写出这个格式的文件,如何建立站点文件的CTL文件,如何为站点数据生成映射文件,站点映射文件的作用,如何通过站点CTL文件来预览站点数据,如何用fortran生成grads支持的格点文件,如何给格点配置CTL文件,如何编写GS文件来进行插值,如何绘制等值线以及阴影图,如何屏蔽区域外的图形等内容。
如果你对以上问题存在疑惑,希望这个帖子能够对你有所帮助,因此,看完这份文档之后,您应该可以做到这些:(会的就跳过吧,我也是犹豫了很久要不要写的,算是新手礼包的一部分吧)开始之前,先了解站点数据的基本内容一般情况下,我们看到的站点数据是这样的:50353 126.39 51.43 100 8950632 121.55 48.46 100 5450527 119.45 49.13 100 2950434 121.41 50.29 100 4650557 125.14 49.10 100 8350745 123.55 47.23 100 8050756 126.58 47.26 100 7450788 131.59 47.14 100 3650873 130.17 46.49 100 3150978 130.57 45.17 100 59第一列为站号,第二、三列为经纬度,第四、五列为其他数据。
当然,也可能是把经纬度单独存放,然后数据单独存放,比如气候中心免费开放的160站的月平均温度降水值。
如果是micaps资料可以查看micaps用户手册。
这个例子中使用的就是micaps的第三类数据格式,示例文件可以从这里下载:(资料下载)除了了解这些,还必须了解该数据的缺测值用什么来表示,这个在后面的数据描述文件中要用到。
1、在fortran中读入这些资料在使用fortran之前,请确保你已经安装了fortran编译器,如果你是xp系统,建议安装CFV6,如果是win7系统,那么可以安装microsoft fortran powerstation4.0(以下简称4.0),这两个软件在气象资料站均有下载,安装完成后,请在你磁盘的某个文件夹下面新建一个文件夹用于本次作图,如果使用的是CVF6,该文件夹的路径中不要包含中文名。
新建文件夹完成后,从开始菜单打开fortran编程窗口,然后点击file->new,新建一个free format的自由格式fortran文件,4.0的直接建立一个TextFile即可:CVF中新建fortran文件4.0中新建TextFile即可注意:CVF中先选路径和文件名,然后会建立该文件,4.0中直接建立一个临时文件,当你按保存按钮时才会提示你选择保存的路径,如果你之前用4.0的fortran 编译过其他文件,那么请先关闭工作区再新建,从file->close workspace可以关闭。
当然也可以直接建立一个文本文件,然后重命名为sta2grd.f90,记住,要修改后缀为.f90,表示该文件为自由格式的fortran源文件。
现在就可以开始着手读取数据了。
(1)先把fortran的开头和结尾写了,并且用implicit none声明不能使用未定义的变量,同时添加一个注释,自由格式中可以用一个英文的!来表示该行该符号往后均为注释内容,不参与编译:Program sta2grdImplicit none!这里是程序的变量声明!变量声明结束!程序开始!程序结束End(2)定义几个变量Fortran中常用的变量类型有整型:integer,单精度实型real,双精度实型double,字符型character,关于fortran变量的更多内容请参考彭国伦的fortran95程序设计。
通过观察我们要读取的文件:diamond 3 2011年05月降水量值0 0 0 0 0 0 1 0 0 1 100050353 126.39 51.43 100 8950632 121.55 48.46 100 54…第一行和第二行对我们转换没有什么作用,因此我们只需要定义必须要用到的变量,站号stid,类型为字符型,长度为8,其余的经度lon、纬度lat,一个无意义的变量(列中的100)var和降水数据rain,均为实型,原因在下面的GrADS中的存放方式有说明。
Character*8 stidReal lon,lat,var, rain(3)打开数据文件并读入数据Fortran中使用open语句来实现打开文件,同时指定一个打开的文件号和文件路径,以及其他一些指定参数,下面的语句即可打开这次示例的文件:Open(1,file=’raindata.txt’,status=’old’)这里的1是一个文件号,是读写时需要用到的,file后的是文件名,直接写文件名表示在和程序同一个文件夹,status表示当前文件的状态,old表示该文件已经存在,这样就能避免通过write语句误写入数据覆盖了数据文件。
(4)开始读入数据到变量中在fortran中使用read语句来读入数据,每读取一行文件的指针就会自动向下移动一行(关于文件指针指向这一行你可以想象成该行被选中,要从该行读取数据了)比如read(1,*)var,就表示从打开的1号文件中按默认格式读取数据到var中。
我们先跳过两行“没用”的数据:Read(1,*)Read(1,*)这样后面不接任何变量就表示把这两行跳过去了,现在文件指针在第三行的开头了,也就是我们需要的数据了,来读一行:Read(1,*)stid,lon,lat,var,rainFortran 会自动把这五个数值分别给后面的五个变量了,现在文件的指针已经在第四行的开头了,我们需要继续读取数据,当然不能够又写一行,应该继续使用上面这一行来读取,可以通过goto语句实现,goto语句的含义是让程序跳转到指定的标号执行,这里就应该是去刚才的那个语句执行,所以在刚才的Read(1,*)stid,lon,lat,var,rain 前面加上一个标号10,然后在下面写上一句goto 10,如下所示:10 Read(1,*)stid,lon,lat,var,rainGoto 10这样,程序就会不断的往下读取了,但是,文件的行数是有限的,这样做一旦到文件结束,fortran就会报出运行时错误,通常是end-of-file…的错误,这时候可以通过END标签来避免这种情况的出现。
End标签能够让read语句读取到文件末尾的时候自动跳转到指定的标号去执行,再次修改这个读取的语句:10 Read(1,*,end=100)stid,lon,lat,var,rainGoto 10100 contine这样,当文件读取结束时,就会到100 continue来执行了,continue的意思就是接着按顺序往下执行,本身没有什么含义。
我们现在只是读取数据,没有对数据进行任何输出和处理,读取完毕后应该及时关闭这个文件,使用close方法即可。
在100 continue的下面加上close(1),1同样是open里的那个文件号。
这段程序就完成了这个示例文件的读取,每读取一次,上面几个变量的值就会被刷新一次,如果需要验证读取是否正确,可以在标号为10的read语句和goto 10之前加上一个输出到屏幕的命令,然后用pause命令暂停执行,以便检查:10 Read(1,*,end=100)stid,lon,lat,var,rainPrint*,stid,lon,lat,var,rainpauseGoto 10现在,这段程序应该是这样子的:Program sta2grdImplicit none!这里是程序的变量声明Character*8 stidReal lon,lat,var, rain!变量声明结束!程序开始Open(1,file=’raindata.txt’,status=’old’)read(1,*)read(1,*)10 Read(1,*,end=100)stid,lon,lat,var,rainPrint*,stid,lon,lat,var,rainpauseGoto 10100 continueClose(1)!程序结束End这时候就可以编译运行一下了,4.0中点击窗口中左上角的build按钮(shift+f8),弹出的对话框中选择是,然后下面的消息窗口会提示:sta2grd.exe - 0 error(s), 0 warning(s),表示编译通过了,可以开始执行了,选择build菜单的Execute sta2grd.exe,就可以开始执行了;CVF中直接点击红色的感叹号左侧有两个朝下箭头的按钮编译,无错后点击红色感叹号可以执行,每行输出后都会暂停,等按下回车后会继续读取下一行并暂停,经过对比,发现读取成功,然后删除用于测试的print*和pause语句:4.0中的编译2、按照GrADS的规定将数据进行输出接下来所增加的语句都在10号语句和goto 10语句之间,因为这时候几个变量的值是刚刚从文件中读出来,所以要及时把他们写出去。
在输出为GrADS可用格式之前,必须先了解GrADS中的站点数据是如何存放的,只有知道GrADS中规定的存放格式,才能够明白输出时该如何写。
GrADS中的站点数据也是二进制格式,并且按照时间来分组,(本例子中仅有一个时次,多时次的相信你看完后也会写出来了),每个时次下面包括了N个站该时次的数据,每个站的信息由一个表示该站的文件头信息以及数据值组成,每个时次结束后写入一个特殊的标记表示这个时次结束,文件头信息结构如下:struct reportheader {char id[8]; /* 站号 */float lat; /* 纬度*/float lon; /* 经度 */float t; /* 相对于该时次的相对单位值 */int nlev; /* 总层次 */int flag; /* 表示有无高空资料 */};上面的定义是C语言中的定义,转换到fortran中就是我们开始定义的几个变量,但是还没有定义t(避免和总时次混淆,定义为tim)、nlev和flag,所以先去上面的定义变量的地方补上这上个变量,把real那一行改为:real lon,lat,var, rain,tim ,在real行下面增加一行:integer nlev,flag。