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