況源,周小明,梁富強
(四川省宜賓市氣象局 四川 宜賓 644000)
風玫瑰圖能夠直觀地反應某一地區(qū)風的狀況,故被廣泛地應用到城市規(guī)劃、環(huán)境評價、風能資源評估等工作中[1-3]。風玫瑰圖的繪制工作通常要先對基礎風向、風速數(shù)據(jù)進行統(tǒng)計,計算出16個方位的風頻、平均風速,再借助CAD、Matlab等軟件繪圖,過程工作量大,耗時較長,難度高,出錯率高。所以,編寫一款風玫瑰圖繪制程序,具有工程實際意義。
風玫瑰圖是指在極坐標底圖上點繪出的某一地區(qū)在某一時段內各風向出現(xiàn)的頻率或各風向的平均風速的統(tǒng)計圖。前者為“風向玫瑰圖”,后者為“風速玫瑰圖”。因圖形似玫瑰花朵故名[4]。風向是風吹來的方向,風向一共分為16個方位,以北在起點,每隔22.5°確定一個方向,分別為北(N)、東北偏北 (NNE)、 東 北 (NE)、 東 北 偏 東 (ENE)、 東 (E)、 東 南 偏 東(ESE)、東南(SE)、東南偏南(SSE)、南(S)、西南偏南(SSW)、西南(SW)、西南偏西(WSW)、西(W)、西北偏西(WNW)、西北(NW)、西北偏北(NNW)。風速是指空氣在單位時間內的流過的距離,單位一般為m/s[5]。
程序主要功能有:實現(xiàn)對基礎數(shù)據(jù)的excel方式導入,對基礎數(shù)據(jù)自動統(tǒng)計,風玫瑰圖繪制,曲線調整,自定義顏色填充和風玫瑰圖導出等功能。程序功能設計圖如圖1所示。
圖1 程序功能設計圖Fig.1 Program function design
程序通過導入excel表格的方式加載基礎數(shù)據(jù),程序在加載數(shù)據(jù)時,從約定的有效數(shù)據(jù)起始位置(3行2列)開始遍歷數(shù)據(jù)表,將表中風向、對應風速分別保存到數(shù)組pfdata、pvdata中,且風向風速的對應關系要保持不變。主要代碼如下[6]
void CMainFrame::InitExcel(){
/*此處略去Excel服務器和獲取數(shù)據(jù)Worksheet頁(wht)代碼*/
/*加載數(shù)據(jù)*/
Range range, usedRange;
usedRange.AttachDispatch(wht.GetUsedRange());
range.AttachDispatch(usedRange.GetRows());
long iRowNum=range.GetCount(); //獲 取 已 經 使 用的行數(shù)
range.AttachDispatch(usedRange.GetColumns());long iColNum=range.GetCount();//獲取已經使用的列數(shù)CString*pfdata=new CString[(iRowNum-2)*(iColNum-1)/2]; //用于加載風向數(shù)據(jù)
float*pvdata=new float[(iRowNum-2)*(iColNum-1)/2];//用于加載風速數(shù)據(jù)
for(intm=3; m<=iRowNum; m++){
for (intn=2; n<=iColNum; n++){//遍歷表中風向、風速數(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) {//字 符 串 則 為風向pfdata [((m-3)* (iColNum-1) +n-2)/2]=vResult.bstrVal;}
if(vResult.vt==VT_R8) {//數(shù)字則為風速
pvdata[((m-3)*(iColNum-1)+n-3)/2]= (float)vResult.dblVal;}}
}
/*此處略去退出Excel服務器代碼*/
}
數(shù)據(jù)加載完后,遍歷數(shù)組pfdata數(shù)組統(tǒng)計出風向再各方位出現(xiàn)的次數(shù),保存在fnum數(shù)組中;同時將各方位對應的風速累加到vnum數(shù)組中,主要代碼如下。
/*fnum為存放風向在各方位出現(xiàn)的次數(shù)的數(shù)組,vnum為存放對應風速的累計值的數(shù)組,數(shù)組元素對應各個方位,依 次 為 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ù)得到該方位的風頻(以百分率表示),用各方位風速值之和除以該方位出現(xiàn)次數(shù)得到平均風速。
風玫瑰圖分為風向玫瑰圖和風速玫瑰圖,繪制風玫瑰圖可以分別繪制在兩張玫瑰圖中,亦可以疊加在同一張風玫瑰圖里面。下面以繪制風向玫瑰圖實現(xiàn)過程為例。風向玫瑰圖的繪制過程,首先要將風按16個方位進行統(tǒng)計,計算出各方位的風向頻率,其計算公式為:gn式中:gn為 n方位的風向頻率,fn為所取資料年代內風在n方位出現(xiàn)的次數(shù),n表示方位,共16個方位。c為所取資料年代內靜風的次數(shù)[2]。然后計算為坐標點,連接所有點后,即為基本的風向玫瑰圖。
3.2.1 計算各方位風頻的坐標
風頻在極坐標系上的坐標計算方法如圖2所示,若點A為NE方位在極坐標上的描點,OA長度為風向在NE方位的風頻,角α值如表1所示[8](在 VC++中使用弧度作計算),這樣就能夠算出點 A的坐標(OA×cosα,OA×sinα)。
圖2 風頻在極坐標系上的坐標計算方法Fig.2 Coordinates calculationmethods ofwind frequency on the polar coordinates
此時得到的極坐標還不能直接用于繪圖,因為在Windows應用程序中,繪圖使用GDI坐標系統(tǒng),在GDI坐標系統(tǒng)中原點(0,0)位于左上角,水平軸的正方形向右,垂直軸的正方向向下[7],所以還需要作處理。處理方法是根據(jù)繪圖區(qū)域確定 O 點在 GDI坐標系統(tǒng)的坐標 O′(XO′,YO′)(可以取中心點坐標),與已計算出的A點在極坐標系上坐標A(XA,YA)作計算,得到A點在GDI坐標系統(tǒng)的新坐標A′,計算公式為:A′(XA′,YA′)=(XO′+XA,YO′-YA)。 另外,因風玫瑰圖風格多樣,有的將最里同心圓視為原點(0,0),此情況還需把坐標作進一步處理。同理,計算出其它方位點的坐標,保存至CPoint類型的數(shù)組fpt中。
表1 各方位在極坐標上的角度和弧度值Tab.1 The parties on the polar angle and radian value
3.2.2 繪制風向玫瑰圖
計算出各方位風頻坐標后,用直線連接16個坐標點后,但通常還需要繪制表示風頻大小的同心圓[9],繪制表示各方位的放射直線,標注方位符號,在中心位置標注靜風頻率(如標注C=19.2,表示靜風頻率為19.2%),注明說明性文本,對曲線填充顏色等。重要代碼如下[10]。
/*連接坐標點*/
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);
基礎數(shù)據(jù)的excel數(shù)據(jù)表可支持一種或多種格式,本程序支持的其中一種比較典型的格式如表2所示,驗證所用數(shù)據(jù)為XX縣2010年1月逐日定時風向風速數(shù)據(jù)。
表2 原始數(shù)據(jù)格式Tab.2 The form at of the original data
將基本數(shù)據(jù)導入成功后,自動在程序界面左邊顯示計算出的各方位風頻和平均風速的數(shù)值。點擊繪圖功能按鈕可在程序主界面繪制出風玫瑰圖。如圖3所示。
圖3 繪制結果Fig.3 The results of the draw
程序基于VC++實現(xiàn)了對風要素基礎數(shù)據(jù)的導入、自動統(tǒng)計和繪制風玫瑰圖。運用到實際工作中,有效地提高了工作效率;同時共享到網絡,受到使用者一致好評。但程序也存在一些不足,如數(shù)據(jù)導入方式和風玫瑰圖風格均較單一,需在今后作改進。
[1]邢婷,鄭有飛,朱勇,等.云南風能資源及其開發(fā)利用研究進展[J].氣象與環(huán)境科學,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]王新生.淺談風玫瑰圖在城市規(guī)劃中的應用[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]霍煥.風玫瑰圖在大氣污染評價中的應用[J].環(huán)境保護,1983(5):17-19.HUO Huan.The wind rose in the application of atmospheric pollution evaluation[J].Environmental Protection,1983(5) :17-19.
[4]佚名.風玫瑰圖[J].吉林交通科技,1995(3):51-52.Anonymous.Thewind rose[J].Jilin Traffic Science and Technology,1995(3):51-52.
[5]曹麗娟,周玲,陳艷麗,等.風玫瑰圖的研究與程序自動成圖設計[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對象接口的研究與應用[J].石家莊鐵道學院學報:自然科學版,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].微計算機信息,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ù)學通報,2009,48(11):1-3,7.LIZhong.Why use radian system[J].Mathematics Bulletin,2009,48(11):1-3,7.
[9]王建莊,余秀娟,譚光洪,等.風向玫瑰圖的精確繪制[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ā)實戰(zhàn)1200例[M].北京:清華大學出版社,2013.