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