我国地震灾害频发,全国多个城市位于高烈度区,破坏性地震的发生将给这些城市造成巨大损失(金星等,2012)。地震预警是目前全球公认的有效减灾手段之一(金星等,2012),已有多个国家采用各类预警系统(张红才等,2012)。汶川地震后我国已开展多个预警技术攻关项目,并在个别地区建立地震预警系统(刘如山等,2015)。河北省先后在唐山、秦皇岛等地区建立烈度计台站,是全国首批建立地震预警台网的地区。根据中国地震局监测预报司要求,首都圈各省、市地震局于2015年8月开始建设京津冀地震预警协同网(示范系统),目前已完成验收,自2017年3月21日试运行,现阶段共实时接入简易烈度计台站220个,同时接入区域测震台131个、实时强震台80个。该示范系统流服务采用JOPENS6.0系统,客户端展示采用JEEW软件。系统试运行期间,河北测震台网需每月产出月报文件,重复率高,复用性强,采用人工方式产出效率低、易出错(王学勤等,2014)。为节约人力成本(李碧君等,2010)、提高月报质量和产出速度(狄国荣等,2016),设计开发月报产出软件,降低月报产出难度。
1 POI工具简介产出月报为doc格式,用JAVA操作doc文档需调用第三方工具POI。POI是Apache的子项目,提供一组API供用户调用(黄日胜等,2007),其中主要API是用于实现文档读写功能的XWPF,是一组文档操作对象(黄青云等,2014),包括:创建文档的XWPFDocument、创建文本的XWPFRun、创建段落的XWPFParagraph、创建表格的XWPFTable等。调用上述API时应注意依赖关系,应依次创建XWPFDocument、XWPFParagraph及XWPFRun。整个文档由多个XWPFRun组成,文档各级标题可看作单行XWPFRun,正文可看作多行XWPFRun。
2 软件设计 2.1 整体架构软件设计采用模块化原则,分业务模块和辅助模块2大部分(图 1),其中:业务模块由计算模块、报告生成模块和数据库模块组成;辅助模块由Constants模块、通用模块、POJO模块和UI模块组成。软件运行流程如下:①计算模块负责对已有延迟数据和运行数据的统计,生成3个结果文件;②报告生成模块根据月报的配置文件及步骤①中生成的结果文件产出月报;③数据库模块负责存储、查询、展示计算模块生成的结果数据;④辅助模块负责数据库连接、配置文件解析、格式转换、软件UI等功能。
该模块工作流程见图 2,其中:台站列表包括需要统计的所有台网及台站名称;原始数据来自JOPENS软件生成的延迟统计文件和运行率文件。计算过程如下:根据台站列表和统计时间完成数据筛选工作,生成临时文件;对临时文件进行统计,产出3个结果文件:①统计结果文件,内容包括:省名、省代号、台站名、开始日期、结束日期、台站运行率、台站最小延迟、台站最大延迟、台站平均延迟和备注;②台站断记统计文件,内容包括:开始时间、结束时间、台站名、所有断记时间;③台站高延迟统计文件,内容包括:开始时间、结束时间、台站名、最大延迟。上述3个文件将作为数据源,供报告生成模块和数据库模块调用。
计算模块的主要代码如下
public static void calResult(String statisticStartDate, String days, ArrayList < String > runRatioList) throws IOException, ParseException {
while ((temp = reader.readLine())!= null) {
if(temp.substring(0, 2).equals(“HE”) & & !(temp.equals(“”))){
a = temp.split(“ “);
if(i > staNum-1) i = 0;
if(a[1].equals(“NaN”)) a[1]=”0.0”;
if(a[2].equals(“NaN”)) a[2]=”0.0”;
if(a[3].equals(“NaN”)) a[3]=”0.0”;
delay[i] = delay[i] + Double.parseDouble(a[1]);
if(max[i] < Double.parseDouble(a[2])){
max[i] = Double.parseDouble(a[2]);
}
if(!(Double.parseDouble(a[3]) == 0.0)){
if(min[i] == 0.0){
min[i] = Double.parseDouble(a[3]);
}else if(min[i] > Double.parseDouble(a[3])){
min[i] = Double.parseDouble(a[3]);
} } stationName[i] = a[0];i ++; } } for(int z = 0; z < 100; z ++){ fwriter.write(
new String(DocConstants.TABLE_CONTENT_PROVINCENAME.getBytes(“utf-8”), ”gbk”) + “ “ +
new String(DocConstants.TABLE_CONTENT_NETCODE.getBytes(“utf-8”), ”gbk”) + “ “ + stationName[z] + “ “ + statisticStartDate + “ “ + util.getFetureDate(statisticStartDate, days) + “ “ +
DocConstants.TABLE_CONTENT_PACKINTERVAL + “ “ + runRatioList.get(z) + “ “ +
util.jingdu(delay[z]) + “ “ + util.jingdu(max[z]) + “ “ + util.jingdu(min[z]) + “ “ + new
String(“--”.getBytes(“utf-8”), ”gbk”) + “ “ +
new String(“”.getBytes(“utf-8”), ”gbk”) + “ “ + “\r\n”);
} fwriter.close();
}
2.3 报告生成模块设计报告生成模块由文本生成器和表格生成器2部分组成(图 3),根据用户输入的相关信息,判断当月是否有3.0级以上地震发生,由此决定是否采用有震模板,否则采用无震模板,由报告生成模块产出月报。月报分为有震报告和无震报告2种格式,无震报告只需对台站、系统基本信息和运行信息进行描述,有震报告还需描述当月责任区发生的所有地震事件。报告采用分段生成,便于代码编写及后期维护。
月报格式见图 4,内容包括:报告头(月报标题、期数、描述信息)和报告体2大部分,其中报告体分为6个子部分:①系统概述,主要描述预警示范区概况,含1张台站分布图;②总体运行情况,描述当月预警示范区各台站和省中心整体运行、台站延迟、事件触发等情况,含1张台站运行情况表;③系统软硬件维护故障及解决情况,描述当月示范区软硬件和网络故障及维修情况;④示范系统处理情况,描述当月河北省预警事件触发次数、漏触发和误触发次数;⑤M 3.0以上地震预警处理情况,列出当月示范区所有3.0级以上地震的预警信息、速报信息等(如无符合条件的地震需注明);⑥小结,对当月示范区出现的各类问题进行总结。
为文档内容和文档格式分别建立配置文件。文档内容配置包括:月报标题、期数、月报描述信息(撰写日期、撰写人、审核人、值班人等)、各级标题、正文、图表标题等;文档格式配置包括:文档字体、字号、字体颜色、段落位置等。
2.3.3 文本生成器文本生成器根据文档结构特点,对不同部分采用不同创建方法,包括创建主标题、期数、说明文字、一级标题、二级标题、正文并插入图片。编写代码时将上述各部分代码放在统一工具类,供文本生成器调用,主要代码如下
XWPFParagraph mainTitle=document.createParagraph();
mainTitle.setAlignment(ParagraphAlignment.CENTER); //段落对齐方式
XWPFRun r_mainTitle=mainTitle.createRun();
r_mainTitle.setText(repalceStr);
r_mainTitle.setFontFamily(DocConstants.MAIN_TITLE_FONT); //设置字体
r_mainTitle.setFontSize(DocConstants.MAIN_TITLE_FONT_SIZE); //设置字号
r_mainTitle.setColor(DocConstants.MAIN_TITLE_FONT_COLOR); //设置字体颜色
2.3.4 表格生成器为方便开发和维护,建立独立的表格生成器。该生成器包括创建表头、遍历数据创建表体、设置表格属性3个部分,主要代码如下
XWPFTable table = document.createTable(alist.size()+1, 12);
CTTbl ttbl = table.getCTTbl();
CTTblPr tblPr = ttbl.getTblPr() == null? ttbl.addNewTblPr() : ttbl.getTblPr(); //表格属性
CTTblWidth tblWidth = tblPr.isSetTblW()? tblPr.getTblW() : tblPr.addNewTblW(); //表格宽度
tblWidth.setW(new BigInteger(“8500”));
tblWidth.setType(STTblWidth.DXA);
for(int i=1; i < alist.size()+1; i++){
setCellText(document, getCellHight(table, i, 0), alist.get(i-1).getProvinceName(), bgColor, 450);
setCellText(document, getCellHight(table, i, 1), alist.get(i-1).getNetcode(), bgColor, 400);
setCellText(document, getCellHight(table, i, 2), alist.get(i-1).getStationCode(), bgColor, 850);
setCellText(document, getCellHight(table, i, 3), alist.get(i-1).getStatisticStartDate(), bgColor, 1100);
setCellText(document, getCellHight(table, i, 4), alist.get(i-1).getStatisticStopDate(), bgColor, 1100);
setCellText(document, getCellHight(table, i, 5),
String.valueOf(alist.get(i-1).getPackInterval()), bgColor, 400);
setCellText(document, getCellHight(table, i, 6), alist.get(i-1).getRunRatio(), bgColor, 750);
setCellText(document, getCellHight(table, i, 7), alist.get(i-1).getAveDelay(), bgColor, 650);
setCellText(document, getCellHight(table, i, 8), alist.get(i-1).getMaxDelay(), bgColor, 650);
setCellText(document, getCellHight(table, i, 9), alist.get(i-1).getMinDelay(), bgColor, 650);
setCellText(document, getCellHight(table, i, 10), alist.get(i-1).getReason(), bgColor, 750);
setCellText(document, getCellHight(table, i, 11), alist.get(i-1).getRepairRemark(), bgColor, 750);}
2.4 数据库模块设计为实现数据的存储、查询和可视化,地震预警示范系统试运行月报产出软件选用MYSQL数据库管理数据,数据库包括4张数据表:①统计结果表;②台站断记信息表;③台站高延迟信息表;④台站运行信息表。软件只涉及插入和查询2种操作,故未采用第三方持久化工具,而直接编写代码调用JDBC API。本模块工作流程见图 5,具体如下:①数据写入:数据库模块调用JDBC,将计算模块产出的3个结果文件数据写入数据库;②数据查询:用户输入条件,实现历史数据查询,数据在UI中以列表方式展示,有分页功能;③可视化查询:用户输入条件,模块借助JfreeChart,实现历史数据的柱状图展示,便于用户分析数据。
该模块包括:计算界面、菜单界面(图 6)、数据查询界面(图 7)、数据显示界面(图 8)、数据可视化查询界面、可视化展示界面(图 9)、报告参数界面(图 10)和有震报告参数界面(图 11)。其中,报告参数界面集中了月报中需要人工填写的全部信息,用户只需完成信息录入即可产出正确报告;如果当月发生3.0级及以上地震事件,报告中需增加地震相关信息的描述,利用有震报告参数界面,集中填写此类信息。
为方便程序访问数据库中各表,建立POJO模块,包括数据表中所有字段及各字段的Setter和Getter方法。
2.5.3 通用模块和Constants模块通用模块主要包括XML文档解析、日志生成、格式转换等辅助工具;Constants模块包括一些UI和文档中的配置,如:文本框尺寸、按钮尺寸、文档字体、字号、字体颜色、位置等信息。
3 软件测试地震预警示范系统试运行月报产出软件设计完成后,由河北省测震台网工作人员进行测试,测试使用自预警示范项目试运行以来张家口地区已架设的100个烈度计台站数据,测试过程按表 1所示各个功能点进行,测试时软件状态如2.5.1节中各图所示,测试表明该软件运行正常。
地震预警示范项目是烈度速报与预警工程的前期项目,为后续全国性项目的开展积累经验。示范项目运行月报体现了试运行期的各项指标,便于管理团队和技术团队实时把控项目,及时发现问题、解决问题。本软件的设计与实现提升了月报产出速度,提高了月报产出质量,为示范项目试运行提供了辅助支持。在软件研发过程中有2个问题值得关注:①使用POI工具时应根据生成的Word版本选择合适的POI版本,本软件使用poi-3.17;②HashMap组件不支持数据排序,如需排序功能,应使用LinkedHashMap组件。
狄国荣, 潘章容, 曾文浩, 等. 2016. 地震预警及烈度速报信息报告自动生成技术[J]. 地震地磁观测与研究, 37(6): 153-158. DOI:10.3969/j.issn.1003-3246.2016.06.028 |
黄青云, 裴冬菊. 2014. POI在Word文档不同颜色文本分离中的应用[J]. 南昌工程学院学报, 33(3): 47-49. DOI:10.3969/j.issn.1006-4869.2014.03.014 |
黄日胜, 李艳飞. 2007. 在新生报到管理系统中应用POI和JAVABean实现与Excel的交互[J]. 福建电脑, 11061106(6): 183-184. DOI:10.3969/j.issn.1673-2782.2007.06.111 |
金星, 张红才, 李军, 等. 2012. 地震预警震级确定方法研究[J]. 地震学报, 34(5): 593-610. DOI:10.3969/j.issn.0253-3782.2012.05.002 |
李碧君, 付红军, 胡扬宇, 等. 2010. 电网年度运行方式自动优化计算与报告生成系统[J]. 电力系统自动化, 34(4): 112-115. |
刘如山, 李山有, 金星, 等. 2015. 关于地震预警政策的研究与探讨[J]. 地震工程与工程振动, 35(4): 27-39. |
王学勤, 郝丹, 郑菲, 等. 2014. "查收查引报告自动生成系统"应用实践研究[J]. 图书情报工作, 58(16): 131-137. |
张红才, 金星, 李军, 等. 2012. 地震预警震级计算方法研究综述[J]. 地球物理学进展, 27(2): 464-474. DOI:10.6038/j.issn.1004-2903.2012.02.009 |