利用Python語言實現Grib數據可視化主要依靠三個庫——pygrib、numpy和matplotlib。pygrib是歐洲中期天氣預報中心(ECMWF)的GRIG API C庫的Python介面,通過這個庫可以將Grib數據讀取出來;numpy是Python的一種開源的數值計算擴展,這種工具可用...
利用Python語言實現Grib數據可視化主要依靠三個庫——pygrib、numpy和matplotlib。pygrib是歐洲中期天氣預報中心(ECMWF)的GRIG API C庫的Python介面,通過這個庫可以將Grib數據讀取出來;numpy是Python的一種開源的數值計算擴展,這種工具可用來存儲和處理大型矩陣;matplotlib是python著名的繪圖庫,它提供了一整套和matlab相似的命令API,十分適合互動式地進行製圖;在數據可視化過程中,我們常需要將數據在地圖上畫出來,所以還需要matplotlib的一個子包basemap,負責地圖繪製。
一、庫的安裝
(一)matplotlib安裝
-
matplotlib依賴
-
安裝過程
這裡我都是通過源碼包安裝的,大家也可以再終端里通過pip install 命令來安裝
1、安裝nose
解壓縮後,進入命令提示符 運行
1 python3 setup.py install
2、安裝numpy
解壓縮後,進入命令提示符 運行
1 python3 setup.py install
3、安裝pyparsing
解壓縮後,進入命令提示符 運行
1 python3 setup.py install
4、安裝python-dateutil
解壓縮後,進入命令提示符 運行
1 python3 setup.py install
5、安裝cycler
解壓縮後,進入命令提示符 運行
1 python3 setup.py install
6、安裝pkg-config
1 ./configure --with-intermal-glib 2 make && date 3 sudo make install && date
7、安裝freetype
1 ./configure 2 make && date 3 sudo make install && date
8、安裝libpng
1 ./configure 2 make && date 3 sudo make install && date
9、安裝matplotlib-1.5.0
解壓縮後,進入命令提示符 運行
1 python3 setup.py install
(二)basemap安裝
-
basemap依賴
-
安裝過程
1、安裝GEOS
1 ./configure 2 make && date 3 sudo make install && date
2、安裝pyproj
1 python3 setup.py install
3、安裝basemap
1 python3 setup.py install
(三)pygrib安裝
-
pygrib依賴
-
安裝過程
由於之前已經安裝了numpy和pyproj,這裡只需安裝Jasper和GRIB API即可安裝pygrib
1、安裝Jasper
1 ./configure 2 make && date 3 sudo make install && date
2、安裝GRIB API
1 ./configure --with-jasper='/usr/local/' 2 make && date 3 sudo make install && date
3、安裝pygrib
安裝pygrib之前首先要根據自己的實際情況修改文件目錄下的setup.cfg文件,最主要的就是修改grib_api_dir和jasper_dir,這兩個是剛剛安裝的Jasper和GRIB API的路徑,如果這兩個地址不正確安裝會報錯
1 # Rename this file to setup.cfg to set pygrib's 2 # build options. 3 # Follow instructions below for editing. 4 [directories] 5 # uncomment and set to grib_api install location. 6 # Include files should be located in grib_api_dir/include and 7 # the library should be located in grib_api_dir/lib. 8 # If the libraries and include files are installed in separate locations, 9 # use grib_api_libdir and grib_api_incdir to specify the locations 10 # separately. 11 grib_api_dir = /usr/local 12 # if grib_api was built with jasper support for JPEG200, 13 # uncomment and set to jasper lib install location. 14 # If the libraries and include files are installed in separate locations, 15 # use jasper_libdir and jasper_incdir. 16 jasper_dir = /usr/local 17 # if grib_api was built with openjpeg support for JPEG200, 18 # uncomment and set to openjpeg lib install location. 19 # If the libraries and include files are installed in separate locations, 20 # use openjpeg_libdir and openjpeg_incdir. 21 #openjpeg_dir = /opt/local 22 # if grib_api was built with png support, 23 # uncomment and set to png lib install location. 24 # If the libraries and include files are installed in separate locations, 25 # use png_libdir and png_incdir. 26 png_dir = /usr 27 # if grib_api was built with png support, 28 # uncomment and set to zlib install location. 29 zlib_dir = /usr 30 # install man pages for command line utilities here 31 #man_dir = /usr/local/manView Code
修改好就可以正常安裝了
1 python3 setup.py install
二、grib數據讀取
雖然我做的東西和氣象沾邊,但是我本身並不是氣象專業出身,所有這些東西都是我慢慢研究琢磨出來的,所以有些方面可能講的比較外行,有不對的地方歡迎大家留言指正。
(一)導入pygrib模塊
1 >>> import pygrib
(二)打開Grib文件
1 >>> grbs = pygrib.open('/Users/Kallan/Documents/data/echhae50.082')
(三)提取文件信息
1 >>> grbs.seek(0) 2 >>> for grb in grbs: 3 grb 4 1:Geopotential Height:gpm (instant):regular_ll:isobaricInhPa:level 500:fcst time 24 :from 201507081200
信息解讀
1 :數據列表的行號,有的文件可能包括多個數據
Geopotential Height:數據的名稱
gpm (instant):數據的單位
regular_ll:常規數據,其實這個欄位我也不清楚
isobaricInhPa:這個欄位表示的是數據屬性,此處表示是以hPa為單位的等壓面
level 500:這個欄位表示的是高度層
fcst time 24 :預報時效
from 201507081200 :起報時間
綜合上面的信息可以得出,這個文件是從2015年7月8日12時開始的24小時後500hPa等壓面高度場數據
(四)導出文件數據
1 >>> grb = grbs.select(name='Geopotential Height')[0] 2 >>> data = grb.values 3 >>> print(data.shape,data.min(),data.max()) 4 (37, 37) 5368.6796875 5941.0390625 5 >>> lat,lon=grb.latlons() 6 >>> print(lat,'\n',lon) 7 [[ 0. 0. 0. ..., 0. 0. 0. ] 8 [ 2.5 2.5 2.5 ..., 2.5 2.5 2.5] 9 [ 5. 5. 5. ..., 5. 5. 5. ] 10 ..., 11 [ 85. 85. 85. ..., 85. 85. 85. ] 12 [ 87.5 87.5 87.5 ..., 87.5 87.5 87.5] 13 [ 90. 90. 90. ..., 90. 90. 90. ]] 14 [[-90. -87.5 -85. ..., -5. -2.5 0. ] 15 [-90. -87.5 -85. ..., -5. -2.5 0. ] 16 [-90. -87.5 -85. ..., -5. -2.5 0. ] 17 ..., 18 [-90. -87.5 -85. ..., -5. -2.5 0. ] 19 [-90. -87.5 -85. ..., -5. -2.5 0. ] 20 [-90. -87.5 -85. ..., -5. -2.5 0. ]]
三、grib數據可視化
(一)導入需要的模塊
1 >>> import matplotlib.pyplot as plt 2 >>> from mpl_toolkits.basemap import Basemap 3 >>> import numpy as np
(二)創建一個figure
1 >>> plt.figure() 2 <matplotlib.figure.Figure object at 0x107e65198>
(三)創建一個basemap實例
1 >>> m=Basemap(projection='mill',lat_ts=10,llcrnrlon=lon.min(), \ 2 urcrnrlon=lon.max(),llcrnrlat=lat.min(),urcrnrlat=lat.max(), \ 3 resolution='c') 4 >>> m.drawcoastlines(linewidth=0.25) 5 <matplotlib.collections.LineCollection object at 0x1091c1f28> 6 >>> m.drawcountries(linewidth=0.25) 7 <matplotlib.collections.LineCollection object at 0x10621d0f0> 8 >>> m.fillcontinents(color='coral',lake_color='aqua') 9 >>> m.drawmapboundary(fill_color='aqua') 10 <matplotlib.patches.Rectangle object at 0x10918b3c8> 11 >>> m.drawmeridians(np.arange(0,360,30)) 12 >>> m.drawparallels(np.arange(-90,90,30))
(四)將lat,lon的數據格式轉換成投影需要的格式存入x,y
1 >>> x, y = m(lon,lat)
(五)繪製等值線
1 >>> cs = m.contour(x,y,data,15,linewidths=1.5)
(六)命名並顯示圖像
1 >>> plt.title('Geopotential Height Contour from Grib') 2 <matplotlib.text.Text object at 0x10918bda0> 3 >>> plt.show()
(七)圖像展示