李淑靜 王錫良 王李萌 謝凱
1.黑水縣氣象局;2.汶川縣氣象局
為了實現(xiàn)對黑水縣境內(nèi)的災(zāi)害性天氣進行監(jiān)測,以CIMISS 平臺作為數(shù)據(jù)源,采用C#語言,結(jié)合Quartz.NET 開發(fā)了黑水縣災(zāi)害性天氣監(jiān)測預(yù)警業(yè)務(wù)平臺。結(jié)果表明,該平臺能對黑水縣境內(nèi)的大風、強降水和雷電等災(zāi)害性天氣信息進行實時監(jiān)測,在實況數(shù)據(jù)達到一定的閾值時,通過自動播放聲音、界面展示和發(fā)送手機短信等方式,及時對氣象、決策、電力等部門的相關(guān)工作人員進行災(zāi)害性天氣預(yù)警。極大地減輕了工作人員的勞動強度,提高了工作效率,在氣象服務(wù)和防災(zāi)減災(zāi)工作中發(fā)揮了重要作用。
黑水縣位于阿壩藏族羌族自治州中部、青藏高原東南緣橫斷山脈中段北端的岷江上游,岷山與邛崍山脈交匯處,以境內(nèi)黑水河得名??h域地勢由西北向東南傾斜,地形主要為高山峽谷地貌,高程由1500 ~4000m。黑水縣屬季風高原型氣候,旱、雨季分明,日照充足,氣溫年較差較小,日較差較大[1-5]。獨特的地形造就了明顯的立體性氣候,大風、強降水、雷電等災(zāi)害性天氣頻發(fā),災(zāi)害性天氣及其帶來的山洪、泥石流、山體滑坡等次生災(zāi)害嚴重危及人民群眾的生命財產(chǎn)安全。為了避免或減輕災(zāi)害性天氣造成的危害,除了需要準確和可靠的天氣預(yù)報,還要對天氣發(fā)展、演變過程中的信息進行監(jiān)測,當天氣實況數(shù)據(jù)達到一定的閾值,可能會造成災(zāi)害時,及時對相關(guān)人員進行預(yù)警,以采取一切必要的防范措施?;谶@一需求,以CIMISS 為數(shù)據(jù)源,選用C#開發(fā)語言,結(jié)合Quartz.NET 開發(fā)黑水縣災(zāi)害性天氣監(jiān)測預(yù)警業(yè)務(wù)平臺,實現(xiàn)對黑水縣境內(nèi)的天氣實況信息進行不間斷的可靠監(jiān)測。當滿足一定的條件時,通過播放告警聲音、軟件界面顯示和發(fā)送手機短信進行預(yù)警。及時的災(zāi)害性天氣預(yù)警信息為決策部門的決策部署提供了客觀參考,為防災(zāi)減災(zāi)贏得寶貴時間。
為了實現(xiàn)對天氣信息進行監(jiān)測,本平臺以全國綜合氣象信息共享系統(tǒng)CIMISS 作為數(shù)據(jù)來源,以Quartz.NET 作為.NET 平臺下的作業(yè)調(diào)度系統(tǒng),以實現(xiàn)連續(xù)、穩(wěn)定和可靠的作業(yè)調(diào)度。系統(tǒng)運行時,Quartz.NET 調(diào)度各個作業(yè)每隔5min 對CIMISS 分布式數(shù)據(jù)環(huán)境中屬于黑水縣境內(nèi)的1h 強降水、3h 強降水、大風和雷電數(shù)據(jù)進行監(jiān)測,當監(jiān)測到實況數(shù)據(jù)達到一定的閾值時,立即以播放告警聲音、界面顯示和發(fā)送手機短信等方式進行預(yù)警。如圖1所示。
圖1 系統(tǒng)總體架構(gòu)圖Fig.1 Overall architecture diagram of the system
全國綜合氣象信息共享平臺(China Integrated Meteorological Information Service System,簡稱CIMISS)由中國氣象局設(shè)計、研發(fā)。集氣象數(shù)據(jù)收集、加工處理、存儲管理和共享服務(wù)于一體,由收集與分發(fā)模塊CTS、數(shù)據(jù)加工處理模塊DPC、數(shù)據(jù)存儲管理模塊SOD、綜合業(yè)務(wù)監(jiān)控模塊MCP、數(shù)據(jù)共享服務(wù)模塊GDS 五個功能模塊組成,分別部署在國家和各省級氣象數(shù)據(jù)中心。提供包含l4 類147 種實時、歷史數(shù)據(jù)的在線存儲服務(wù)。在全國推行統(tǒng)一的技術(shù)架構(gòu)、數(shù)據(jù)處理流程、數(shù)據(jù)處理標準、數(shù)據(jù)存儲規(guī)格和服務(wù)規(guī)范,為氣象業(yè)務(wù)和科研用戶提供快捷、便利的數(shù)據(jù)應(yīng)用環(huán)境。
Quartz.NET 是一個功能強大的、開源、輕量的作業(yè)調(diào)度框架,是Java 作業(yè)調(diào)度系統(tǒng)Quartz 在.NET 平臺的實現(xiàn),可用于WinForm 和ASP.NET 應(yīng)用中??梢杂盟鼇頌閳?zhí)行一個作業(yè)而創(chuàng)建簡單的或復雜的調(diào)度,從小型應(yīng)用到大型企業(yè)級系統(tǒng)都能適用。其核心元素包括調(diào)度器Scheduler,觸發(fā)器Trigger 和作業(yè)Job。其中Scheduler由SchedulerFactor 創(chuàng)建,是實際執(zhí)行調(diào)度的控制器,管理Quartz.NET 應(yīng)用運行時環(huán)境。Trigger 和Job 是任務(wù)調(diào)度的元數(shù)據(jù),Trigger 用于定義任務(wù)調(diào)度的時間觸發(fā)規(guī)則,即按照什么時間規(guī)則去執(zhí)行任務(wù)。Job 是作業(yè)的類型,描述了作業(yè)是如何執(zhí)行的。JobDetail 是Job 的實例,它包含了該實例的執(zhí)行所需要的數(shù)據(jù)。一個Job 可以關(guān)聯(lián)多個Trigger,但是一個Trigger 只能關(guān)聯(lián)一個Job。一個調(diào)度容器Scheduler中可以注冊多個JobDetail 和Trigger。當Trigger 與JobDetail 組合,就可以被Scheduler 容器調(diào)度了。
建立.NET 項目,在工程中添加對Quartz.DLL 文件的引用,并引入命名空間:
using Quartz;
Quartz.NET 采用了基于多線程的架構(gòu)。程序啟動時,框架初始化一套Worker 線程,這些線程被調(diào)度器用來執(zhí)行預(yù)定的作業(yè)。作業(yè)是一個執(zhí)行任務(wù)的.NET 類,需要實現(xiàn)Quartz.IJob 接口和IJob 接口中包含的唯一的Execute()方法,作業(yè)從這里開始執(zhí)行,Execute()方法內(nèi)就是定時執(zhí)行的工作代碼。下面以監(jiān)測強降水為例,進行說明。
Dictionary<string,List<RainInfo>> dict_cur =new Dictionary<string,List<RainInfo>>();
List<RainInfo> lstShow = new List<RainInfo>();
CimissHelper cimissHelper = new CimissHelper();
foreach (string curTimeRange in cimissHelper.strLstRainRangetime)
{
List<RainInfo> lstRet = new List<RainInfo>();
dict_cur.Clear();
if (curTimeRange == "OneHourRange")
{
//從CIMISS 獲取時間段1 小時內(nèi)的降水合計
dict_cur = cimissHelper.getRainFromCimiss(cimissHelper.strTimeRange_callRain_oneHour,"OneHourRange");
//處理從cimiss 返回的1 小時降水數(shù)據(jù),發(fā)送手機預(yù)警短信,返回應(yīng)該被顯示的數(shù)據(jù)列表。
if (dict_cur.Count > 1)
{
lstShow = ProcessReturn_Rain(dict_cur,dict_old_rain_oneHour,"OneHourRange");
//把數(shù)據(jù)更新到界面的對應(yīng)grid
FrmMain.ShowRainData(lstShow,curTimeRange);
}
}
else if (curTimeRange == "ThreeHoursRange")
{
(以下代碼與上雷同,略)
}
}
實現(xiàn)從CIMISS 中獲取降水數(shù)據(jù)的代碼如下:
public Dictionary<string,List<RainInfo>>getRainFromCimiss(string curTimeRange,string strCurTimeRange)
{
string statEleValueRanges = "";//降水統(tǒng)計值范圍
Dictionary<string,List<RainInfo>> dictTime_rainData = new Dictionary<string,List<RainInfo>>();//雨的時間及其對應(yīng)的數(shù)據(jù)列表
string domainName = "http://10.194.89.55/cimiss-web/api?";
string userId = "userId=BCCD_****_****"+"&";
string pwd = "pwd=****"+"&";
//statSurfEleInRegion:按時間段、地區(qū)統(tǒng)計地面數(shù)據(jù)要素
string interfaceId = "interfaceId=statSurfEleInReg ion"+"&";
//降水從“中國地面分鐘降水資料” 中讀取
string dataCode = "dataCode=SURF_CHN_PRE_MIN"+"&";
string elements = "elements="+"Station_Name,Cnty,Lat,Lon,Alti&statEles=SUM_PRE"+"&";
string timeRange = "timeRange="+curTimeRange+"&";
string adminCodes = "adminCodes="+"513228"+"&"; //黑水縣的行政編碼:513228
if (strCurTimeRange == "OneHourRange")
// 統(tǒng)計降水量:一小時降水超過10 毫米
statEleValueRanges = "statEleValueRanges="+"SUM_PRE:[10,999]"+"&";
else if(strCurTimeRange == "ThreeHoursRange")
// 統(tǒng)計降水量:三小時降水超過25 毫米
statEleValueRanges = "statEleValueRanges="+"SUM_PRE:[25,999]"+"&";
string orderBy = "orderBy=SUM_PRE:asc"+"&"; //以降水統(tǒng)計字段升序排序
string dataFormat = "dataFormat="+"json";
string url = domainName+userId+pwd+interfaceId+dataCode+elements+timeRange+adminCodes+statEleValueRanges+orderBy+dataFormat;
//返回json 格式的字符串
string strRstJson = HttpUitls.GetHttpResponse(url);
JObject jsonObj = JObject.Parse(strRstJson);
//查詢成功,并且有數(shù)據(jù)返回
if ((int)jsonObj["returnCode"]== 0 && (int)jsonObj["rowCount"]> 0)
//處理從cimiss 返回的json 格式的數(shù)據(jù)
dictTime_rainData = ProcessRetText_rain(jsonObj,strCurTimeRange);
return dictTime_rainData;
當有滿足條件的降水數(shù)據(jù)時,調(diào)用通信公司的短信發(fā)送接口發(fā)送預(yù)警短信。代碼如下:
string Content = strContent;
string PhoneNumbersReceive = "";//接收預(yù)警信息的手機號碼
string SignName = ""; //短信簽名
SignName = "[黑水氣象 黑水應(yīng)急]";
PhoneNumbersReceive = GetPhoneNumbersFrome Cfg("rain");
StringBuilder sb = new StringBuilder();
sb.Append("LoginName=").Append("AB***")//賬號
.Append("&pwd=").Append("AB***")//密碼
.Append("&Mobile=").Append(PhoneNumbersReceive)
.Append("&Content=").Append(Content) //短信內(nèi)容
.Append("&SignName=").Append(SignName)//短信簽名
.Append("&FeeType=").Append("2")//套餐類型
.Append("&TimingDate=&ExtCode=");//其他參數(shù)
string url = "https://sdkulink.domain.com:8082/Api/SendSms";
string reuslt = CimissHelper.PostSMS(url,sb.ToString()); //以post 方式提交
......
基于CIMISS 的災(zāi)害性天氣監(jiān)測預(yù)警平臺在黑水縣氣象局投入業(yè)務(wù)運行后,系統(tǒng)能以5min 的時間間隔對黑水縣境內(nèi)的強降水、大風和雷電的發(fā)生發(fā)展情況進行連續(xù)監(jiān)測,在實況數(shù)據(jù)達到一定的閾值時,通過自動發(fā)送手機短信等方式,及時對氣象、決策、電力等部門的相關(guān)工作人員進行災(zāi)害性天氣預(yù)警,極大地減輕了工作人員的勞動強度,提高了工作效率。該平臺還可以根據(jù)實際的工作需要,對其功能進行擴展開發(fā),對更多的實況氣象數(shù)據(jù)進行監(jiān)測,以進一步發(fā)揮其自動、及時、高效的優(yōu)勢在氣象服務(wù)工作中的作用。