0%

使用wgrib2将GFS数据导入到mysql

GFS数据来源

数据来源采自美国国家环境预报中心的GFS(全球预报系统),该系统每天发布4次全球范围的气象数据,分辨率最高可达到0.25° x 0.25°,精度还是比较可观的。
GFS数据提供FTP下载方式:http://www.ftp.ncep.noaa.gov/data/nccf/com/gfs/prod/
每次发布的数据保存在命名为gfs.YYYYMMDDHH的文件夹中。本次需要的数据精度为0.25°(0p25),所以数据的文件名为:gfs.t{HH}z.pgrb2.0p25.f{XXX}
其中HH表示发布的时间,XXX表示未来几小时的预报数据。例如gfs.t00z.pgrb2.0p25.f001 表示0时发布的未来1小时气象数据信息。
那么问题来了,这个文件太大了,因为分辨率比较高,每个文件高达200多MB,不仅下载速度慢,处理慢,对存储空间也是一个考验。
于是找到了一个可以在线过滤要下载数据的地址:
http://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p25.pl
这个网站允许用户仅下载过滤后的文件,并提供下载网址,这样文件就会小很多。
例如,在本项目中,仅需要下载降雨数据(PWAT),并且经纬度范围为特定区域,每次发布的数据全部下载下来也才8M多点。
那么要想获得GRIB文件中的数据,则需要用到一个软件wgrib2,,该软件在ncep网站上提供源码下载。

Mysql安装配置

查看mysql安装

1
2
3
4
5
6
7
[root@siluxa_oracle grib2]# rpm -qa |grep -i mysql
mysql-community-common-5.6.36-2.el6.x86_64
mysql-community-client-5.6.36-2.el6.x86_64
mysql-community-server-5.6.36-2.el6.x86_64
mysql-community-libs-compat-5.6.37-2.el6.x86_64
mysql-community-libs-5.6.36-2.el6.x86_64
mysql-community-devel-5.6.39-2.el6.x86_64

创建数据库和表

1
2
3
4
5
6
7
# 创建数据库
CREATE DATABASE weatherDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
# 创建表
create table wgrib2 (rt datetime, vt datetime, lat double, lon double, param varchar(80), level varchar(30), value double);
# 创建用户和表,并赋予权限(实验环境可以直接用root,生产环境强烈建议使用普通用户)
-- CREATE USER wgrib2 IDENTIFIED BY 'ffffff';
-- GRANT ALL on weatherDB.* to wgrib2@"%" Identified by "ffffff";

编译安装wgrib2软件包

编译安装wgrib2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#安装gcc和gfortran编译器
yum install gcc gcc-gfortran -y
#下载wgrib2软件包
wget http://www.ftp.cpc.ncep.noaa.gov/wd51we/wgrib2/wgrib2.tgz -O /usr/local/src/wgrib2.tgz
cd /usr/local/src
tar wgrib2.tgz
cd grib2/
#设置编译环境
export CC=gcc
export FC=gfortran
# 启用mysql支持,修改第114行
vim makefile
USE_MYSQL=1
# 编译
make

查看wgrib2配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
[root@siluxa_oracle grib2]#cd wgrib2
[root@siluxa_oracle grib2]# ./wgrib2 -config
wgrib2 v0.2.0.7 12/2017 Wesley Ebisuzaki, Reinoud Bokhorst, John Howard, Jaakko Hyvätti, Dusan Jovic, Daniel Lee, Kristian Nilssen, Karl Pfeiffer, Pablo Romero, Manfred Schwarb, Gregor Schee, Arlindo da Silva, Niklas Sondell, Sam Trahan, Sergey Varlamov
stock build

Compiled on 11:02:41 Mar 15 2018

