登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
该文章来自博客:http://windforestwing.blog.163.c ... 412007103084743804/如有错误 ,大家及时指出啊!ps:meteoinfo可以直接处理grib数据
===========================
grib格式转换心得 1、wgrib的使用 在cmd命令行下键入wgrib后即可察看wgrib相关命令参数,简要介绍如下: l Inventory/diagnostic–output selections 详细目录或诊断的输出选择 -s short inventory 简短目录 -v verbose inventory 详细目录 -V diagnostic output <not inventory> 诊断输出 <none> regular inventory 一般目录 例如:wgrib E:\GrADS\Data\grib2005071500 –v>a.txt Options 相关选项 -PDS/-PDS10 print PDS in hex/decimal 十六进制或二进制绘制PDS图 -GDS/-GDS10 print GDS in hex/decimal 十六进制或二进制绘制GDS图 -verf print forecast verification time -ncep_opn/-ncep_rean default T62 NCEP grib table -4yr print year using 4 digits l Decoding GRIB selection GRIB格式解码选项 -d [record number|all] decode record number 按编号输出数据 -p [byte position] decode record at byte position 按二进制位置输出数据 -i decode controlled by stdin <inventory list> 按输入流控制编码,一般转化Grib文件都要加 <none> no decoding Options 相关选项 -text/-ieee/-grib/-bin conver to text/ieee/grib/bin 转化格式控制 -nh/-h output will have no headers/headers 是否包含标题头 -H output will include PDS and GDS <-bin/-ieee only> 输出否否包含PDS和GDS -append append to output file 在输出文件上添加而不是替换 -o [file] output file name, ‘dump’ is default 输出文件名 综合使用实例: DOS命令行下: >wgrib grib_file_name | find “:GAP:” | wgrib grib_file_name –i –nh –text –o temp linux shell命令行下: % wgrib grib_file_name | grep “:GAP:” | wgrib grib_file_name –i –nh –text –o temp 从Grib格式文件中选择GAP参数相关的数据生成名为temp的文本文件 2、 Grib文件目录说明 l wgrib –s生成目录: 1:0:d=05071500:HGT:1000 mb:anl:NAve=0 1) 记录号 2) 二进制位置 3) 时间 4) 参数名称 5) 层次值 6) analysis分析数据,也可能是fcst(forecast 预报数据) 7) 用于求平均的格点数 l wgrib –v 生成目录: 1:0:D=2005071500:HGT:1000 mb:kpds=7,100,1000:anl:"Geopotential height [gpm] 1) 记录号 2) 二进制位置 3) 时间 4) 参数名称 5) 层次值 6) kpds,第一个数字是Grib参数编号,比如PRES是1,TMP是11;第二个数字是层次类型(高度层或等压面层);第三个数字是层次值; 7) analysis分析数据,也可能是fcst(forecast 预报数据) 8) 该参数的解释及单位 l wgrib –V 生成目录: rec 1:0:date 2005071500 HGT kpds5=7 kpds6=100 kpds7=1000 levels=(3,232) grid=3 1000 mb anl: HGT=Geopotential height [gpm] timerange 10 P1 0 P2 0 TimeU 1 nx 360 ny 181 GDS grid 0 num_in_ave 0 missing 0 center 7 subcenter 0 process 82 Table 2 latlon: lat 90.000000 to -90.000000 by 1.000000 nxny 65160 long 0.000000 to -1.000000 by 1.000000, (360 x 181) scan 0 mode 128 bdsgrid 1 min/max data -631 334 num bits 14 BDS_Ref -6310 DecScale 1 BinScale 0 这个综合几种两种目录显示目前只能看明白其中一部分…… l wgrib <none> 生成目录: 1:0:d=05071500:HGT:kpds5=7:kpds6=100:kpds7=1000:TR=10:P1=0:P2=0:TimeU=1:1000 mb:anl:NAve=0 1) 记录号 2) 二进制位置 3) 时间 4) 参数名称 5) Grib参数编号,比如PRES是1,TMP是11 6) 层次类型(高度层或等压面层) 7) 层次值 8) 时间范围 9) 时间1的时段 10) 时间2的时段 11) 预报时间单位 12) 层次值 13) analysis分析数据,也可能是fcst(forecast 预报数据) 14) 用于求平均的格点数 3、 利用C程序转化Grib格式文件与读取Grib文件 C# 实例(Web平台上) /*调用Dos命令实现Grib文件到Text文件的转换*/ private void GribToText() { Process process = new Process(); process.StartInfo.FileName = "cmd.exe"; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardInput = true; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.CreateNoWindow = true; //不创建窗口 process.Start(); string command = "wgrib E:\\Projects\\AtmosData\\grib2005071500 | find \":5WAVA:\" | wgrib E:\\Projects\\AtmosData\\grib2005071500 -i -nh -text -o E:\\Projects\\AtmosData\\temp"; process.StandardInput.WriteLine(command); //调用Dos命令 process.StandardInput.WriteLine("exit"); process.WaitForExit(); string output = process.StandardOutput.ReadToEnd(); Response.Write(output); //将执行结果输出 } /*将Text文件中的Grib数据读入临时数组*/ private void ReadTextData() { StreamReader GribText = new StreamReader("E:\\Projects\\AtmosData\\temp");
string[] aryReadResult = new string[65160]; //360*181个格点数据 float[] aryData = new float[65160];
for (int i = 0; i < 1000; i++) { aryReadResult = GribText.ReadLine(); aryData = Convert.ToSingle(aryReadResult); }
GribText.Close(); } C++实例(控制台下) /*调用DOS命令将Grib文件转化为临时文本文件*/ system("wgrib E:\\Projects\\AtmosData\\grib2005071500 | find \":5WAVA:\" | wgrib E:\\Projects\\AtmosData\\grib2005071500 -i -nh -text -o E:\\Projects\\AtmosData\\temp");
/*使用文件输入输出流将text文件读入数组中*/ FILE *fp; long int i; float wava[65160] ={0}; char *path ="E:\\Projects\\AtmosData\\temp"; if((fp=fopen(path,"r")) == NULL) { printf("Can not open file!"); exit(1); } for( i=0; i<GRIBNUMBER; i++) { fscanf_s(fp,"%f",&wava); } for( i=0; i<GRIBNUMBER; i++)printf("%f ",wava); fclose(fp); |