王 華,饒傳新,劉仁進(jìn),陳 星
(宜昌市氣象局,宜昌 443000)
風(fēng)向玫瑰圖因其形狀酷似玫瑰花朵而得名,也叫風(fēng)向頻率玫瑰圖,它是根據(jù)某一地區(qū)多年平均統(tǒng)計(jì)的各個(gè)風(fēng)向及其頻率,并按照一定比例繪制而成的圖形。根據(jù)精度不同,將圓周分為8個(gè)或16個(gè)方位,即每隔45°或22.5°確定1個(gè)風(fēng)向。以北(N)為0°方向,以16個(gè)方位為例,逆時(shí)針每增加22.5°所確定的風(fēng)向依次為:西北偏北(NNW)、西北(NW)、西北偏西(WNW)、西(W)、西南偏西(WSW)、西南(SW)、西南偏南(SSW)、南(S)、東南偏南(SSE)、東南(SE)、東南偏東(ESE)、東(E)、東北偏東(ENE)、東北(NE)、東北偏北(NNE)。除此之外,將風(fēng)速低于0.2 m/s的風(fēng)稱為靜風(fēng),用C表示。
風(fēng)向玫瑰圖的繪制可采用Excel[1,2]或編程[3-5]實(shí)現(xiàn),但這兩類方法一般使用的是本地?cái)?shù)據(jù)源,且存在繪制過程工作量大、通用性不足等問題。隨著氣象數(shù)據(jù)向集約化、共享化方向發(fā)展,CIMISS(全國(guó)綜合氣象信息共享平臺(tái))[6]日益成為天氣業(yè)務(wù)“一站式”數(shù)據(jù)供給,支撐氣候業(yè)務(wù)主要數(shù)據(jù)來(lái)源和數(shù)據(jù)開放服務(wù)完全數(shù)據(jù)來(lái)源。因此,選用CIMISS作為風(fēng)向玫瑰圖繪制的數(shù)據(jù)源符合當(dāng)代氣象業(yè)務(wù)發(fā)展的趨勢(shì)和需要。TeeChart是專業(yè)的圖表類控件,它提供數(shù)以百計(jì)的2D及3D圖表類型和幾十種統(tǒng)計(jì)學(xué)函數(shù),風(fēng)向玫瑰圖是其提供的圖表類型中的一種。與傳統(tǒng)繪制方法相比,使用TeeChart提供的風(fēng)向玫瑰圖繪制功能不僅能縮短系統(tǒng)開發(fā)時(shí)間,還能提高繪圖的靈活性和通用性[7-9]。使用CIMISS和TeeChart相結(jié)合的風(fēng)向玫瑰圖繪制方式,能夠有效解決因氣象數(shù)據(jù)向云端遷移而導(dǎo)致的本地風(fēng)向玫瑰圖繪制系統(tǒng)無(wú)效等問題。TeeChart可以看做是CIMISS數(shù)據(jù)可視化[10]的一種工具,它在氣象業(yè)務(wù)系統(tǒng)中還可以有更廣泛的用途。
CIMISS系統(tǒng)于2016年底投入業(yè)務(wù)運(yùn)行,它是由1個(gè)國(guó)家中心和31個(gè)省中心構(gòu)成的,集數(shù)據(jù)收集與分發(fā)、質(zhì)量控制與產(chǎn)品生成、存儲(chǔ)管理、共享服務(wù)、業(yè)務(wù)監(jiān)控于一體的氣象信息共享業(yè)務(wù)系統(tǒng)。CIMISS通過建立氣象數(shù)據(jù)標(biāo)準(zhǔn)化框架,規(guī)范各類數(shù)據(jù)命名、格式和算法,定義國(guó)和省一致的氣象數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)和數(shù)據(jù)服務(wù)接口,實(shí)現(xiàn)了國(guó)省數(shù)據(jù)同步和實(shí)時(shí)歷史數(shù)據(jù)一體化管理。CIMISS包含了豐富的氣象數(shù)據(jù)種類和海量的氣象數(shù)據(jù),用戶可使用客戶端、WebServices、REST服務(wù)或腳本調(diào)用等方式獲取所需數(shù)據(jù)。文章采用客戶端方式從CIMISS中獲取風(fēng)向數(shù)據(jù)。
TeeChart是西班牙Steema公司開發(fā)的圖表類控件,TeeChart 8.0是TeeChart系列中的一個(gè)版本。TeeChart為不同的開發(fā)環(huán)境提供了不同的產(chǎn)品,如TeeChart Pro ActiveX、TeeChart Pro for Java、TeeChart for PHP,分別用于可識(shí)別的ActiveX、Java和PHP開發(fā)環(huán)境。TeeChart不僅提供豐富的圖表類型,而且為每一類圖表的屬性提供多種樣式,僅折線圖就有幾十種。圖1給出了TeeChart提供的典型圖表。文中在VC++編程環(huán)境下,通過ActiveX控件的方式使用該控件。
圖1 TeeChart提供的典型圖表
2.1.1 開發(fā)環(huán)境搭建
采用客戶端方式從CIMISS中獲取數(shù)據(jù),首先需要搭建本地客戶端開發(fā)環(huán)境。CIMISS官方網(wǎng)站為各類開發(fā)語(yǔ)言,如C++、Java、C#等提供相應(yīng)的客戶端開發(fā)包以及DEMO工程(示范工程)。客戶端開發(fā)包由1組庫(kù)文件(或jar包)和配置文件組成。庫(kù)文件主要是ICE(Internet Communications Engine)和接口定義庫(kù)文件。CIMISS采用了ICE技術(shù)[11],它是Zero C公司研發(fā)的一種開源、高性能的面向?qū)ο笾虚g件平臺(tái),具有機(jī)器無(wú)關(guān)性、語(yǔ)言無(wú)關(guān)性、實(shí)現(xiàn)無(wú)關(guān)性和操作系統(tǒng)無(wú)關(guān)性等特點(diǎn)[12-14]。接口定義庫(kù)文件定義了相關(guān)接口,建立了客戶端與ICE中間件的聯(lián)系。配置文件設(shè)置了API代理服務(wù)器地址、端口號(hào)和ICE相關(guān)參數(shù)。
客戶端與服務(wù)器端具體交互過程由ICE中間件負(fù)責(zé),開發(fā)者根據(jù)所選開發(fā)語(yǔ)言以及客戶端開發(fā)包、DEMO工程,能夠快速完成ICE開發(fā)環(huán)境的搭建。圖2給出了VC++編程環(huán)境下ICE的搭建及客戶端、服務(wù)器交互示意圖。圖中,配置文件client.config里的IP地址需要修改為CIMISS為各省分配的地址;接口定義庫(kù)文件有v1.4.0和v1.6.0兩個(gè)版本,文中使用的是v1.4.0版本。需要注意的是,VC++編程環(huán)境下開發(fā)客戶端還需要?jiǎng)討B(tài)鏈接庫(kù)的支持,如bzip2d.dll、ice34d.dll、iceutil34d.dll等,將相關(guān)動(dòng)態(tài)鏈接庫(kù)文件按開發(fā)說明放置在指定位置即可。
圖2 ICE的搭建及客戶端、服務(wù)器交互示意圖(基于VC++)
2.1.2 接口調(diào)用
CIMISS系統(tǒng)將氣象資料分為地面、高空和海洋等14個(gè)類別,每個(gè)類別下又分為多個(gè)子類。如高空資料,它包含全球高空定時(shí)值資料、全球飛機(jī)高空探測(cè)資料等29個(gè)子類。根據(jù)子類資料的特征,CIMISS為每個(gè)子類設(shè)計(jì)了豐富的接口。如全球高空定時(shí)值資料有按時(shí)間檢索高空數(shù)據(jù)要素、按時(shí)間和氣壓層檢索數(shù)據(jù)要素等15種接口;而GPS/MET壓縮文件包則有按時(shí)間檢索高空數(shù)據(jù)文件和按時(shí)間區(qū)站號(hào)檢索高空數(shù)據(jù)文件等3種接口。依據(jù)資料獲取方式以及資料在用戶端的呈現(xiàn)形式,接口有多種調(diào)用方法。如方法callAPI_to_array2D和callAPI_to_saveAsFile分別可以獲取二維(站)點(diǎn)數(shù)據(jù)和檢索結(jié)果并存入文件。文中從CIMISS獲取風(fēng)向數(shù)據(jù)及數(shù)據(jù)處理流程方法如下:
1)數(shù)據(jù)選用:選用CIMISS地面資料類別下的中國(guó)地面月值資料和中國(guó)地面年值資料;
2)接口調(diào)用:調(diào)用“按時(shí)間段、臺(tái)站檢索地面數(shù)據(jù)要素”接口;
3)方法調(diào)用:調(diào)用callAPI_to_array2D方法,返回的是RetArray2D類型數(shù)據(jù);
4)數(shù)據(jù)檢索:檢索得到RetArray2D類型數(shù)據(jù)data[n][19],其中,n表示檢索時(shí)段內(nèi)月份或年份總數(shù),19表示檢索的數(shù)據(jù)要素項(xiàng)目總數(shù);
5)數(shù)據(jù)處理:各風(fēng)向頻率數(shù)據(jù)取平均,得到最終數(shù)據(jù),存入數(shù)組wind_freq[17]中,17代表風(fēng)向總數(shù),包括靜風(fēng)。
2.2.1 注冊(cè)及接口調(diào)用
TeeChart 8.0是以對(duì)象類別擴(kuò)充組件(OCX)的文件形式存在,成功注冊(cè)組件是調(diào)用組件的前提條件。在管理員權(quán)限下,使用Windows操作系統(tǒng)命令regsvr32可以很容易完成組件的注冊(cè)。注冊(cè)成功后,使用插入ActiveX控件的方式將TeeChart 8.0加載到軟件圖形用戶界面,并為控件設(shè)置關(guān)聯(lián)對(duì)象m_TeeChart。鼠標(biāo)左鍵雙擊該控件,彈出如圖3所示的包括序列、圖表、數(shù)據(jù)等選項(xiàng)的初始編輯對(duì)話框。通過對(duì)話框序列選項(xiàng)中的增加按鈕,可以添加如圖1所示的各種圖形。
TeeChart 8.0提供豐富的圖形繪制接口,通過添加接口生成的類,用戶可以完成各種圖形的繪制、屬性設(shè)置及更改等操作。文章使用了ISeries、IWindRoseSeries、IBMPExport和IBrush等13種接口生成的類。
2.2.2 添加序列、數(shù)據(jù)
TeeChart 8.0提供的眾多圖形中,比較適合繪制風(fēng)向玫瑰圖的是Wind Rose和Radar。為此,通過圖3中的增加按鈕添加兩個(gè)序列Series0和Series1,在彈出的如圖1所示工具箱中,分別從Other和Extended選項(xiàng)中選中上述兩類圖形??梢酝ㄟ^圖3中的序列、圖表、數(shù)據(jù)等選項(xiàng)繪制初始默認(rèn)設(shè)置,如設(shè)置字體、線型、坐標(biāo)軸等。
序列添加和初始設(shè)置完成后,需要在程序中添加數(shù)據(jù)以實(shí)現(xiàn)動(dòng)態(tài)繪圖。添加的數(shù)據(jù)是2.1.2節(jié)中從CIMISS獲取的風(fēng)向數(shù)據(jù)經(jīng)過計(jì)算得到的wind_freq數(shù)組。添加數(shù)據(jù)使用的是AddXY函數(shù)。該函數(shù)依次包含X點(diǎn)坐標(biāo)、Y點(diǎn)坐標(biāo)、X點(diǎn)坐標(biāo)名稱和顏色4個(gè)參數(shù),其中,顏色參數(shù)在線圖中不起作用。前3個(gè)參數(shù)在文中依次代表風(fēng)向角度(每隔22.5°為1個(gè)風(fēng)向)、風(fēng)向頻率和風(fēng)向名稱。具體用法如下:
int n=m_DrawStytle.GetCurSel();//獲取用戶選擇的繪圖類型;
CSeries lineSeries=(CSeries)m_TeeChart.Series(n);//定義變量代表當(dāng)前選中序列;
lineSeries.Clear();lineSeries.RefreshSeries();//清除上次繪圖序列數(shù)據(jù)并刷新序列;
for(int i=1;i<17;i++)//添加風(fēng)向角度、風(fēng)向頻率、風(fēng)向名稱數(shù)據(jù);默認(rèn)顏色值為0,即黑色;
lineSeries.AddXY((i-1)*22.5,win_freq[i],windName.GetAt(i-1),0);
2.2.3 屬性設(shè)置
基本繪圖完成以后,通過屬性設(shè)置選項(xiàng)可以增強(qiáng)繪圖的豐富性和美觀度。屬性設(shè)置可以通過調(diào)用TeeChart 8.0提供的相關(guān)函數(shù)完成,也可以直接調(diào)用TeeChart 8.0的系統(tǒng)資源,后者更加便捷。設(shè)置畫筆、畫刷、透明度、各顏色和個(gè)性化定制5個(gè)繪圖屬性設(shè)置選項(xiàng),其中畫筆、畫刷、個(gè)性化定制選項(xiàng)通過調(diào)用系統(tǒng)資源實(shí)現(xiàn)。
1)畫筆、畫刷:畫筆提供線條類型、顏色、寬度等選項(xiàng);畫刷提供27種系統(tǒng)自帶填充圖案以及自選圖片作為填充圖案等選項(xiàng)。調(diào)用方法如下:
int n=m_DrawStytle.GetCurSel();//獲取用戶選擇的繪圖類型;
CPen pen=((CSeries)m_TeeChart.Series(n)).get_Pen();//獲取畫筆;
CBrush brush=((CSeries)m_TeeChart.Series(n)).get_Brush();//獲取畫刷;
pen.ShowEditor(0,_T("畫筆選項(xiàng)"));brush.ShowEditor();//彈出畫筆、畫刷對(duì)話框;
2)透明度:通過序列提供的put_Transparency()函數(shù),可以動(dòng)態(tài)設(shè)置圖形的透明程度。
3)各顏色:即相鄰兩個(gè)角度間的填充顏色,設(shè)有無(wú)、默認(rèn)和隨機(jī)3個(gè)選項(xiàng),分別實(shí)現(xiàn)單一顏色、默認(rèn)顏色和隨機(jī)顏色等效果。各顏色通過設(shè)置AddXY()函數(shù)的第4項(xiàng)參數(shù)實(shí)現(xiàn)。隨機(jī)各顏色實(shí)現(xiàn)方法如下:
long color_val=(long)RGB(rand()%255,rand()%255,rand()%255);//生成隨機(jī)顏色值;
lineSeries.AddXY(…,…,…,color_val);//隨機(jī)顏色值作為AddXY的第4項(xiàng)參數(shù);
4)個(gè)性化定制:個(gè)性化定制選項(xiàng)提供完全的屬性設(shè)置功能,包括畫筆、畫刷、透明度和各顏色等選項(xiàng)的效果。個(gè)性化定制通過調(diào)用TeeChart 8.0的編輯功能實(shí)現(xiàn),調(diào)用方法如下:
int n=m_DrawStytle.GetCurSel();//獲取用戶選擇的繪圖類型;
m_TeeChart.ShowEditor(n);//彈出當(dāng)前繪圖類型下的編輯對(duì)話框;
2.2.4 圖片導(dǎo)出
圖片導(dǎo)出提供兩種方法:一是通過界面設(shè)置的個(gè)性化定制按鈕,在彈出的編輯框中,依次選擇輸出-圖像-保存,可以將繪制的圖形以BMP、GIF、JPEG等9種格式導(dǎo)出;二是通過程序界面設(shè)置的導(dǎo)出按鈕,將圖形以BMP、GIF、JPEG、EMF等4種格式導(dǎo)出。以BMP格式為例,導(dǎo)出方法如下:
//圖片默認(rèn)以導(dǎo)出時(shí)間命名,用戶選擇導(dǎo)出格式、存儲(chǔ)路徑部分略去;
CExport m_Print=m_TeeChart.get_Export();
CBMPExport m_BMP=m_Print.get_asBMP();
m_BMP.SaveToFile(pathName_save);//將圖片保存到路徑pathName_save下;
系統(tǒng)主界面包含繪圖區(qū)、查詢選項(xiàng)、繪圖選項(xiàng)和數(shù)據(jù)展示4個(gè)部分。繪圖區(qū)包含TeeChart 8.0以控件形式提供的風(fēng)向玫瑰圖和雷達(dá)圖兩種繪圖類型;查詢選項(xiàng)包含從CIMISS檢索臺(tái)站風(fēng)向數(shù)據(jù)所必需的站號(hào)、方式、時(shí)間等條件設(shè)置信息,站號(hào)支持用戶輸入;繪圖選項(xiàng)包含繪圖類別、屬性設(shè)置等;數(shù)據(jù)展示包括原始數(shù)據(jù)展示和最終計(jì)算結(jié)果展示。圖4給出了系統(tǒng)的繪圖效果,圖中,(a)、(b)兩幅圖和(c)、(d)兩幅圖分別使用的是TeeChart 8.0的風(fēng)向玫瑰圖和雷達(dá)圖風(fēng)格。
圖4 風(fēng)向玫瑰圖繪制效果
鑒于傳統(tǒng)風(fēng)向玫瑰圖繪制方法存在工作量大、靈活性不足等問題,文章基于VC++編程,以CIMISS系統(tǒng)作為數(shù)據(jù)源,首先實(shí)現(xiàn)了以客戶端方式從CIMISS系統(tǒng)中獲取并計(jì)算任意一個(gè)臺(tái)站在任意時(shí)段內(nèi)的風(fēng)向頻率數(shù)據(jù);其次,調(diào)用TeeChart 8.0插件,實(shí)現(xiàn)了風(fēng)向玫瑰圖的快速繪制。從繪制方法和結(jié)果來(lái)看,繪圖方便快捷,靈活性、通用性較強(qiáng),圖形樣式豐富、美觀。下一步工作中,將增加按月、按季節(jié)的分類統(tǒng)計(jì)方法和繪圖選項(xiàng),進(jìn)一步豐富系統(tǒng)的功能。