最近有個項目需要開發個氣象信息API,可以通過經緯度查找未來幾天的氣象信息。
經過幾天的研究,現在簡單總結一下。
1、數據來源
數據來源采自美國國家環境預報中心的GFS(全球預報系統),該系統每天發布4次全球范圍的氣象數據,分辨率最高可達到0.25° x 0.25°,精度還是比較可觀的。
2、數據下載
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多點。
3、wgrib2
GFS的數據格式為GRIB,那么什么是GRIB呢? 官方的解釋如下:
GRIB is a WMO format for gridded data. GRIB is used by the operational meteorological centers for storage and the exchange of gridded fields. GRIB's major advantages are files are typically 1/2 to 1/3 of the size of normal binary files (floats), the fields are self describing, and GRIB is an open, international standard.
那么要想獲得GRIB文件中的數據,則需要用到一個軟件wgrib2,,該軟件在ncep網站上提供源碼下載,可以很方便的在Linux下使用gcc進行編譯。
以CentOS為例,需要首先安裝gcc和gfortran編譯器。
# yum install gcc
# yum install gcc-gfortran
然后就可以下載並安裝wgrib2了。
1) Download ftp://ftp.cpc.ncep.noaa.gov/wd51we/wgrib2/wgrib2.tgz
2) untar wgrib2.tgz: tar -xzvf wgrib2.tgz (use gnu tar)
3) cd to main directory: cd grib2
4) define the C and fortran compilers and make
Bash:
export CC=gcc
export FC=gfortran
make
make lib only if you want the ftn_api
Csh
setenv CC gcc
setenv FC gfortran
make
make lib only if you want the ftn_api
5) See if wgrib2 was compiled
wgrib2/wgrib2 -config
需要注意的是,wgrib2以插件的形式提供了mysql入庫功能,但是需要在make之前編輯"makefile" 文件以標記使用MYSQL(USE_MYSQL=1)。
另外,在編譯的過程中會用到/usr/local/include的頭文件,如果安裝MySQL插件還需要安裝下yum install mysql-devel。
安裝后就可以體驗下wgrib2的解壓並入庫功能了。
4、使用wgrib2解壓文件並load進mysql數據庫
使用wgrib2裝載數據庫,首先要創建對應的數據庫表
create table wgrib2 (rt datetime, vt datetime, lat double, lon double, param varchar(80), level varchar(30), value double);
這里各列的含義如下:
rt: run time
vt: valid time
lat: latitude
lon: longitude
param: parameter
level: level/layer
value: value
命令也很簡單:
# ./wgrib2 gfs.2017061900/gfs.t00z.pgrb2.1p00.f000 -if ":PWAT" -mysql <server_ip> <username> <password> <dbname> <tablename>
該命令會將文件中的全部PWAT數據放到對應的表中。
有了以上基礎,就可以寫個腳本每天自動化下載並保存GFS數據到我們的數據庫了。
