基于CIMISS的灾害性天气监测预警平台*

2022-12-05 11:36李淑静王锡良王李萌谢凯
数字技术与应用 2022年11期
关键词:灾害性强降水气象

李淑静 王锡良 王李萌 谢凯

1.黑水县气象局;2.汶川县气象局

为了实现对黑水县境内的灾害性天气进行监测,以CIMISS 平台作为数据源,采用C#语言,结合Quartz.NET 开发了黑水县灾害性天气监测预警业务平台。结果表明,该平台能对黑水县境内的大风、强降水和雷电等灾害性天气信息进行实时监测,在实况数据达到一定的阈值时,通过自动播放声音、界面展示和发送手机短信等方式,及时对气象、决策、电力等部门的相关工作人员进行灾害性天气预警。极大地减轻了工作人员的劳动强度,提高了工作效率,在气象服务和防灾减灾工作中发挥了重要作用。

黑水县位于阿坝藏族羌族自治州中部、青藏高原东南缘横断山脉中段北端的岷江上游,岷山与邛崃山脉交汇处,以境内黑水河得名。县域地势由西北向东南倾斜,地形主要为高山峡谷地貌,高程由1500 ~4000m。黑水县属季风高原型气候,旱、雨季分明,日照充足,气温年较差较小,日较差较大[1-5]。独特的地形造就了明显的立体性气候,大风、强降水、雷电等灾害性天气频发,灾害性天气及其带来的山洪、泥石流、山体滑坡等次生灾害严重危及人民群众的生命财产安全。为了避免或减轻灾害性天气造成的危害,除了需要准确和可靠的天气预报,还要对天气发展、演变过程中的信息进行监测,当天气实况数据达到一定的阈值,可能会造成灾害时,及时对相关人员进行预警,以采取一切必要的防范措施。基于这一需求,以CIMISS 为数据源,选用C#开发语言,结合Quartz.NET 开发黑水县灾害性天气监测预警业务平台,实现对黑水县境内的天气实况信息进行不间断的可靠监测。当满足一定的条件时,通过播放告警声音、软件界面显示和发送手机短信进行预警。及时的灾害性天气预警信息为决策部门的决策部署提供了客观参考,为防灾减灾赢得宝贵时间。

1 系统总体架构

为了实现对天气信息进行监测,本平台以全国综合气象信息共享系统CIMISS 作为数据来源,以Quartz.NET 作为.NET 平台下的作业调度系统,以实现连续、稳定和可靠的作业调度。系统运行时,Quartz.NET 调度各个作业每隔5min 对CIMISS 分布式数据环境中属于黑水县境内的1h 强降水、3h 强降水、大风和雷电数据进行监测,当监测到实况数据达到一定的阈值时,立即以播放告警声音、界面显示和发送手机短信等方式进行预警。如图1所示。

图1 系统总体架构图Fig.1 Overall architecture diagram of the system

1.1 数据基础平台

全国综合气象信息共享平台(China Integrated Meteorological Information Service System,简称CIMISS)由中国气象局设计、研发。集气象数据收集、加工处理、存储管理和共享服务于一体,由收集与分发模块CTS、数据加工处理模块DPC、数据存储管理模块SOD、综合业务监控模块MCP、数据共享服务模块GDS 五个功能模块组成,分别部署在国家和各省级气象数据中心。提供包含l4 类147 种实时、历史数据的在线存储服务。在全国推行统一的技术架构、数据处理流程、数据处理标准、数据存储规格和服务规范,为气象业务和科研用户提供快捷、便利的数据应用环境。

1.2 Quartz.NET

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 容器调度了。

2 监测预警平台开发步骤及关键代码

建立.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 方式提交

......

3 结语

基于CIMISS 的灾害性天气监测预警平台在黑水县气象局投入业务运行后,系统能以5min 的时间间隔对黑水县境内的强降水、大风和雷电的发生发展情况进行连续监测,在实况数据达到一定的阈值时,通过自动发送手机短信等方式,及时对气象、决策、电力等部门的相关工作人员进行灾害性天气预警,极大地减轻了工作人员的劳动强度,提高了工作效率。该平台还可以根据实际的工作需要,对其功能进行扩展开发,对更多的实况气象数据进行监测,以进一步发挥其自动、及时、高效的优势在气象服务工作中的作用。

猜你喜欢
灾害性强降水气象
气象树
2020年江淮地区夏季持续性强降水过程分析
《内蒙古气象》征稿简则
一次东移型西南低涡引发的强降水诊断分析
大国气象
美丽的气象奇观
四川盆地西南部短时强降水天气特征分析
阜蒙县设施农业灾害性天气防御技术
西藏南部灾害性天气中气象服务的思考与研究
2014 年5 月末西藏强降水天气分析