李淑靜 王錫良 王李萌 謝凱
1.黑水縣氣象局;2.汶川縣氣象局
為了實現對黑水縣境內的災害性天氣進行監測,以CIMISS 平臺作為數據源,采用C#語言,結合Quartz.NET 開發了黑水縣災害性天氣監測預警業務平臺。結果表明,該平臺能對黑水縣境內的大風、強降水和雷電等災害性天氣信息進行實時監測,在實況數據達到一定的閾值時,通過自動播放聲音、界面展示和發送手機短信等方式,及時對氣象、決策、電力等部門的相關工作人員進行災害性天氣預警。極大地減輕了工作人員的勞動強度,提高了工作效率,在氣象服務和防災減災工作中發揮了重要作用。
黑水縣位于阿壩藏族羌族自治州中部、青藏高原東南緣橫斷山脈中段北端的岷江上游,岷山與邛崍山脈交匯處,以境內黑水河得名。縣域地勢由西北向東南傾斜,地形主要為高山峽谷地貌,高程由1500 ~4000m。黑水縣屬季風高原型氣候,旱、雨季分明,日照充足,氣溫年較差較小,日較差較大[1-5]。獨特的地形造就了明顯的立體性氣候,大風、強降水、雷電等災害性天氣頻發,災害性天氣及其帶來的山洪、泥石流、山體滑坡等次生災害嚴重危及人民群眾的生命財產安全。為了避免或減輕災害性天氣造成的危害,除了需要準確和可靠的天氣預報,還要對天氣發展、演變過程中的信息進行監測,當天氣實況數據達到一定的閾值,可能會造成災害時,及時對相關人員進行預警,以采取一切必要的防范措施。基于這一需求,以CIMISS 為數據源,選用C#開發語言,結合Quartz.NET 開發黑水縣災害性天氣監測預警業務平臺,實現對黑水縣境內的天氣實況信息進行不間斷的可靠監測。當滿足一定的條件時,通過播放告警聲音、軟件界面顯示和發送手機短信進行預警。及時的災害性天氣預警信息為決策部門的決策部署提供了客觀參考,為防災減災贏得寶貴時間。
為了實現對天氣信息進行監測,本平臺以全國綜合氣象信息共享系統CIMISS 作為數據來源,以Quartz.NET 作為.NET 平臺下的作業調度系統,以實現連續、穩定和可靠的作業調度。系統運行時,Quartz.NET 調度各個作業每隔5min 對CIMISS 分布式數據環境中屬于黑水縣境內的1h 強降水、3h 強降水、大風和雷電數據進行監測,當監測到實況數據達到一定的閾值時,立即以播放告警聲音、界面顯示和發送手機短信等方式進行預警。如圖1所示。

