張志堅,伍光勝,胡琳
(廣州市氣象信息網(wǎng)絡(luò)中心,廣東廣州 511430)
?
多源能見度數(shù)據(jù)監(jiān)測系統(tǒng)的設(shè)計與實現(xiàn)
張志堅,伍光勝,胡琳
(廣州市氣象信息網(wǎng)絡(luò)中心,廣東廣州 511430)
摘 要:介紹多源能見度數(shù)據(jù)監(jiān)測系統(tǒng)的設(shè)計方案。闡述利用C#多線程技術(shù)實現(xiàn)對多源能見度數(shù)據(jù)的采集與入庫?;诎俣鹊貓DJavaScript API的二次應(yīng)用及AJAX技術(shù)的異步加載,實現(xiàn)對能見度儀狀態(tài)和實時數(shù)據(jù)的動態(tài)監(jiān)控;采用ASP.NET的MSChart圖表插件,以Spline曲線形式實現(xiàn)對不同能見度數(shù)據(jù)的對比展示。
關(guān)鍵詞:計算機技術(shù)與應(yīng)用;能見度;多線程;百度地圖API;AJAX技術(shù);數(shù)據(jù)展示
張志堅,伍光勝,胡琳.多源能見度數(shù)據(jù)監(jiān)測系統(tǒng)的設(shè)計與實現(xiàn)[J].廣東氣象,2016,38(3):70 -73.
隨著氣象觀測技術(shù)的發(fā)展,能見度的觀測基本以自動觀測為主要手段,通過在自動氣象站系統(tǒng)中加入能見度觀測儀,實現(xiàn)對能見度觀測數(shù)據(jù)的自動采集和傳輸。目前廣東省各氣象臺站已布設(shè)了一定數(shù)量的能見度自動觀測儀,以廣州市氣象局為例,共建成的能見度觀測儀有21個,其中從化局觀測站、番禺局觀測站、花都局觀測站、增城局觀測站、蘿崗觀測站等5個國家站通過專線上傳數(shù)據(jù),已接入?yún)^(qū)域自動站采集器實現(xiàn)數(shù)據(jù)無線上傳的能見度儀站點有13個,其他3個站點通過本地FTP的方式上傳。能見度作為發(fā)布灰霾和大霧等氣象災(zāi)害預(yù)警信號的重要參考要素,建立基于歸屬地的能見度數(shù)據(jù)監(jiān)測系統(tǒng),能夠及時準確地為預(yù)報人員提供實況數(shù)據(jù),為精準的灰霾發(fā)布和大霧災(zāi)害預(yù)警提供有效的數(shù)據(jù)支撐,同時實現(xiàn)了對能見度觀測設(shè)備的有效管理和實時監(jiān)控,對能見度監(jiān)測網(wǎng)的正常運行提供有力的保障。
由于能見度數(shù)據(jù)需要通過多種傳輸途徑來獲取,所以監(jiān)測系統(tǒng)需要解決多源數(shù)據(jù)采集的需求,對格式不一致的數(shù)據(jù)進行標準化處理、入庫并實現(xiàn)集中展示[1 -2]。能見度監(jiān)測系統(tǒng)的總體架構(gòu)如圖1所示,系統(tǒng)由兩部分組成,即數(shù)據(jù)采集入庫及數(shù)據(jù)展示。
圖1 能見度業(yè)務(wù)監(jiān)測平臺總體架構(gòu)示意圖
多源數(shù)據(jù)采集入庫主要針對數(shù)據(jù)源頭分散且數(shù)據(jù)格式、傳輸方式不一致的能見度數(shù)據(jù),采用C#多線程技術(shù)來實現(xiàn)數(shù)據(jù)采集、處理、入庫。不同采集方式創(chuàng)建不同線程,做到不同傳輸方式之間的數(shù)據(jù)采集互不干擾,從而提高數(shù)據(jù)采集程序的采集效率和保證數(shù)據(jù)采集的可靠性[3]。
考慮到能見度業(yè)務(wù)展示平臺的可維護性以及擴展性,使系統(tǒng)結(jié)構(gòu)更加清晰,符合高內(nèi)聚、低耦合原則,采用分層軟件設(shè)計思想[4],將Web服務(wù)應(yīng)用劃分為表現(xiàn)層、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層,充分考慮類以及對象關(guān)系,將具備同性質(zhì)的類組織到一起,形成對應(yīng)的類層次結(jié)構(gòu)。表現(xiàn)層為系統(tǒng)人機交互界面,表現(xiàn)層根據(jù)具體業(yè)務(wù)需求實例化業(yè)務(wù)邏輯層的類對象,對業(yè)務(wù)需求進行數(shù)據(jù)展現(xiàn),盡量不參與業(yè)務(wù)邏輯處理,以便降低結(jié)構(gòu)層之間的耦合度。業(yè)務(wù)邏輯層跟系統(tǒng)功能息息相關(guān),是系統(tǒng)業(yè)務(wù)處理的核心層,為系統(tǒng)功能提供數(shù)據(jù)和業(yè)務(wù)邏輯處理。數(shù)據(jù)訪問層作為數(shù)據(jù)實體層訪問的中間件,由業(yè)務(wù)邏輯層進行調(diào)用,實現(xiàn)數(shù)據(jù)的查詢與更新操作。
2.1多線程數(shù)據(jù)采集的實現(xiàn)
數(shù)據(jù)采集程序由主線程使用Timer定時器實現(xiàn)對能見度數(shù)據(jù)的周期性采集,Timer運行的核心是線程池,Timer每到間隔時間后就會激發(fā)響應(yīng)事件,因此要申請線程來執(zhí)行對應(yīng)的響應(yīng)函數(shù),Timer將獲取線程的工作都交給了線程池來管理。通過Interval屬性設(shè)定Timer采集周期,通過Tick事件設(shè)置響應(yīng)事件。采集程序開始時啟動定時器計時,當定時器到了一定時間間隔后,激發(fā)Tick響應(yīng)事件,調(diào)用EventHandler委托,針對FTP、GPRS和WebService這3種數(shù)據(jù)傳輸方式分別創(chuàng)建數(shù)據(jù)采集子線程[5]。數(shù)據(jù)采集子線程創(chuàng)建完后重新進入下一個時次的數(shù)據(jù)采集計時。數(shù)據(jù)采集流程如圖2所示。
圖2 數(shù)據(jù)采集流程圖
FTP數(shù)據(jù)采集線程開始后,調(diào)用FtpHelper類的FtpDownload()方法讀取上一時次的數(shù)據(jù)采集參數(shù)進行數(shù)據(jù)文件FTP下載。數(shù)據(jù)文件下載成功后臨時保存在本地目錄,F(xiàn)TP數(shù)據(jù)采集線程接著調(diào)用數(shù)據(jù)文件解析類ProcessRTDFile進行數(shù)據(jù)標準化處理,然后調(diào)用數(shù)據(jù)庫訪問類SQLHelper進行數(shù)據(jù)入庫,最后更新數(shù)據(jù)采集參數(shù)并結(jié)束線程;若數(shù)據(jù)文件下載失敗,直接結(jié)束線程。數(shù)據(jù)訪問類SQLHelper使用ADO.NET數(shù)據(jù)庫訪問技術(shù)進行封裝,該類定義連接數(shù)據(jù)庫、關(guān)閉連接、數(shù)據(jù)查詢、數(shù)據(jù)更新、數(shù)據(jù)修改等一系列數(shù)據(jù)庫訪問操作方法。
GPRS數(shù)據(jù)采集線程調(diào)用GPRSHelper類以GPRS傳輸方式采集并在本地生成XML文件。若有XML數(shù)據(jù)文件生成,則調(diào)用ProcessXMLFile類解析XML文件節(jié)點和標準化處理,最后調(diào)用SQLHelper類數(shù)據(jù)入庫;若無XML數(shù)據(jù)文件生成,則直接結(jié)束線程。
WebService數(shù)據(jù)采集線程調(diào)用WebSHelper類以接口調(diào)用的方式進行數(shù)據(jù)采集,對返回成功的JSON數(shù)據(jù)流調(diào)用ProcessJSON類進行數(shù)據(jù)解析處理,處理完后調(diào)用SQLHelper類數(shù)據(jù)入庫;調(diào)用接口若無數(shù)據(jù)流返回,說明該時次無數(shù)據(jù),則線程結(jié)束。
2.2數(shù)據(jù)庫表的設(shè)計
數(shù)據(jù)庫使用SQLServer2008關(guān)系型數(shù)據(jù)庫,設(shè)計工具使用PowerDesigner,分別設(shè)計站點信息表STATIONINFO、數(shù)據(jù)實時表CURRENTDATA和數(shù)據(jù)歷史表HISTORYDATA。為保證表結(jié)構(gòu)的完整性,站點信息表STATIONINFO使用站號字段OBTID作為主鍵,數(shù)據(jù)實時表CURRENTDATA和數(shù)據(jù)歷史表HISTORYDATA都使用<OBTID,DDATETIME>作為主鍵。數(shù)據(jù)歷史表HISTORYDATA對DDATETIME列創(chuàng)建索引,從而提高數(shù)據(jù)的檢索效率。站點信息表包含站號、站點名稱、站點經(jīng)度、站點緯度、站點類型、是否啟用等字段;實時表和歷史表包含站號、來報時間、1 min滑動平均能見度、10 min滑動平均能見度、小時最小能見度以及最小能見度出現(xiàn)的時間等字段。
3.1百度地圖導(dǎo)入及配置
在使用百度地圖API服務(wù)[6 -8]前,必須在百度地圖LBS開放平臺上申請密鑰(ak)并創(chuàng)建應(yīng)用、配置服務(wù)。使用JavaScript標簽<script>以腳本引入的方式加載百度地圖服務(wù):<script src=”http:/ / api.map.baidu.com/ api?v = 1.5&ak=您的密鑰”type =”text/ javascript”></ script>。然后通過newBMap(container:String | HTMLElement,[opts:MapOptions])在指定的容器內(nèi)創(chuàng)建地圖實例,之后需要調(diào)用BMap.center-AndZoom()方法設(shè)置地圖中心點坐標和地圖顯示級別對地圖進行初始化,未進行初始化的地圖不能進行任何操作。調(diào)用BMap.Boundary().get(“廣州”,function(args))方法獲取廣州行政區(qū)劃圖邊界多邊型的點數(shù)組,通過BMap.Polygon (points:Array<Point>,[opts:PolygonOptions])創(chuàng)建多邊形覆蓋物,再調(diào)用addOverlay(overlay:Overlay)將廣州行政區(qū)劃邊界覆蓋物添加到地圖中。至此便完成了百度地圖的加載和基本配置。
3.2基于AJAX地圖標注加載
站點信息和實況數(shù)據(jù)的加載使用jQuery的AJAX異步加載數(shù)據(jù)功能,在不重新加載整個網(wǎng)頁的情況下,每2min向服務(wù)器發(fā)起異步POST請求對網(wǎng)頁的地圖站點信息進行數(shù)據(jù)刷新。AJAX異步請求代碼如下:
$(function(){
$.a(chǎn)jax({
type:"Post",
url:"refresh.a(chǎn)spx",
contentType:"application/ json;charset = utf -8",
dataType:"text",
success:function(response){
/ /數(shù)據(jù)返回成功
/ /添加站點信息標注
addMarker(response);
},
error:function(xmlReq,err,c){
/ /請求失敗處理代碼
}
});
});服務(wù)端接收到請求后通過按指定的業(yè)務(wù)邏輯規(guī)則查詢數(shù)據(jù),為方便前端數(shù)據(jù)解析處理,業(yè)務(wù)邏輯層按照輕量級的數(shù)據(jù)交換格式JSON對站號、站名、經(jīng)緯度、時次以及能見度數(shù)值等信息進行數(shù)據(jù)封裝并返回給前端。封裝的數(shù)據(jù)格式如下:{'records':[{'sid':'G1088','sname':'廣州五山站','datetime':'2015 -10 -12 08:20:00','value':'32.6','lng':'113.3441','lat':'23.15678'},{'sid':'G3106','sname':'呂田鎮(zhèn)東升','datetime':'2015 -10 -12 08:20:00','value':'41.7','lng':'113.86','lat':'23.81821'}]}。AJAX請求成功后,回調(diào)函數(shù)success(data,textStatus,jqXHR)處理返回數(shù)據(jù),編寫JavaScript腳本對返回的能見度數(shù)值和時次進行異常判斷,通過調(diào)用BMap.Icon(url:String,size:Size,[opts:IconOptions])方法創(chuàng)建自定義圖標樣式,正常站點設(shè)置為綠色圖標,異常站點設(shè)置為紅色圖標,然后根據(jù)返回的站點經(jīng)緯度信息調(diào)用Map.a(chǎn)ddOverlay(marker:Point)方法向地圖中添加自定義標注。為方便對站點信息和數(shù)據(jù)的查看,使用Marker.a(chǎn)ddEventListener(event:String,handler:Function)方法對地圖標注添加鼠標事件進行監(jiān)聽,當鼠標移動和停留到標注上方時,調(diào)用BMap.InfoWindow()創(chuàng)建信息窗對象顯示該站點的站號、站名、數(shù)據(jù)時次和能見度數(shù)值等信息,實現(xiàn)的效果如圖3所示。
3.3多站點集成曲線圖的實現(xiàn)
能見度變化曲線圖使用ASP.NET圖表控件[8]Chart以Spline形式進行集中展示,方便對多站點能見度變化進行對比分析??紤]到曲線繪制的美觀性,數(shù)據(jù)集不能過多,過多的數(shù)據(jù)集會導(dǎo)致曲線的標注點過于密集,故在能見度數(shù)據(jù)集的時間跨度上選取了“過去2小時”、“過去12小時”、“過去24小時”和“過去48小時”這4個時間段?!斑^去2小時”數(shù)據(jù)集的時間分辨率是每5 min 1次,“過去12小時”數(shù)據(jù)集的時間分辨率是每30 min 1次,而“過去24小時”和“過去48小時”的數(shù)據(jù)集均為整點時次數(shù)據(jù)。
圖3 基于百度地圖的站點信息及數(shù)據(jù)監(jiān)測效果
圖表區(qū)域通過<asp:ChartArea></ asp:ChartArea>進行初始化,包括坐標軸、圖表背景等屬性的設(shè)置。數(shù)據(jù)列屬性樣式用標簽<asp:Series></ asp:Series>設(shè)置,包括系列名稱Name、曲線顏色Color、圖表形式ChartType、數(shù)據(jù)標點樣式MarkerStyle、曲線寬度BorderWidth等屬性。4個時間段的數(shù)據(jù)集通過下拉框控件<asp:DropDownList></ asp:DropDownList>實現(xiàn)時間段選擇,下拉框的值變化后觸發(fā)SelectedIndexChanged(object sender,EventArgs e)事件函數(shù)對Chart圖表控件進行數(shù)據(jù)源的刷新與重新綁定。數(shù)據(jù)列圖例選擇則通過多選框控件<asp:CheckBoxList></ asp:CheckBoxList>來實現(xiàn),多選框控件使用DataSource屬性和DataBind()進行站點信息初始化,每次多選框的點擊事件都會觸發(fā)圖表控件數(shù)據(jù)源的刷新與重新綁定。為了使圖例和所屬曲線的對應(yīng)更直觀性,把數(shù)據(jù)列的圖例及其曲線顏色設(shè)置為同一種顏色(圖4)。
多源能見度數(shù)據(jù)監(jiān)測系統(tǒng)已經(jīng)在廣州市氣象局業(yè)務(wù)運行,為氣象預(yù)警預(yù)報提供歷史及實況的能見度數(shù)據(jù),實現(xiàn)了歸屬地能見度網(wǎng)站點可視化統(tǒng)一管理、監(jiān)控和實時數(shù)據(jù)應(yīng)用,展示平臺以不同的數(shù)據(jù)形式對表現(xiàn)能見度數(shù)據(jù),更具直觀性和可用性。基于C#多線程技術(shù)的多源數(shù)據(jù)采集及百度地圖JavaScript API的WEBGIS展示應(yīng)用實例對于其他氣象探測設(shè)備的數(shù)據(jù)采集及數(shù)據(jù)展示平臺的開發(fā)有一定的參考價值。
圖4 能見度變化曲線效果
參考文獻:
[1]梁慎青,石小英,梁苑苑,等.廣東省氣象信息實時監(jiān)視系統(tǒng)的開發(fā)及應(yīng)用[J]廣東氣象,2008,31(1):57 -58.
[2]羅鳴,江崟,潘國盛.氣象自動站數(shù)據(jù)監(jiān)控平臺的設(shè)計與實現(xiàn)[J].廣東氣象,2012,34(4):57 -58.
[3]伍光勝,敖振浪,李源鴻,等.大型自動氣象監(jiān)測網(wǎng)及數(shù)據(jù)采集中心的設(shè)計及應(yīng)用[J].氣象,2010,36(3):128 -135.
[4]姜永,鄭春明,李國強.基于.NET平臺的三層架構(gòu)軟件框架的設(shè)計與實現(xiàn)[J].計算機技術(shù)與發(fā)展,2011,21(2):77 -78.
[5]伍光勝,李建勇,劉艷中,等.浪涌氣象數(shù)據(jù)采集系統(tǒng)及其關(guān)鍵技術(shù)[J].南京信息工程大學(xué)學(xué)報,2013,5 (4):336 -345.
[6]曹煒,肖瑋.基于WebGIS的贛州市旅游信息查詢系統(tǒng)設(shè)計[J].科技資訊,2014(27):18.
[7]朱小蘭.使用百度地圖JavaScript API開發(fā)旅游線路設(shè)計與行程定制系統(tǒng)[J].產(chǎn)業(yè)與科技論壇,2015,14 (3):44 -45.
[8]孫迪,李沛鴻.百度地圖API在WebGIS中的應(yīng)用[J].河南科技,2013(11):165 -166.
[8]朱健,莊科,周丹,等.MSChart在氣象數(shù)據(jù)圖形化顯示中的應(yīng)用[J].浙江氣象,2008,30(1):58 -62.
中圖分類號:TP38
文獻標識碼:A
doi:10.3868/ j.issn.1007 -6180.2016.03.018
收稿日期:2015 -08 -28
作者簡介:張志堅(1888年生),男,助理工程師,主要從事氣象信息數(shù)據(jù)及網(wǎng)絡(luò)管理工作。E - mail:780670233@qq.com