基于Python的Grib數據可視化

cosman 8年前發布 | 19K 次閱讀 Python 數據可視化 Python開發

來自: http://www.cnblogs.com/kallan/p/5160017.html

利用Python語言實現Grib數據可視化主要依靠三個庫——pygrib、numpy和matplotlib。pygrib是歐洲中期天氣預報中心(ECMWF)的GRIG API C庫的Python接口,通過這個庫可以將Grib數據讀取出來;numpy是Python的一種開源的數值計算擴展,這種工具可用來存儲和處理大型矩陣;matplotlib是python著名的繪圖庫,它提供了一整套和matlab相似的命令API,十分適合交互式地進行制圖;在數據可視化過程中,我們常需要將數據在地圖上畫出來,所以還需要matplotlib的一個子包basemap,負責地圖繪制。

一、庫的安裝

(一) matplotlib 安裝

  • matplotlib依賴

  1. nose

  2. numpy

  3. pyparsing

  4. python-dateutil

  5. cycler

  6. pkg-config

  7. freetype

  8. libpng

  • 安裝過程

這里我都是通過源碼包安裝的,大家也可以再終端里通過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

  2. pyproj

  • 安裝過程

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依賴

  1. Jasper

  2. GRIB API 

  3. numpy

  4. pyproj

  • 安裝過程

由于之前已經安裝了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/man

View Code</pre>

修改好就可以正常安裝了

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

信息解讀

<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 <span>:數據列表的行號,有的文件可能包括多個數據</span></span>

<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Geopotential<span> <span>Height<span>:數據的名稱</span></span></span></span>

<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gpm <span>(<span>instant<span>):數據的單位</span></span></span></span>

<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regular_ll<span>:常規數據,其實這個字段我也不清楚</span></span>

<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isobaricInhPa<span>:這個字段表示的是數據屬性,此處表示是以hPa為單位的等壓面</span></span>

<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;level <span>500<span>:這個字段表示的是高度層</span></span></span>

<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fcst time <span>24<span> <span>:預報時效</span></span></span></span>

<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from<span> <span>201507081200 :起報時間</span></span></span>

綜合上面的信息可以得出,這個文件是從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()

(七)圖像展示

</div>

 本文由用戶 cosman 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!