況源,周小明,梁富強(qiáng)
(四川省宜賓市氣象局 四川 宜賓 644000)
風(fēng)玫瑰圖能夠直觀地反應(yīng)某一地區(qū)風(fēng)的狀況,故被廣泛地應(yīng)用到城市規(guī)劃、環(huán)境評價(jià)、風(fēng)能資源評估等工作中[1-3]。風(fēng)玫瑰圖的繪制工作通常要先對基礎(chǔ)風(fēng)向、風(fēng)速數(shù)據(jù)進(jìn)行統(tǒng)計(jì),計(jì)算出16個(gè)方位的風(fēng)頻、平均風(fēng)速,再借助CAD、Matlab等軟件繪圖,過程工作量大,耗時(shí)較長,難度高,出錯率高。所以,編寫一款風(fēng)玫瑰圖繪制程序,具有工程實(shí)際意義。
風(fēng)玫瑰圖是指在極坐標(biāo)底圖上點(diǎn)繪出的某一地區(qū)在某一時(shí)段內(nèi)各風(fēng)向出現(xiàn)的頻率或各風(fēng)向的平均風(fēng)速的統(tǒng)計(jì)圖。前者為“風(fēng)向玫瑰圖”,后者為“風(fēng)速玫瑰圖”。因圖形似玫瑰花朵故名[4]。風(fēng)向是風(fēng)吹來的方向,風(fēng)向一共分為16個(gè)方位,以北在起點(diǎn),每隔22.5°確定一個(gè)方向,分別為北(N)、東北偏北 (NNE)、 東 北 (NE)、 東 北 偏 東 (ENE)、 東 (E)、 東 南 偏 東(ESE)、東南(SE)、東南偏南(SSE)、南(S)、西南偏南(SSW)、西南(SW)、西南偏西(WSW)、西(W)、西北偏西(WNW)、西北(NW)、西北偏北(NNW)。風(fēng)速是指空氣在單位時(shí)間內(nèi)的流過的距離,單位一般為m/s[5]。
程序主要功能有:實(shí)現(xiàn)對基礎(chǔ)數(shù)據(jù)的excel方式導(dǎo)入,對基礎(chǔ)數(shù)據(jù)自動統(tǒng)計(jì),風(fēng)玫瑰圖繪制,曲線調(diào)整,自定義顏色填充和風(fēng)玫瑰圖導(dǎo)出等功能。程序功能設(shè)計(jì)圖如圖1所示。
圖1 程序功能設(shè)計(jì)圖Fig.1 Program function design
程序通過導(dǎo)入excel表格的方式加載基礎(chǔ)數(shù)據(jù),程序在加載數(shù)據(jù)時(shí),從約定的有效數(shù)據(jù)起始位置(3行2列)開始遍歷數(shù)據(jù)表,將表中風(fēng)向、對應(yīng)風(fēng)速分別保存到數(shù)組pfdata、pvdata中,且風(fēng)向風(fēng)速的對應(yīng)關(guān)系要保持不變。主要代碼如下[6]
void CMainFrame::InitExcel(){
/*此處略去Excel服務(wù)器和獲取數(shù)據(jù)Worksheet頁(wht)代碼*/
/*加載數(shù)據(jù)*/
Range range, usedRange;
usedRange.AttachDispatch(wht.GetUsedRange());
range.AttachDispatch(usedRange.GetRows());
long iRowNum=range.GetCount(); //獲 取 已 經(jīng) 使 用的行數(shù)
range.AttachDispatch(usedRange.GetColumns());long iColNum=range.GetCount();//獲取已經(jīng)使用的列數(shù)CString*pfdata=new CString[(iRowNum-2)*(iColNum-1)/2]; //用于加載風(fēng)向數(shù)據(jù)
float*pvdata=new float[(iRowNum-2)*(iColNum-1)/2];//用于加載風(fēng)速數(shù)據(jù)
for(intm=3; m<=iRowNum; m++){
for (intn=2; n<=iColNum; n++){//遍歷表中風(fēng)向、風(fēng)速數(shù)據(jù)
range.AttachDispatch(wht.GetCells());
range.AttachDispatch (range.GetItem (COleVariant((long)m),COleVariant((long)n)).pdispVal);
COleVariant vResult=range.GetValue2();
if(vResult.vt==VT_BSTR) {//字 符 串 則 為風(fēng)向pfdata [((m-3)* (iColNum-1) +n-2)/2]=vResult.bstrVal;}
if(vResult.vt==VT_R8) {//數(shù)字則為風(fēng)速
pvdata[((m-3)*(iColNum-1)+n-3)/2]= (float)vResult.dblVal;}}
}
/*此處略去退出Excel服務(wù)器代碼*/
}
數(shù)據(jù)加載完后,遍歷數(shù)組pfdata數(shù)組統(tǒng)計(jì)出風(fēng)向再各方位出現(xiàn)的次數(shù),保存在fnum數(shù)組中;同時(shí)將各方位對應(yīng)的風(fēng)速累加到vnum數(shù)組中,主要代碼如下。
/*fnum為存放風(fēng)向在各方位出現(xiàn)的次數(shù)的數(shù)組,vnum為存放對應(yīng)風(fēng)速的累計(jì)值的數(shù)組,數(shù)組元素對應(yīng)各個(gè)方位,依 次 為 N,NNE,NE,ENE,E,ESE,SE,SSE,S,SSW,SW,WSW,W,WNW,NW,NNW,C*/
int fnum[17]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0};
float vnum[17]= {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0};
for(int i=0; i<(iRowNum-2)*(iColNum-1)/2; i++){
if(pfdata[i]=="N") {
fnum[0]++;
vnum[0]+=pvdata[i];}
/*此處略去處理其他方位的代碼*/
}
最后用各方位出現(xiàn)次數(shù)除以總次數(shù)得到該方位的風(fēng)頻(以百分率表示),用各方位風(fēng)速值之和除以該方位出現(xiàn)次數(shù)得到平均風(fēng)速。
風(fēng)玫瑰圖分為風(fēng)向玫瑰圖和風(fēng)速玫瑰圖,繪制風(fēng)玫瑰圖可以分別繪制在兩張玫瑰圖中,亦可以疊加在同一張風(fēng)玫瑰圖里面。下面以繪制風(fēng)向玫瑰圖實(shí)現(xiàn)過程為例。風(fēng)向玫瑰圖的繪制過程,首先要將風(fēng)按16個(gè)方位進(jìn)行統(tǒng)計(jì),計(jì)算出各方位的風(fēng)向頻率,其計(jì)算公式為:gn式中:gn為 n方位的風(fēng)向頻率,fn為所取資料年代內(nèi)風(fēng)在n方位出現(xiàn)的次數(shù),n表示方位,共16個(gè)方位。c為所取資料年代內(nèi)靜風(fēng)的次數(shù)[2]。然后計(jì)算為坐標(biāo)點(diǎn),連接所有點(diǎn)后,即為基本的風(fēng)向玫瑰圖。
3.2.1 計(jì)算各方位風(fēng)頻的坐標(biāo)
風(fēng)頻在極坐標(biāo)系上的坐標(biāo)計(jì)算方法如圖2所示,若點(diǎn)A為NE方位在極坐標(biāo)上的描點(diǎn),OA長度為風(fēng)向在NE方位的風(fēng)頻,角α值如表1所示[8](在 VC++中使用弧度作計(jì)算),這樣就能夠算出點(diǎn) A的坐標(biāo)(OA×cosα,OA×sinα)。
圖2 風(fēng)頻在極坐標(biāo)系上的坐標(biāo)計(jì)算方法Fig.2 Coordinates calculationmethods ofwind frequency on the polar coordinates
此時(shí)得到的極坐標(biāo)還不能直接用于繪圖,因?yàn)樵赪indows應(yīng)用程序中,繪圖使用GDI坐標(biāo)系統(tǒng),在GDI坐標(biāo)系統(tǒng)中原點(diǎn)(0,0)位于左上角,水平軸的正方形向右,垂直軸的正方向向下[7],所以還需要作處理。處理方法是根據(jù)繪圖區(qū)域確定 O 點(diǎn)在 GDI坐標(biāo)系統(tǒng)的坐標(biāo) O′(XO′,YO′)(可以取中心點(diǎn)坐標(biāo)),與已計(jì)算出的A點(diǎn)在極坐標(biāo)系上坐標(biāo)A(XA,YA)作計(jì)算,得到A點(diǎn)在GDI坐標(biāo)系統(tǒng)的新坐標(biāo)A′,計(jì)算公式為:A′(XA′,YA′)=(XO′+XA,YO′-YA)。 另外,因風(fēng)玫瑰圖風(fēng)格多樣,有的將最里同心圓視為原點(diǎn)(0,0),此情況還需把坐標(biāo)作進(jìn)一步處理。同理,計(jì)算出其它方位點(diǎn)的坐標(biāo),保存至CPoint類型的數(shù)組fpt中。
表1 各方位在極坐標(biāo)上的角度和弧度值Tab.1 The parties on the polar angle and radian value
3.2.2 繪制風(fēng)向玫瑰圖
計(jì)算出各方位風(fēng)頻坐標(biāo)后,用直線連接16個(gè)坐標(biāo)點(diǎn)后,但通常還需要繪制表示風(fēng)頻大小的同心圓[9],繪制表示各方位的放射直線,標(biāo)注方位符號,在中心位置標(biāo)注靜風(fēng)頻率(如標(biāo)注C=19.2,表示靜風(fēng)頻率為19.2%),注明說明性文本,對曲線填充顏色等。重要代碼如下[10]。
/*連接坐標(biāo)點(diǎn)*/
CPen pen(PS_SOLID, 2, pMain->m_colorf);
dc.SelectObject(pen);
for(int j=0; j<16; j++){
dc.MoveTo(fpt[j%16]);
dc.LineTo(fpt[(j+1)%16]);}
/*填充曲線*/
CBrush brhf(pMain->m_colorf);
dc.BeginPath();
dc.MoveTo(fpt[0]);
for(int i=0; i<16; i++){
dc.LineTo(fpt[(i+1)%16]);}
dc.EndPath();
rgnf.CreateFromPath(&dc);
dc.FillRgn(&rgnf, &brhf);
基礎(chǔ)數(shù)據(jù)的excel數(shù)據(jù)表可支持一種或多種格式,本程序支持的其中一種比較典型的格式如表2所示,驗(yàn)證所用數(shù)據(jù)為XX縣2010年1月逐日定時(shí)風(fēng)向風(fēng)速數(shù)據(jù)。
表2 原始數(shù)據(jù)格式Tab.2 The form at of the original data
將基本數(shù)據(jù)導(dǎo)入成功后,自動在程序界面左邊顯示計(jì)算出的各方位風(fēng)頻和平均風(fēng)速的數(shù)值。點(diǎn)擊繪圖功能按鈕可在程序主界面繪制出風(fēng)玫瑰圖。如圖3所示。
圖3 繪制結(jié)果Fig.3 The results of the draw
程序基于VC++實(shí)現(xiàn)了對風(fēng)要素基礎(chǔ)數(shù)據(jù)的導(dǎo)入、自動統(tǒng)計(jì)和繪制風(fēng)玫瑰圖。運(yùn)用到實(shí)際工作中,有效地提高了工作效率;同時(shí)共享到網(wǎng)絡(luò),受到使用者一致好評。但程序也存在一些不足,如數(shù)據(jù)導(dǎo)入方式和風(fēng)玫瑰圖風(fēng)格均較單一,需在今后作改進(jìn)。
[1]邢婷,鄭有飛,朱勇,等.云南風(fēng)能資源及其開發(fā)利用研究進(jìn)展[J].氣象與環(huán)境科學(xué),2013,36(4):55-61.XING Ting,ZHENG You-fei,ZHU Yong,et al.Wind energy resources and its exploitation and utilization of research progress in yunnan[J].Meteorology and Environmental Science,2013,36(4):55-61.
[2]王新生.淺談風(fēng)玫瑰圖在城市規(guī)劃中的應(yīng)用[J].武測科技,1994(3):35-38.WANG Xin-sheng.Introduction to the wind rose in the application of the urban planning[J].Wuhan Measurement Technology,1994(3):35-38.
[3]霍煥.風(fēng)玫瑰圖在大氣污染評價(jià)中的應(yīng)用[J].環(huán)境保護(hù),1983(5):17-19.HUO Huan.The wind rose in the application of atmospheric pollution evaluation[J].Environmental Protection,1983(5) :17-19.
[4]佚名.風(fēng)玫瑰圖[J].吉林交通科技,1995(3):51-52.Anonymous.Thewind rose[J].Jilin Traffic Science and Technology,1995(3):51-52.
[5]曹麗娟,周玲,陳艷麗,等.風(fēng)玫瑰圖的研究與程序自動成圖設(shè)計(jì)[J].計(jì)算機(jī)與現(xiàn)代化,2013(2):134-137,146.CAO Li-juan,ZHOU Ling,CHEN Yan-li,et al.The wind rose the research and application of automatic mapping design[J].Computer&Modern,2013(2):134-137,146.
[6]郝建,張紅瑞,呂延崗.VC++和Excel對象接口的研究與應(yīng)用[J].石家莊鐵道學(xué)院學(xué)報(bào):自然科學(xué)版,2009,22(4):75-78,81.HAO Jian,ZHANG Hong-rui,LV Yan-gang.Vc++and the research and application of Excel object interface[J].Shijiazhuang Railway Institute:Natural Science Edition,2009,22(4):75-78,81.
[7]陳夕松,邵祥兵.基于Windows GDI的圖形編程[J].微計(jì)算機(jī)信息,1998(5):50-52.CHEN Xi-song,SHAO Xiang-bing.Based on the Windows GDI graphics programming[J].Microcomputer Information,1998(5):50-52.
[8]李忠.為什么要使用弧度制[J].數(shù)學(xué)通報(bào),2009,48(11):1-3,7.LIZhong.Why use radian system[J].Mathematics Bulletin,2009,48(11):1-3,7.
[9]王建莊,余秀娟,譚光洪,等.風(fēng)向玫瑰圖的精確繪制[J].廣東氣象,2010,32(5):48-49.WANG Jian-zhuang,YU Xiu-juan,TAN Guang-hong,et al.The wind rose diagram drawn exactly [J].Guangdong Meteorological,2010,32(5):48-49.
[10]劉銳寧,梁水,李偉明.Visual C++開發(fā)實(shí)戰(zhàn)1200例[M].北京:清華大學(xué)出版社,2013.