用Delphi写GrADS文件并在Linux操作系统下调用


任务描述:将高空报文的各层温度(已解码)用Delphi写成GrADS格式的dat和ctl文件,并将这些文件传输到Linux操作系统下调用,在Linux下绘制Arem预报结果时,添加实况用于比较预报和实况结果。

难点:用Delphi写GrADS文件

Delphi写GrADS文件的代码:

//写Dat文件(Data的数据格式是Single)
strTemp:=ExtractFileName(strFileName);
fn:=ExtractFilePath(strFileName)+strTemp+'.dat';
fnCtl:=ExtractFilePath(strFileName)+strTemp+'.ctl';
assignfile(fdat, fn);
rewrite(fdat, 1);
for i:=Low(Data) to High(data) do begin
blockwrite(fdat, Data[i].T, SizeOf(Data[i].T));
end;
closefile(fdat);

//写控制文件
AssignFile(ftxt,fnctl);
Rewrite(ftxt);

write(ftxt, 'dset ^'+ExtractFileName(fn)+chr(10)); //直接用writeln的话,在Linux下会出错
write(ftxt, 'title real data'+chr(10));
write(ftxt, 'options little_endian'+chr(10));
write(ftxt, 'undef -9999.9'+chr(10));
write(ftxt, 'xdef 1 linear 1 1'+chr(10));
write(ftxt, 'ydef 1 linear 1 1'+chr(10));
write(ftxt, 'zdef '+inttostr(length(Data))+' levels '+chr(10));
strTemp:=' ';
for i:=0 to Length(Data)-1 do begin
strTemp:=strTemp+Floattostr(Data[i].H)+' ';
end;
Write(ftxt,strTemp+chr(10));
Write(ftxt, 'tdef 1 linear 12z12JAN2008 1hr'+chr(10));
Write(ftxt,'vars 1'+chr(10));
Write(ftxt,'T '+inttostr(length(Data))+' 0 Temperature'+chr(10));
Write(ftxt,'endvars'+chr(10));
CloseFile(ftxt);


对Linux下gs脚本的修改:

需要注意的是,GrADS下,可以使用不同文件的变量,但是,x,y,z,t这些量是公用的,如果两个文件的维数不一样,就需要对实况的维进行设置,而设置完成后,需要恢复预报场的维数设置。这里,Z维固定,如果设置不同,这绘制出来的图有位置偏移。

***************************
'set lev 950 200' Z维不变

'set vpage 0 11 0 8.5'
'set parea 0.7 3.7 4.3 8 '
'set lon 'cslon
'set lat 'cslat
'set xaxis -50 10 10'
'set yaxis 950 200 100' 设置刻度,运行时会报警,没关系
'd t-273.15'
'draw title cs hh cz 'strymdh

if ((substr(strymdh,9,2)='00' | substr(strymdh,9,2)='12'))
'open /home/disk3a/yaotest/frost/HFile/s57679'strymdh'.ctl'
'set dfile 2'
'set x 1'
'set y 1'
'set t 1' 根据实况文件设置各维
'set xaxis -50 10 10'
'set yaxis 950 200 100'
'd t'
'close 2'
'set dfile 1'
'set t 't0Backup 恢复时间维的设置,而x,y维则在后面会再次设置,所以这里不需要恢复。
endif

'set vpage 0 11 0 8.5'
'set parea 4.1 7.1 4.3 8 '
'set lon 'hhlon
'set lat 'hhlat
'set xaxis -50 10 10'
'set yaxis 950 200 100'
'd t-273.15'

if ((substr(strymdh,9,2)='00' | substr(strymdh,9,2)='12')) Lasg编的中文手册没有逻辑语法的说明,在GrADS官方的英文版说明里有
'open /home/disk3a/yaotest/frost/HFile/s57749'strymdh'.ctl'
'set dfile 2'
'set x 1'
'set y 1'
'set t 1'
'set xaxis -50 10 10'
'set yaxis 950 200 100'
'd t'
'close 2' 关闭文件2
'set dfile 1'
'set t 't0Backup 恢复时间维
endif

相关内容