姚 愚, 李衛(wèi)紅, 羅 園, 陳增會
(昆明市氣象局,云南昆明 650034)
GrADS(Grid Analysis and Display System)是一套應(yīng)用廣泛、使用方便的科學(xué)數(shù)據(jù)繪圖軟件包,具有較強的數(shù)據(jù)計算和分析能力,可輸出等值線、色溫圖、流線、風(fēng)矢量、折線圖、直方圖等多樣化的圖形,已成為氣象科研領(lǐng)域通用的標準圖形環(huán)境之一[1-4]。目前氣象臺站預(yù)報業(yè)務(wù)中應(yīng)用的多是基于Micaps系統(tǒng)的以文本格式存儲的數(shù)據(jù)文件,GrADS只能識別以二進制格式存儲的數(shù)據(jù),必須編程實現(xiàn)將Micaps格式的數(shù)據(jù)文件轉(zhuǎn)換為GrADS的數(shù)據(jù)格式,并生成相應(yīng)的數(shù)據(jù)描述文件(CTL文件),才能由GrADS正確調(diào)用。以往關(guān)于這類格式轉(zhuǎn)換的研究已較多[5-10],但大都只能對單個Micaps格式的數(shù)據(jù)文件進行轉(zhuǎn)換,不能實現(xiàn)將多個變量、多個垂直層次和多個時間層次的數(shù)據(jù)寫為一個GrADS格式的文件,CTL文件不能自動生成,限制了GrADS計算和作圖功能的發(fā)揮。轉(zhuǎn)換程序多在DOS環(huán)境下運行,操作不便,難以維護更新。在Delphi編程環(huán)境下,應(yīng)用面向?qū)ο蟪绦蛟O(shè)計(OOP)的思想,利用類的封裝性、繼承性和多態(tài)性原理,編程實現(xiàn)便捷高效地將Micaps的4類和11類格點數(shù)據(jù)文件轉(zhuǎn)換為GrADS格式的數(shù)據(jù)文件,克服了以往類似研究的不足,為氣象數(shù)據(jù)的圖形化操作提供支持。
類是OOP中的核心概念[11-12],應(yīng)用類的封裝性、繼承性和多態(tài)性原理可降低處理復(fù)雜問題的難度,提高程序開發(fā)效率,增加代碼的可復(fù)用性和易維護性。根據(jù)具體問題進行類的設(shè)計是OOP程序開發(fā)的關(guān)鍵。GrADS格點數(shù)據(jù)文件是二進制順序無格式流式文件,按經(jīng)度、緯度、高度、變量和時間的次序排列。在最復(fù)雜的情況下,轉(zhuǎn)換GrADS格點數(shù)據(jù)文件需要5重循環(huán)設(shè)計。Micaps系統(tǒng)利用目錄名來區(qū)分變量種類和垂直層次,用文件名區(qū)分時間層次,用文件擴展名區(qū)分預(yù)報時效。Micaps格式的4類和11類數(shù)據(jù)文件分別存儲畫等值線和畫風(fēng)場流線的格點數(shù)據(jù),存儲格式均為“文件頭+數(shù)據(jù)塊”的形式。一個4類格式的文件存儲一種變量一個時次一個高度層次的數(shù)據(jù),按經(jīng)緯度順序排列,有一個“數(shù)據(jù)塊”。11類格式文件基本與4類文件相同,只是存儲了U和V兩個變量,可看作有兩個“數(shù)據(jù)塊”??紤]到不同數(shù)據(jù)應(yīng)用環(huán)境和用戶對數(shù)據(jù)變量、垂直層次、時間層次和預(yù)報時效選擇的多樣性,針對以上GrADS和Micaps的數(shù)據(jù)文件存儲特性,設(shè)計了如圖1所示的類的繼承結(jié)構(gòu)用以轉(zhuǎn)換Micaps格式的格點數(shù)據(jù)文件為GrADS的數(shù)據(jù)格式文件。
TTxtData2BinFile類主要功能是把字符串數(shù)組中的數(shù)據(jù)逐個分離并順序?qū)懭攵M制文件,它是圖1中所有類的基類,其TxtData屬性是一個字符串數(shù)據(jù),用于存放用戶選定的多個Micaps格式的4類或11類文件中“數(shù)據(jù)塊”內(nèi)容,BinFileName屬性存放生成的二進制文件的文件名。WriteMessage過程記錄類的執(zhí)行信息至Mes-sageList屬性中。GetDataFromStr過程用于逐一分離由空格分隔的字符串內(nèi)容。GetBinFile過程用于將TxtData中的數(shù)據(jù)按順序?qū)懭攵M制文件,其主要代碼段如下:
GetBinFile過程中SingleData不斷循環(huán)賦值為從 TxtData中順序分離的單個數(shù)據(jù),再由BinFileStream的Write過程寫入到文件流中,可視為完成了轉(zhuǎn)換GrADS數(shù)據(jù)文件所需的5重循環(huán)中的按經(jīng)緯度兩重循環(huán)。全部數(shù)據(jù)寫入完成后,調(diào)用BinFileStream的Free過程保存文件并釋放對象。
圖1 轉(zhuǎn)換Micaps數(shù)據(jù)文件為GrADS格式的類繼承結(jié)構(gòu)
TM2G-Base抽象類由TTxtData2BinFile類繼承而來,定義了由Micaps格式的數(shù)據(jù)文件轉(zhuǎn)換為GrADS格式文件的接口。TM2G-Base類的內(nèi)部屬性保存了用戶選擇的每個Micaps的4類或11類格式文件的相關(guān)信息,包括Micaps文件的目錄名、文件名和擴展名、高度層次、時間層次、變量名稱、數(shù)據(jù)起止經(jīng)緯度、格點數(shù)、經(jīng)緯度分辯率、“數(shù)據(jù)塊”個數(shù)等,這些信息將用于隨后的數(shù)據(jù)轉(zhuǎn)換過程中。
TM2G-Base類定義了一組方法用于獲取上述文件信息,這些方法中有些是實方法,即在TM2G-Base類定義時即加以實現(xiàn),主要用于獲取Micaps的4類或11類文件的“文件頭”中的信息及對TxtData中的“數(shù)據(jù)塊”進行重排序。SetPara方法可從Micaps數(shù)據(jù)文件中獲取“文件頭”的起止經(jīng)緯度、經(jīng)緯度格點數(shù)、經(jīng)緯度分辨率等信息。如果選定的Micaps數(shù)據(jù)文件的緯向分辨率小于0,表示該文件中數(shù)據(jù)由北向南排列,而GrADS格式文件中的數(shù)據(jù)缺省是由南向北排列,此時需調(diào)用ReverseYDirection方法對TxtData中的相應(yīng)的“數(shù)據(jù)塊”按行重排序。當轉(zhuǎn)換Micaps格式的11類文件時,需調(diào)用Arrange11方法,將TxtData中對應(yīng)“數(shù)據(jù)塊”中U分量數(shù)據(jù)按次序集中排列,之后再放V分量數(shù)據(jù),以適應(yīng)GrADS對數(shù)據(jù)存放的要求。
利用類的多態(tài)性原理,在OOP程序設(shè)計時,可在基類定義通用數(shù)據(jù)接口,在基類的不同子類中去實現(xiàn)這些接口,以便在不同處理環(huán)境下對同一問題采用同一解決方案[11-12]。在實際應(yīng)用中,不同用戶對要進行轉(zhuǎn)換的變量種類的選擇各不相同,例如用戶可選擇Micaps高空實況數(shù)據(jù)(位于high目錄下)、物理量數(shù)據(jù)(位于physic目錄下)、T639數(shù)值預(yù)報產(chǎn)品(位于T639目錄下)、歐洲中期數(shù)值預(yù)報產(chǎn)品(位于ecmwf目錄下)或其它種類的數(shù)據(jù)文件進行轉(zhuǎn)換,這些不同種類的Micaps文件數(shù)據(jù)格式相同,數(shù)據(jù)轉(zhuǎn)換的操作步驟類似。為使程序功能易于維護、增加代碼的復(fù)用性,并提供用戶對Micaps數(shù)據(jù)文件選擇的靈活性,本文將TM2G-Base設(shè)計為抽象類,在其內(nèi)部成員中定義了一組虛函數(shù)(過程),用于獲取用戶在不同數(shù)據(jù)需求下所選擇的每個Micaps文件的變量名稱、目錄名、數(shù)據(jù)文件類別、垂直層次、時間層次等相關(guān)信息,并保存至類的內(nèi)部成員中。這些虛函數(shù)(過程)主要有:SetMicapsFilesList方法對所選每個Micaps數(shù)據(jù)文件的全路徑名按垂直層次、變量名稱和時間層次排序并存放至MicapsFilesList屬性中,GetTxtDataFromMicapsFile方法按照MicapsFilesList屬性中文件名順序,逐一獲取對應(yīng)Micaps數(shù)據(jù)文件的“數(shù)據(jù)塊”至TxtData成員中,相當于完成前述5重循環(huán)中的另外3重循環(huán),SetOutputFileName方法確定生成的GrADS格式數(shù)據(jù)文件名和CTL文件名,WriteCTLFile方法根據(jù)保存的信息生成CTL文件內(nèi)容。以上虛函數(shù)均在TM2G-Base類的子類中實現(xiàn)。例如圖1中由TM2G-Base派生的TMicapsHigh2GradsFile類專門用于轉(zhuǎn)換Micaps的高空實況數(shù)據(jù),TMicapsPhysic2GradsFile類則用于轉(zhuǎn)換物理量數(shù)據(jù)。還可從TM2GBase類派生出其它的類,以適應(yīng)用戶在不同數(shù)據(jù)需求下的對Micaps文件的多樣化選擇,如轉(zhuǎn)換T639或歐洲中期數(shù)據(jù)預(yù)報產(chǎn)品的Micaps數(shù)據(jù)文件等。
圖2是數(shù)據(jù)轉(zhuǎn)換的流程圖。
圖2 Micaps格式數(shù)據(jù)文件轉(zhuǎn)換為Grads格式文件的流程圖
TMicapsHigh2GradsFile類和TMicapsPhysic2GradsFile類均由TM2G-Base類派生,分別用于轉(zhuǎn)換High目錄和Physic目錄下的4類和11類格點數(shù)據(jù)文件。它們同程序界面相關(guān)聯(lián),實現(xiàn)在TM2G-Base類中繼承的各個虛函數(shù)(過程)。TMicapsHigh2GradsFile類可轉(zhuǎn)換High目錄下的高度場、溫度場、溫度露點差場、全風(fēng)速場、流場共5種Micaps格式的數(shù)據(jù)文件,程序界面如圖3(a)。注意用戶所選擇的多個Micaps格式的4類和11類數(shù)據(jù)文件應(yīng)具有相同的起止經(jīng)緯度和經(jīng)緯度分辯率。TMicapsPhysic2GradsFile類的設(shè)計類似,它可轉(zhuǎn)換Physic目錄下的全部物理量數(shù)據(jù)文件,程序界面如圖3(b)。
圖3 轉(zhuǎn)換High和Physic目錄下Micaps格式的4類和11類數(shù)據(jù)文件的程序界面
在圖3(a)所示界面中,選擇對2012年5月11日的5種實況數(shù)據(jù)的全部垂直層次進行轉(zhuǎn)換,包括08時和20時2個時間層次,這些數(shù)據(jù)均位于high目錄下,“UV-流場”是Micaps的11類數(shù)據(jù)文件,其余四種均是4類數(shù)據(jù)文件。點擊“轉(zhuǎn)換高空觀測實況數(shù)據(jù)”按鈕,生成GrADS數(shù)據(jù)格式文件High-120218-120219.dat和描述文件High-120218-120219.ctl,兩個文件在GrADS操作環(huán)境下可正常使用,與原Micaps文件核對數(shù)據(jù)無誤,按鈕代碼如下。圖4(a)是用GrADS作的2012年5月11日08時500hPa的高度場和風(fēng)場疊加圖。
圖3(b)所示界面中,選擇對2012年5月11日的13種物理量數(shù)據(jù)的全部垂直層次進行轉(zhuǎn)換,包括08時和20時2個時間層次,這些數(shù)據(jù)均位于physic目錄下,均為Micaps的4類數(shù)據(jù)文件,點擊“轉(zhuǎn)換物理量實況數(shù)據(jù)”按鈕,生成GrADS數(shù)據(jù)格式文件Physic-120218-120219.dat和描述文件Physic-120218-120219.ctl,在GrADS下打開后與原Micaps文件核對數(shù)據(jù)無誤。圖4b是用GrADS作的2012年5月11日08時沿25°N的水汽通量散度垂直剖面圖。
圖4 利用2012年5月11日的Micaps數(shù)據(jù)文件進行轉(zhuǎn)換和作圖
Micaps格式的格點數(shù)據(jù)文件轉(zhuǎn)換為GrADS數(shù)據(jù)格式文件是氣象臺站預(yù)報和科研業(yè)務(wù)中常遇到的問題。本文應(yīng)用面向?qū)ο蟪绦蛟O(shè)計(OOP)中類的封裝性、繼承性和多態(tài)性原理,根據(jù)Micaps的4類和11類格點數(shù)據(jù)文件的存儲特征和GrADS二進制文件寫入數(shù)據(jù)的規(guī)則,將數(shù)據(jù)轉(zhuǎn)換過程中所需的5重循環(huán)設(shè)計、對11類數(shù)據(jù)文件中U和V“數(shù)據(jù)塊”的重排序等步驟合理分解,并考慮到在不同數(shù)據(jù)環(huán)境和用戶需求下對Micaps不同變量種類的數(shù)據(jù)文件選取存在多樣性,利用Delphi設(shè)計了一組具有繼承關(guān)系的類,實現(xiàn)了把多變量、多垂直層次和多時間層次的Micaps格式數(shù)據(jù)文件轉(zhuǎn)換為GrADS數(shù)據(jù)格式文件的程序設(shè)計,并可自動生成CTL文件,有利于充分發(fā)揮GrADS強大的數(shù)據(jù)計算和作圖功能。程序在Windows下運行,具有操作簡便、界面友好、運行可靠的特點,其功能易于維護和擴充,例如可由TM2G-Base類派生其它的類,以適應(yīng)不同操作環(huán)境和用戶需求下轉(zhuǎn)換數(shù)據(jù)的需要。
致謝:感謝昆明市科技局(昆科計字08S080002號)對本文的資助
[1] 劉輝權(quán),肖天貴,邱靜雅.氣象預(yù)報預(yù)警系統(tǒng)開發(fā)中VB與GrADS、FORTRAN混合編程技術(shù)[J].成都信息工程學(xué)院院報,2011,26(2):208-214.
[2] 楊兆禮,萬齊林.實例分析如何用GrADS實現(xiàn)NetCDF格式轉(zhuǎn)換[J].廣東氣象,2008,30(5):47-49.
[3] 何瀚原,李清華,孫燕.利用GrADS軟件繪制山西區(qū)域氣象要素圖[J].科技情報開發(fā)與經(jīng)濟,2007,17(7):302-303.
[4] 高文良,陳忠明,閔文彬.氣象繪圖軟件GrADS使用要點[J].四川氣象,2002,22(2):49-50.
[5] 吳艷青.GrADS繪圖軟件在臺站業(yè)務(wù)中的應(yīng)用[J].遼寧氣象,2003,19(1):27-30.
[6] 李毓富,姬鴻麗,王貴鵬.用GrADS制作T639數(shù)值產(chǎn)品要素圖[J].氣象與環(huán)境科學(xué),2009,32(增刊):315-319.
[7] 彭芳,吳古匯.GrADS繪圖軟件在Micaps站點資料的應(yīng)用[J].貴州氣象,2009,33(6):30-32.
[8] 葉朗明,管勇,蘇耀墀.應(yīng)用GrADS繪制Ncep再分析資料及Micaps格點資料[J].氣象研究與應(yīng)用,2009,30(增刊):117-118.
[9] 楊建民,王宗仁,張紅英.GrADS腳本語言在格點資料轉(zhuǎn)化中的應(yīng)用[J].科技情報開發(fā)與經(jīng)濟,2007,17(31):196-197.
[10] 況雪源.GrADS繪圖系統(tǒng)在站點等值線中的應(yīng)用[J].廣西氣象,2001,22(2):53-56.
[11] Marco Cantu.DELPHI6從入門到精通[M].北京:電子工業(yè)出版社,2002:38-51,62-75.
[12] Kent Reisdorph.輕松掌握DELPHI4[M].北京:電子工業(yè)出版社,1999:2-3,70-97.