Netcdf package: "3.6.3" of Mar 15 2018 11:02:16 $ is installed
libaec-1.0.2.tar.gz is installed
Jasper 1.900.1 is installed
mysql package is installed
regex package is installed
tigge package is installed
IPOLATES iplib.v3.0.0 is installed, default vectors:
UGRD/VGRD VUCSH/VVCSH UFLX/VFLX UGUST/VGUST USTM/VSTM VDFUA/VDFVA MAXUW/MAXVW
UOGRD/VOGRD UICE/VICE U-GWD/V-GWD USSD/VSSD
Geolocation library status (by search order)
gctpc geolocation is enabled
spherical geolocation is enabled
UDF package is not installed
version ftime=2
maximum number of arguments on command line: 10000
maximum number of -match,-not,-if, and -not_if options: 2000
maximum number of -match_fs,-not_fs,-if_fs, and -not_if_fs options: 2000
maximum number of -fgrep, -egrep, -fgrep_v, -egrep_v options: 200
RPN registers: 0..19
memory files: @mem:0, @mem:1 .. @mem:19
stdout buffer length: 30000
default decoding: g2clib emulation
g2clib decoders are not installed
Supported decoding: simple, complex, rle, ieee, png, jpeg2000, CCSDS AEC
user gribtable: (none)
C compiler: gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-18)
Fortran compiler: gfortran
OpenMP: control number of threads with environment variable OMP_NUM_THREADS
INT_MAX: 2147483647
ULONG_MAX: 18446744073709551615

将gfs数据导入到mysql中

1
./wgrib2 /mnt/wgrib2/gfs_20180313_0000_0p25_240.240 -mysql 192.168.6.123 root ffffff weatherDB wgrib2

wgrib2

可以过滤性导入数据,格式为 -if “:” 后跟参数

1
2
#下边这条命令是将“10 m above ground”的数据导入到wind表中
./wgrib2 /mnt/wgrib2/gfs.t00z.pgrb2.0p25.f000 -if ":10 m above ground" -mysql 192.168.6.123 root ffffff weatherDB wind

查看导入结果

1
2
3
mysql -uroot -pffffff
mysql> use weatherDB;
mysql> select * from `weatherDB`.`wgrib2` limit 0, 20;

wgrib2

自动下载gfs数据,并导入mysql脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@mysql gfs_data]# cat d_gfs00.sh 
#!/bin/bash
v_time1=`date "+%Y%m%d00"`
gfs_dir=/data/gfs_data/$v_time1
# 0. 删除2天前的数据
find /data/gfs_data/ -type d -mtime +2 -exec rm -fr {} \;
# 1. 判断目录是否存在,如果不存在新建目录
if [ ! -d "$gfs_dir" ];then
mkdir -p $gfs_dir
Else
echo "文件夹已经存在"
fi
# 2. 判断目录下是否有文件
filenum=`ls $gfs_dir |wc -l`
if [ 9 -ne $filenum ];then
/usr/bin/perl /data/gfs_data/get_gfs.pl data $v_time1 0 24 3 all 'VGRD.10 m above ground|UGRD.10 m above ground' $gfs_dir >/dev/null 2>&1
else
echo "文件已经下载"
fi
# 3. 清空数据库
mysql -uwgrib2 -pwg#123 -e 'truncate table weatherDB.wind'
# 4. 导入文件到数据库

for file in $(ls $gfs_dir)
do
/usr/local/grib2/wgrib2/wgrib2 $gfs_dir/$file -mysql localhost wgrib2 'wg#123' weatherDB wind >/dev/null 2>&1
done

ps:
如果是使用Mariadb数据的话,还需要安装MariaDB-libs mysql-devel MariaDB-shared openssl-devel依赖

参考链接:
http://blog.csdn.net/pch1982cn/article/details/74292772
http://www.cpc.ncep.noaa.gov/products/wesley/wgrib2/index.html
http://www.nco.ncep.noaa.gov/pmb/products/gfs/gfs.t00z.pgrb2f00.npoess.shtml
数据下载地址:
ftp://ftpprd.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/
在线过滤要下载数据的地址:
http://nomads.ncep.noaa.gov