朱 楓 袁鵬艷 段中夏
(1.新鄉市氣象局,河南 新鄉 453003;2.延津縣氣象局,河南 延津 453200)
MICAPS第四類數據格式Python處理庫的實現和應用
朱 楓1袁鵬艷2段中夏1
(1.新鄉市氣象局,河南 新鄉 453003;2.延津縣氣象局,河南 延津 453200)
本文基于Python語言設計和實現了MICAPS第四類數據格式的通用接口庫Diamond4,包含數據讀寫,格點到站點的插值,數據格式轉換等功能。Diamond4庫簡潔高效,可有效支持對MICAPS數據的本地開發。最后展示了Diamond4庫結合其他Python第三方庫在新鄉市氣象臺本地業務應用的兩個實例:結合Bokeh庫的多模式站點兩米溫度的自動提取和結合Arcpy庫的多模式降水對比郵票圖的自動生成。
MICAPS;第四類數據;Diamond4庫
分氣象信息綜合分析和處理系統MICAPS(Meteo?rology Information Comprehensive Analysis Process Sys?tem)是我國氣象業務的基礎軟件[1],其中第四類數據是MICAPS系統自定義的格點數據格式。國家氣象信息中心通過CMACast衛星系統下發的多種氣象實況數據和數值預報模式結果通常最終被解碼成第四類格式,供MICAPS系統可視化呈現或處理。因此,基層預報員接觸最多的氣象數據通常以MICAPS第四類格式呈現。這種格式都是單個的文本文件,相對于Grib1、Grib2、HDF或者NetCDF等高級格式要簡單明了許多。鑒于MICAPS第四類數據使用的簡單性和普遍性,如何開發一個通用的、簡潔高效的針對MICAPS第四類數據格式的程序接口庫,以便基層預報員在這類格式的數據基礎上定制開發本地化應用,是本文要解決的主要問題。
Python是一門簡潔且功能強大的開源編程語言,因其活躍的社區支持,涌現了大量優秀的第三方庫,涵蓋了網絡編程、數據庫、嵌入式、游戲等多個領域[2],尤其在科學計算和機器學習領域,Python變得越來越受歡迎。此外,Python語言還被應用于氣象領域,主要用于開發、繪圖[3]。Python簡明易學,且易快速上手。考慮到需要開發的程序接口庫主要供基層預報員使用,因此,選擇Python作為開發語言不僅可以減少開發成本,也能減少學習和使用的難度。本文設計開發的庫是純Python庫,除Py?thon內置的庫外,不依賴其他第三方庫,包括在科學計算領域使用較多的Numpy、Pandas等,以保證其簡潔易用。因為MICAPS數據格式的頭文件大都以英文Diamond開頭,因此將處理MICAPS第四類數據格式的庫命名為Dia?mond4。
MICAPS第四類數據具有統一的定義方式(具體定義說明請參見官方論壇網站或MICAPS自帶的幫助文檔),每個第四類數據文件的文件頭都對特定的屬性進行了明確規定,各個屬性以空格分割,只是具體數據不一樣。因此,可以將MICAPS第四類數據看做一個類,將一個MI?CAPS第四類文件視為一個對象。很自然地,采用面向對象的設計方式,更容易保障代碼的結構性和邏輯性。Dia?mond4類根據MICAPS第四類數據的格式,定義了相應屬性,每個屬性作為對象的一個字段,實際格點數據也是對象的一個字段,以一維列表的方式保存數據部分。格點數據是二維數據,用一維列表保存,是為了減少內存消耗,為了更容易獲取格點值,可以定義取值方法Value,根據行列號直接獲取對應值,從而在邏輯上屏蔽數據實際存儲的組織方式。在此基礎上,可以很方便地再設計定義其他方法。
下面的代碼給出了Diamond4實現的主要部分,即初始化方法和取值方法。Diamond4類庫的具體實現代碼托管在GitHub上,網址為https://github.com/LuckyBoy314/MeteoPlot/blob/master/pyMicaps.py。
class Diamond4(object):
diamond=4
#構造函數
def__init__(self,file_path):
with open(file_path,'r')as f:
#讀入原始數據
data_raw= [word for line in f.readlines()if line[:-1].strip()for word in
line.split()]
#定義相關屬性
self.doc=data_raw[2].decode('gbk') # 說明字符串
(self.size_lon, #經度(x方向)格距,一般為正
self.size_lat,#緯度(y方向)格距,有正負號
self.lon_start,#起始經度
self.lon_end, #終止經度
self.lat_start,#起始緯度
self.lat_end)=(float(i)for i in data_raw[9:15]) #終止緯度
(self.cols,#緯向格點數目,即列數
self.rows)=(int(i)for i in data_raw[15:17]) # 經向格點數目,即行數
#日期時間處理
(month,day,hour,interval)=data_raw[4:8]
year=data_raw[3]
if len(year)==2:
year=('20'+year)if int(year)<49 else('19'+year)
elif len(year)==4:
pass
else:
raise Exception('year parameter error!')
#注意start_time和valid_time沒有統一規定,要看具體情況
self.start_time=datetime.datetime(int(year),int(month),int(day),int(hour))
self.valid_time=self.start_time+datetime.timedelta(hours=int(interval))
#數據部分,以一維數組表示
self.data= [float(i)for i in data_raw[22:]]
del data_raw
def value(self,row,col):
'''根據行列號獲取格點值,將格點數據看成self.cols*self.nums_lat的二維數組,返回第row行,第col列的值,row和col必須為整數,從0開始計數,坐標原點在左上角'''
if row <0 or row >=self.rows or col<0 or col>=self.cols:
raise Exception('out of data spatial range')
return self.data[row*self.cols+col]
開發Diamond4的主要目的就是方便有開發經驗的基層預報員直接在MICAPS數據基礎上進行開發。現在將展示兩個應用了Diamond4庫的兩個實例,分別是多模式2m站點溫度的提取和多模式降水對比郵票圖繪制,這兩個應用每天定期自動化運行,已經在新鄉市氣象臺的實際業務中使用,并顯著提升了預報員的工作效率。
3.1 多模式2m站點溫度的自動提取
Diamond4在多模式2m站點溫度的自動提取中的應用主要是利用Diamond4類的IDW方法,將格點數據插值到特定站點。IDW的以站點位置經緯度為輸入參數,可以是多個站點,且必須以[(lon1,lat1),(lon2,lat2),…(lonN,latN)]形式的一系列站點位置,經緯度必須是弧度形式,返回值是對應各個站點值的列表。具體是利用反距離加權的方法,根據站點距離周圍四個格點值的距離進行加權計算,各個點的權重與距離的平方成反比(平方是IDW方法的默認值,也可以用其他冪次)。
Bokeh庫[4]是基于網頁繪圖的Python第三方庫,其繪制的圖形具有可交互的特征,不僅美觀,而且具有很大的靈活性。Bokeh的具體使用不在本文的討論范圍內,總之Bokeh繪圖使用的數據是通過Diamond4庫提取。具體繪圖代碼托管在GitHub上(參見https://github.com/Lucky?Boy314/MeteoPlot/blob/master/TempPlot.py)。
圖1展示了2017年8月28日08:00起報的多家數值模式2m溫度在新鄉各個國家站點上的提取結果,可以直觀地顯示溫度預報的時間變化特征。每個標簽顯示一種模式,切換標簽可以在不同模式間作對比分析。圖中顯示的是歐洲數值預報中心240h的預報結果,每一個MI?CAPS第四類文件對應一個時次,即一個Diamond4對象,利用Diamond4類的IDW方法提取站點值交由Bokeh庫繪制到網頁上。繪制結果是可交互的動態網頁,可自用放大縮小,鼠標懸停在圓圈點上即會顯示其代表的溫度、站點名和時間。

圖1 2017年8月28日08:00起報的多模式站點2m溫度提取在新鄉的應用
3.2 多模式降水對比郵票圖的繪制
Diamond4在多模式降水對比郵票圖的繪制中的應用主要是利用Diamond4的convert_to_EsriAscii方法簡潔高效地將MICAPS第四類的格點數據轉換為ArcGIS可以識別的柵格數據,然后交由ArcGIS繪制成圖。郵票圖的框架和色標通過ArcGIS的ArcMap軟件預先設定好,產生新的模式結果后,先由Diamond4轉換數據格式,然后通過ESRI公司提供的Arcpy庫,刷新繪圖并自動導出圖片。具體繪圖代碼也托管在GitHub上(參見https://github.com/LuckyBoy314/MeteoPlot/blob/master/modelRainPlot.py)。
圖2展示了2017年8月23日20:00起報的多家數值模式120h內新鄉周邊地區的降水預報結果,每行表示一種數值模式,每列表示12小時內的分段降水量。通常情況下,預報員參考數值模式要通過MICAPS平臺或者中央臺、省局的網絡預報平臺來查閱,需要逐一模式逐時次翻閱,耗時、繁瑣,且不利于直觀地對比各家模式的結果,此外這些平臺以全國或全省為關注點,本地的分辨率反而不清晰。該應用可以幫助預報員以新鄉本地為中心,一目了然地對比參考多家模式的預報結果,從而顯著增強參考數值模式結果的針對性和直觀性,大大提高工作效率。

圖2 2017年8月23日20:00起報的多模式降水預報對比郵票圖在新鄉的應用(突出顯示的區域為新鄉)
本文介紹了一個基于Python語言編寫的處理MI?CAPS第四類數據的通用庫Diamond4,MICAPS第四類數據除了直接在MICAPS平臺中使用外,還可以基于Dia?mond4庫進行更加靈活的自主開發,這對在MICAPS數據基礎上開發本地應用的基層預報員尤其重要。本文簡要分析了使用Diamond4庫結合其他第三方python庫開發的兩個本地應用:新鄉市氣象臺的多模式2m站點溫度自動提取和多模式降水對比郵票圖的自動生成。通過分析可知,Diamond4庫簡潔易用,可以有效地結合第三方庫開發本地應用。Diamond4庫的功能還有待進一步擴展和完善,如增加計算、數據剪裁、統計分析、直接繪圖等功能。今后將繼續維護開發Diamond4庫,使之更加完善。
[1]李月安,曹莉,高嵩,等.MICAPS預報業務平臺現狀與發展[J].氣象,2010(7):50-55.
[2]Chun Wesley J.Python核心編程[M].宋廣吉,譯.北京:人民郵電出版社,2008.
[3]Lin J W.A Hands-On Introduction to Using Python in the Atmospheric and Oceanic Sciences[EB/OL].[2017-11-01].http://www.johnny-lin.com/pyintro/ed01/free_pdfs/ch10.pdf.
[4]Bokeh Development Team.Bokeh,a Python library for interactive visualization[EB/OL].[2017-11-01].http://flow?ingdata.com/2013/11/22/bokeh-a-python-library-for-interactivevisualization/.
The Implementation and Application of a Python Library for MICAPS Fourth Format Data
Zhu Feng1Yuan Pengyan2Duan Zhongxia1
(1.Xinxiang Meteorological Bureau,Xinxiang Henan 453003;2.Yanjin Meteorological Bureau,Yanjin Henan 453200)
We designed and implemented a Python library named Diamond4 for processing the MICAPS fourth format data.The library consists the utilities of data writing and reading,grid-to-station data extrac?tion,format conversion et al.which will efficiently support the native development on the MICAPS data.The last showed Diamond4 library combined with other Python third party libraries in two instances of lo?cal meteorological station business application in Xinxiang city:Combining site of multi mode Bokeh base two meters temperature automatic extraction and combination of Arcpy library multi mode contrast stamp for automatic generation of precipitation.
MICAPS;fourth format data;Diamod4 library
P451
A
1003-5168(2017)12-0152-03
2017-11-01
朱楓(1988-),男,碩士,助理工程師,研究方向:短期短時天氣預報預警。