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