圖1 系統總體架構圖Fig.1 Overall architecture diagram of the system
全國綜合氣象信息共享平臺(China Integrated Meteorological Information Service System,簡稱CIMISS)由中國氣象局設計、研發。集氣象數據收集、加工處理、存儲管理和共享服務于一體,由收集與分發模塊CTS、數據加工處理模塊DPC、數據存儲管理模塊SOD、綜合業務監控模塊MCP、數據共享服務模塊GDS 五個功能模塊組成,分別部署在國家和各省級氣象數據中心。提供包含l4 類147 種實時、歷史數據的在線存儲服務。在全國推行統一的技術架構、數據處理流程、數據處理標準、數據存儲規格和服務規范,為氣象業務和科研用戶提供快捷、便利的數據應用環境。
Quartz.NET 是一個功能強大的、開源、輕量的作業調度框架,是Java 作業調度系統Quartz 在.NET 平臺的實現,可用于WinForm 和ASP.NET 應用中。可以用它來為執行一個作業而創建簡單的或復雜的調度,從小型應用到大型企業級系統都能適用。其核心元素包括調度器Scheduler,觸發器Trigger 和作業Job。其中Scheduler由SchedulerFactor 創建,是實際執行調度的控制器,管理Quartz.NET 應用運行時環境。Trigger 和Job 是任務調度的元數據,Trigger 用于定義任務調度的時間觸發規則,即按照什么時間規則去執行任務。Job 是作業的類型,描述了作業是如何執行的。JobDetail 是Job 的實例,它包含了該實例的執行所需要的數據。一個Job 可以關聯多個Trigger,但是一個Trigger 只能關聯一個Job。一個調度容器Scheduler中可以注冊多個JobDetail 和Trigger。當Trigger 與JobDetail 組合,就可以被Scheduler 容器調度了。
建立.NET 項目,在工程中添加對Quartz.DLL 文件的引用,并引入命名空間:
using Quartz;
Quartz.NET 采用了基于多線程的架構。程序啟動時,框架初始化一套Worker 線程,這些線程被調度器用來執行預定的作業。作業是一個執行任務的.NET 類,需要實現Quartz.IJob 接口和IJob 接口中包含的唯一的Execute()方法,作業從這里開始執行,Execute()方法內就是定時執行的工作代碼。下面以監測強降水為例,進行說明。
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 小時內的降水合計
dict_cur = cimissHelper.getRainFromCimiss(cimissHelper.strTimeRange_callRain_oneHour,"OneHourRange");
//處理從cimiss 返回的1 小時降水數據,發送手機預警短信,返回應該被顯示的數據列表。
if (dict_cur.Count > 1)
{
lstShow = ProcessReturn_Rain(dict_cur,dict_old_rain_oneHour,"OneHourRange");
//把數據更新到界面的對應grid
FrmMain.ShowRainData(lstShow,curTimeRange);
}
}
else if (curTimeRange == "ThreeHoursRange")
{
(以下代碼與上雷同,略)
}
}
實現從CIMISS 中獲取降水數據的代碼如下:
public Dictionary<string,List<RainInfo>>getRainFromCimiss(string curTimeRange,string strCurTimeRange)
{
string statEleValueRanges = "";//降水統計值范圍
Dictionary<string,List<RainInfo>> dictTime_rainData = new Dictionary<string,List<RainInfo>>();//雨的時間及其對應的數據列表
string domainName = "http://10.194.89.55/cimiss-web/api?";
string userId = "userId=BCCD_****_****"+"&";
string pwd = "pwd=****"+"&";
//statSurfEleInRegion:按時間段、地區統計地面數據要素
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")
// 統計降水量:一小時降水超過10 毫米
statEleValueRanges = "statEleValueRanges="+"SUM_PRE:[10,999]"+"&";
else if(strCurTimeRange == "ThreeHoursRange")
// 統計降水量:三小時降水超過25 毫米
statEleValueRanges = "statEleValueRanges="+"SUM_PRE:[25,999]"+"&";
string orderBy = "orderBy=SUM_PRE:asc"+"&"; //以降水統計字段升序排序
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);
//查詢成功,并且有數據返回
if ((int)jsonObj["returnCode"]== 0 && (int)jsonObj["rowCount"]> 0)
//處理從cimiss 返回的json 格式的數據
dictTime_rainData = ProcessRetText_rain(jsonObj,strCurTimeRange);
return dictTime_rainData;
當有滿足條件的降水數據時,調用通信公司的短信發送接口發送預警短信。代碼如下:
string Content = strContent;
string PhoneNumbersReceive = "";//接收預警信息的手機號碼
string SignName = ""; //短信簽名
SignName = "[黑水氣象 黑水應急]";
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) //短信內容
.Append("&SignName=").Append(SignName)//短信簽名
.Append("&FeeType=").Append("2")//套餐類型
.Append("&TimingDate=&ExtCode=");//其他參數
string url = "https://sdkulink.domain.com:8082/Api/SendSms";
string reuslt = CimissHelper.PostSMS(url,sb.ToString()); //以post 方式提交
......
基于CIMISS 的災害性天氣監測預警平臺在黑水縣氣象局投入業務運行后,系統能以5min 的時間間隔對黑水縣境內的強降水、大風和雷電的發生發展情況進行連續監測,在實況數據達到一定的閾值時,通過自動發送手機短信等方式,及時對氣象、決策、電力等部門的相關工作人員進行災害性天氣預警,極大地減輕了工作人員的勞動強度,提高了工作效率。該平臺還可以根據實際的工作需要,對其功能進行擴展開發,對更多的實況氣象數據進行監測,以進一步發揮其自動、及時、高效的優勢在氣象服務工作中的作用。