況 源,李秀娟,周小明,王曉娟
(1.四川省宜賓市氣象局,四川 宜賓 644000;2.高原與盆地暴雨旱澇災(zāi)害四川省重點(diǎn)實(shí)驗(yàn)室,四川 成都 610072)
氣象災(zāi)害是自然災(zāi)害中最為頻繁而又嚴(yán)重的災(zāi)害,隨著經(jīng)濟(jì)的高速發(fā)展,造成的損失亦呈上升趨勢。為了提高氣象在防災(zāi)減災(zāi)中的作用,同時(shí)進(jìn)一步推進(jìn)氣象現(xiàn)代化建設(shè)和加強(qiáng)自動(dòng)氣象站監(jiān)測數(shù)據(jù)、多普勒天氣雷達(dá)產(chǎn)品的融合使用,設(shè)計(jì)并開發(fā)基于SharpMap的氣象監(jiān)測與預(yù)警系統(tǒng)[1-4]。該系統(tǒng)具有業(yè)務(wù)實(shí)用性,不僅能提高氣象部門在應(yīng)對突發(fā)氣象災(zāi)害的速度和服務(wù)質(zhì)量,也能提高專業(yè)氣象服務(wù)能力。
根據(jù)功能需求,將系統(tǒng)設(shè)計(jì)為實(shí)況監(jiān)測與預(yù)警、系統(tǒng)設(shè)置與任務(wù)配置、預(yù)警記錄三個(gè)模塊。其中核心模塊為實(shí)況監(jiān)測與預(yù)警模塊,整合顯示GIS地圖、自動(dòng)氣象站數(shù)據(jù)(使用CIMISS環(huán)境[5-6]的氣象數(shù)據(jù)訪問接口獲取小時(shí)數(shù)據(jù)和5分鐘加密數(shù)據(jù))、多普勒天氣雷達(dá)產(chǎn)品(解析產(chǎn)品文件并繪制成雷達(dá)回波圖)和災(zāi)害隱患點(diǎn)信息,達(dá)到設(shè)定的預(yù)警閾值后以多種方式預(yù)警(顏色、聲音、短信等)。
SharpMap[7-15]是一個(gè)基于.net使用C#開發(fā)的Map渲染類庫,可以渲染各類GIS數(shù)據(jù),可應(yīng)用于桌面和Web程序。支持點(diǎn)、線、面等要素集合,支持常規(guī)的地圖操作,可編制展示復(fù)雜的地圖主體渲染。支持矢量數(shù)據(jù)格式有ESRI Shape File、PostGIS、Oracle、Microsoft SQLServer、SQLite等;支持柵格數(shù)據(jù)格式有bmp、gif、tif、png、dem等。且具有占用資源較少,響應(yīng)較快,對于.NET環(huán)境支持較好,使用簡單,開源免費(fèi)等優(yōu)點(diǎn)。其使用步驟如下:
(1)下載SharpMap開發(fā)包;
(2)添加SharpMap的UI組件至Visual Studio的工具箱;
(3)給WinForm窗體添加MapBox組件;
(4)為項(xiàng)目添加SharpMap引用,一般來說給WinForm窗體添加MapBox組件后,會自動(dòng)引用SharpMap.dll,如果沒有,需手動(dòng)添加;
(5)在WinForm窗體的Load方法中添加如下代碼,實(shí)現(xiàn)加載地圖文件。
VectorLayer vlayer_yb=new VectorLayer("yibin"); //創(chuàng)建地圖圖層
ShapeFile shp_yb=new ShapeFile(@"shp\宜賓邊界.shp"); //加載地圖Shp文件
shp_yb.Encoding=System.Text.Encoding.GetEncoding("gb2312"); //設(shè)置文字編碼格式
vlayer_yb.DataSource=shp_yb; //為地圖圖層配置數(shù)據(jù)源
CoordinateTransformationFactory ctFact=new
ProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory();
ICoordinateTransformation trans=ctFact.CreateFromCoordinateSystems(ProjNet.CoordinateSystems.GeographicCoordinate System.WGS84,
ProjNet.CoordinateSystems.ProjectedCoordinateSystem.WGS84_UTM(48, true));
vlayer_yb.CoordinateTransformation=trans; //設(shè)置投影方式
mapBox.Map.Layers.Add(vlayer_yb); //將地圖圖層添加到SharpMap的MapBox組件
Coordinate center=new Coordinate(104.47,28.55);
mapBox.Map.Center=trans.MathTransform.Transform(center); //設(shè)置地圖中心顯示位置
mapBox.Refresh(); //刷新MapBox地圖組件
SharpMap為用戶提供了多種圖層,如:Vector Layer矢量圖層、LabelLayer標(biāo)注圖層、WmsLayer服務(wù)圖層、GdiImageLayer圖像圖層、TileLayer瓦片圖層。在系統(tǒng)中疊加自動(dòng)氣象站數(shù)據(jù)時(shí),要同時(shí)標(biāo)注圓點(diǎn)、站點(diǎn)名稱、實(shí)況數(shù)據(jù),并且達(dá)到預(yù)警值以紅色標(biāo)注和控制各級別站點(diǎn)顯示。SharpMap中提供的現(xiàn)有圖層不能滿足功能需求,所以需要自定義圖層類來實(shí)現(xiàn)該功能,核心代碼如下:
class MyLayer:ILayer{
public void Render(System.Drawing.Graphics g,SharpMap.Map map) {//圖層繪制
SolidBrush b_dot=new SolidBrush(Color.FromArgb(33,136,104));
SolidBrush b_str=new SolidBrush(Color.FromArgb(5,76,54));
SolidBrush b_str_r=new SolidBrush(Color.FromArgb(255,0,0));
for(int i=0;i if((pointsList[i][12]=="全要素" && IsShowPointDjz)||(pointsList[i][12]=="1" && IsShowPointYlz)||(pointsList[i][12]=="2" && IsShowPointQyz)||(pointsList[i][12]=="4" &&IsShowPointQyz)||(pointsList[i][12]=="6" && IsShowPointQyz)){//控制顯示各級別自動(dòng)氣象站的顯示 PointF p=map.WorldToImage(coorsList[i]); //將大地坐標(biāo)轉(zhuǎn)化為笛卡爾坐標(biāo) g.FillEllipse(b_dot,p.X-3,p.Y-3,6,6); //畫圓點(diǎn)標(biāo)注 g.DrawString(pointsList[i][1],new Font("黑體",9),b_str,p.X-15,p.Y-18); //顯示站點(diǎn)名稱 if(pointDataStyle=="1小時(shí)雨量"){ if(Convert.ToDouble(pointsList[i][7])>= d_r1){ //顯示站點(diǎn)實(shí)況數(shù)據(jù) g.DrawString(pointsList[i][7],new Font("宋體",9),b_str_r,p.X-10,p.Y+5);} //大于預(yù)警閾值以紅色顯示 else{ //顯示站點(diǎn)實(shí)況數(shù)據(jù) g.DrawString(pointsList[i][7],new Font("宋體", 9),b_str, p.X-10,p.Y+5); }} //后面代碼略 }}}} 通過解析雷達(dá)產(chǎn)品文件[16-19],繪制成bmp格式圖片文件后,若要精確地疊加在SharpMap地圖上,必須為該圖片文件生成對應(yīng)的配準(zhǔn)文件。bmp文件的配準(zhǔn)文件的后綴名為bmw,文件名要與對應(yīng)bmp文件名相同,且保存在同一目錄下,配準(zhǔn)文件內(nèi)容有6行數(shù)值: A:柵格地圖的一個(gè)像素在X方向上的像素分辨率; B:平移量; C:旋轉(zhuǎn)量; D:柵格地圖的一個(gè)像素在Y方向上的像素分辨率的負(fù)值; E:柵格地圖左上角像素的笛卡爾坐標(biāo)的X坐標(biāo); F:柵格地圖左上角像素的笛卡爾坐標(biāo)的Y坐標(biāo)。 其中,A=柵格地圖在X方向的地理距離(m)/柵格地圖在X方向的像素點(diǎn)個(gè)數(shù);B、C一般為0;D=-柵格地圖在Y方向的地理距離(m)/柵格地圖在Y方向的像素點(diǎn)個(gè)數(shù);因?yàn)橹行狞c(diǎn)為雷達(dá)站的位置,所以左上角像素的笛卡爾坐標(biāo)可根據(jù)雷達(dá)站經(jīng)緯度推算。系統(tǒng)中為基本反射率雷達(dá)產(chǎn)品(R20)生成的配準(zhǔn)文件內(nèi)容如下: 125 0 0 -125 308831.554887426 3338147.27665223 在SharpMap中加載雷達(dá)回波圖片的代碼如下: GdiImageLayer glayer_radar=new GdiImageLayer("radar",strdir); //strdir為雷達(dá)回波圖片文件的路徑 glayer_radar.InterpolationMode=System.Drawing.Drawing2D.InterpolationMode.Low; //設(shè)置雷達(dá)回波圖的縮放質(zhì)量,因?yàn)槔走_(dá)回波圖為柵格圖像,所以設(shè)置為低質(zhì)量以降低因放大圖像后插值造成信息損失 mapBox.Map.Layers.Add(glayer_radar); //將圖層添加到MapBox組件 1.5.1 程序?qū)崿F(xiàn)自動(dòng)分析各區(qū)縣雷達(dá)回波情況 因雷達(dá)回波圖是以不同顏色表示不同回波強(qiáng)度并按像素繪制而成,即對雷達(dá)回波的分析可視為對各像素顏色的分析。分析各區(qū)縣出現(xiàn)強(qiáng)回波情況的方法為:在圖1逐像素讀取RGB值,如果值為(255,0,0)即為強(qiáng)回波(圖1在繪制時(shí)已將強(qiáng)回波統(tǒng)一繪成RGB(255,0,0)色),記錄該點(diǎn)的坐標(biāo),從圖2相同坐標(biāo)點(diǎn)讀取RGB值,當(dāng)RGB值為非(255,255,255)時(shí),則與表1相匹配,從而判定出所屬區(qū)縣。最終求得各區(qū)縣的強(qiáng)回波數(shù)量和所占面積的百分率。 圖1 匹配地理位置后的雷達(dá)回波 圖2 各區(qū)縣的位置判定 表1 為各區(qū)縣定義的RGB色值 1.5.2 程序?qū)崿F(xiàn)自動(dòng)分析自動(dòng)氣象站附近和災(zāi)害隱患點(diǎn)附近雷達(dá)回波情況 分析自動(dòng)氣象站附近和災(zāi)害隱患點(diǎn)附近雷達(dá)回波情況,使用相同的算法:先將自動(dòng)氣象站的經(jīng)緯度坐標(biāo)轉(zhuǎn)化為笛卡爾坐標(biāo)(x,y)(SharpMap在SharpMap.Map類下提供了該轉(zhuǎn)化函數(shù):PointF WorldToImage(Coordinate p)),與已知的中心點(diǎn)笛卡爾坐標(biāo)(x',y')作偏移量計(jì)算,再轉(zhuǎn)化為像素坐標(biāo),最后用中心點(diǎn)的像素坐標(biāo)(x0,y0)作偏移計(jì)算,就能求出自動(dòng)氣象站在圖1中的坐標(biāo)(X,Y),見下式。通過讀取圖1中坐標(biāo)(X,Y)附近的RGB值,分析出該點(diǎn)附近的雷達(dá)回波情況。分析出的自動(dòng)氣象站附近的雷達(dá)回波情況,可作為排查自動(dòng)站的異常降雨量的依據(jù);分析出的災(zāi)害隱患點(diǎn)附近的雷達(dá)回波情況可彌補(bǔ)在該處未建設(shè)自動(dòng)氣象站的不足。 其中,A為已求得的笛卡爾坐標(biāo)與像素坐標(biāo)轉(zhuǎn)化系數(shù),該系數(shù)與1.4小節(jié)中A的值相同;中心點(diǎn)為雷達(dá)站的位置,(x',y')可用雷達(dá)站經(jīng)緯度轉(zhuǎn)化;(x0,y0)可根據(jù)圖1的分辨率求得。 系統(tǒng)實(shí)現(xiàn)了GIS地圖、自動(dòng)氣象站數(shù)據(jù)、多普勒天氣雷達(dá)產(chǎn)品和災(zāi)害隱患點(diǎn)信息的整合顯示與自動(dòng)預(yù)警,在業(yè)務(wù)運(yùn)行中取得了較好的效果,提高了氣象部門在應(yīng)對突發(fā)氣象災(zāi)害的速度和服務(wù)質(zhì)量,也能提高專業(yè)氣象服務(wù)能力。隨著業(yè)務(wù)需求的提高,后續(xù)還需繼續(xù)豐富雷達(dá)產(chǎn)品和深入分析,系統(tǒng)界面見圖3。 圖3 系統(tǒng)界面1.4 SharpMap中加載雷達(dá)回波圖
1.5 程序?qū)崿F(xiàn)自動(dòng)分析雷達(dá)回波
2 結(jié)束語