1. 引言
震情快报主要包含地震参数(发震时刻,经纬度,深度,震级和地震名称)和震中图等信息,是地震发生后地震部门和其它政府部门、新闻媒体等进行信息交流的方式之一。地震部门对外发布地震信息、实现信息共享时,信息发布的速度是至关重要的,特别是在发生强地震的情况下,越快向政府部门提供一份正式详细的震情快报,就意味着越少的损失 [1] 。
目前,国内很多地震部门基于不同技术实现了震情快报的自动产出。邵平荣基于C #(C Sharp)和MapX编写了一套震情快报系统,以人机交互的方式实现了福建震情快报的产出 [1] ,大大提高了震情值班人员的工作效率。金艳等通过VC++编程,将VC++与word结合,实现了安徽省地震编目文档和速报震情的自动化 [2] 。赵庆等以Delphi XE为平台,开了新疆震情简报自动生成软件,实现新疆地震局震情简报的自动化生成 [3] 。
福建省地震局震情快报由震情值班人员编写,经速报人员校核后打印并传真给省委、省政府等部门,若地震达到应急级别或震感强烈,还需向新闻媒体发送新闻签发稿,同时将震情报告报送办公室人员进行归档。自2006年以来,福建局震情值班人员一直使用邵平荣开发的震情快报系统进行震情快报的编写工作,由于受到时间和系统升级等因素的影响,该系统目前已无法完成快报的自动化产出,震情值班人员的工作效率和质量无法得到有效保障。
由于各地对震情快报格式或内容要求不尽相同,其它软件无法直接复制使用。因此,本文基于FreeMarker模版引擎,使用Java语言开发了一套新的震情快报自动产出软件,从EQIM或AU实时接收地震参数并将地震参数和震中图等信息插入预先制定的模版中,可在接收到地震参数后数秒内自动产出震情快报、新闻签发稿和震情归档等Word文档,同时具有自动发送FTP等功能,有效避免出现人工操作带来的问题,提高了震情值班人员的工作效率和质量。和已有软件不同的是,本文软件使用Java语言开发,可在Windows,Linux和Mac等操作系统上使用;震情简报基于模版,而不是直接对Word进行操作,可根据需要随时更改模版样式而无需更改代码,实现上很灵活。
2. 相关技术介绍
2.1. FreeMarker
Apache FreeMarker是一个模板引擎:一个基于模板和数据替换,用来生成输出文本(HTML网页,E-mail配置文件,源代码等)的Java类库。FreeMarker是自由软件,基于Apache许可证2.0版本发布,模版的编写使用FreeMarker Template Language (FTL),这是一种简单的、订制化的语言(和诸如PHP等成熟的编程语言不同)。一般地,使用类似Java等多功能的编程语言来准备数据,然后利用Apache FreeMarker显示使用了模版后的准备数据。它的核心原理是模版 + 数据模型 = 输出,在模版内只需关注如何展示数据,模版外只需关注展示什么数据。虽然FreeMarker最初设计用于生成MVC网页应用框架中的HTML页面,但是并不局限于HTML或任何网页相关的应用,它也可以用于非网页应用环境 [4] 。比如,王庆喜(2012),曾玉林(2013),王正敏等(2016),周建锋(2016)等人就基于FreeMarker实现了Word文档的动态生成 [5] [6] [7] [8] 。FreeMarker产出Word的优点在于如果后续文档需要更改样式,只需要对模版样式进行更改,而无需改动软件代码。
2.2. Word对XML的支持
微软从Office Word 2003开始对XML进行完整设计,支持称为Word标记语言的原生XML词汇,Office Word 2003及以上版本对XML均有较好地支持,可以使Word文档和XML文档进行相互转换。Word中常用的标签有
是XML用来表示Word的根元素;
表示字体;
表示正文内容;
表示一个段落;
定义样式;
表示样式串;
表示真正的数据内容;
包含了Base64编码的二进制数据流可以用来表示图片编码。
2.3. GMT
GMT [9] [10] [11] [12] 是Generic Mapping Tools的简写,它是一个由大约80个命令行工具组成的开源软件集合,这些工具可以用来操作地理和笛卡尔数据集(包括滤波,拟合,网格化,投影等)以及生成PostScript图表,比如绘制从简单的XY坐标图像,等值线图,到3D图像等;另外GMT还提供了约40个专业的和专门学科的工具。GMT提供了超过30种图形投影和变换需要例如GSHHG海岸线、河流和行政边界等数据的支持。GMT由Paul Wessel, Walter H. F. Smith, Remko Scharroo, Joaquim Luis and Florian Wobbe开发和维护,得到全球志愿者的帮助和美国国家科学基金会的支持,它在GNU较宽松公共许可证 V3及后续版本下发行 [13] 。
GMT是一款开源免费软件,具有跨平台的特性,可以Windows,Unix/Linux和Mac下运行,GMT可以由命令行、脚本和用户程序调用,具有较强的适应性。此外,GMT还具有很强的灵活性,能够结合地形数据、配色方案,将复杂的信息以高质量的PostScript格式输出,绘制出非常漂亮的二维和三维图形。GMT已在地理、大气、海洋、地震等研究领域得到较为广泛的应用本文使用 [14] 。由于震情快报中包含震中分布图,考虑到跨平台的需求,因此本文使用GMT来绘制震中分布图。
3. 方案设计
3.1. 工作流程
地震发生后,震情快报自动产出软件从EQIM (全国地震速报信息共享与服务系统)和AU (地震自动速报平台)实时接收地震参数,利用GMT软件绘制震中分布图然后将图片转换为Base64编码数据,使用FreeMarker模版引擎将图片数据和地震参数插入预先制定的震情快报模版,以速报代码和发震时刻命名震情快报Word文档,并保存到预设路径下,另外自动上传到FTP指定位置供其他部门使用。新闻签发稿以及震情报告的制作流程和上述过程基本一致,不再赘述。震情快报自动产出软件工作流程如图1所示。
3.2. 软件功能
按照工作流程,震情快报自动产出软件主要包括地震参数接收模块,GMT绘图模块,文档生成模块和FTP上传模块,其功能树如图2所示。每个模块详细功能如下:
1) 地震参数接收模块。实时接收和解析AU或EQIM发布的地震参数信息,得到发震时刻、震中经纬度、震级、深度和参考位置等信息,同时触发GMT绘图模块。

Figure 1. Workflow chart of the software
图1. 软件工作流程图

Figure 2. The main functions of the software
图2. 软件功能树
2) GMT绘图模块。根据地震参数接收模块提供的地震参数,绘制带有行政边界、主要城市名称、震中分布、震级等信息的震中图。
3) 文档生成模块。利用前两个模块提供的地震参数和震中图,调用FreeMarker引擎将模版中相应的数据进行替换,生成震情快报等Word文档。
4) FTP上传模块。将生成的Word文档自动上传到FTP服务器指定位置,供震情值班人员使用或提供给其它部门的有关人员使用。
4. 具体实现
4.1. 震情快报产出步骤
1) 用Microsoft Word 2010或更高版本软件编辑固定好格式和样式的震情快报等Word文档;
2) 把编辑好的Word文档另存为XML格式。通过点击文件|另存为,在弹出的另存为对话框中,选择保存类型为Word XML文档(*.xml),点击保存。注意,选择这种格式生成的Word文档,用Word 2010或更高版本打开方能正常显示内容;如果需要使用Word 2003打开,请选择保存类型为Word 2003 XML文档(*.xml)格式,然后保存。
3) 使用XML编辑器打开XML文件,在需要填充或更改的地方更改为FreeMarker标签,比如震中图位置变为${image}标签。由于XML文件内容很多,不便于查找和编辑需要更改的内容,可以使用Notepad++软件并安装XML Tool插件,选择Pretty print (XML only-with line breaks)对XML内容进行格式化显示,这样便于查找和编辑需要更换的内容。注意,若保存类型为Word 2003 XML文档(*.xml)格式,请不要使用上述方式进行格式化,否则会无法正常Word文件。
4) 将XML文件的后缀名更改为.ftl,即将其修改为FreeMarker模版文件。
5) 用java代码解析FreeMarker模板文件并填充数据。解析模版和填充数据可以使用FreeMarker提供的类来处理。
6) 输出震情快报、新闻签发稿和震情报告等目标文件(Word),并通过FTP自动上传到指定位置。
4.2. 震中图的生成
受网络因素限制,震中图没有使用百度或谷歌等互联网在线地图,而是采用了GMT软件进行绘制。通过GMT的命令行工具,可以较为方便和灵活地将行政边界、城市名称、震中位置、震级等信息组装起来,最终得到震中分布图。文中使用GMT 4.5.13版本软件,主要使用gmtset, psxy, pscoast和pstext等命令。
4.3. 核心代码(Java实现)
4.3.1. 图片转为Base64编码
GMT产出震中分布图后,可以使用以下代码转为Base64编码,然后将FreeMarker模版文件震中图位置
${epiCenterImageStr}中的${epiCenterImageStr}替换即可。代码如下:
File file = new File(imageFile);//imageFile为震中图
InputStream in = null;
byte[] data = null;
try {
in = new FileInputStream(file);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
BASE64Encoder encoder = new BASE64Encoder();
String base64Str = encoder.encode(data);
4.3.2. 生成word文档方法
依据FreeMarker的使用方法,在完成地震参数和震中图数据的封装后,即可适用FreeMarker模版生

Figure 3. An earthquake express document automatically generated by the software
图3. 软件自动生成的震情快报
成震情快报等Word文档,下面是部分核心代码:
Map
map = new HashMap
( );
getDocDataMap( map); / /得到模板需要的数据
String template = templateFolder + File.separator+ftlFile;
if(!new File(template).exists()) {
System.err.println(模版文件不存在:+template);
return null;
}
configuration.setDefaultEncoding(UTF-8);
configuration.setDirectoryForTemplateLoading(new File(templateFolder));
//ftlFile为模板文件名称
Template freemarkerTemplate = configuration.getTemplate(ftlFile);
File f = new File(docFile); // docFile为生产的Word文档名称
try {
Writer w = new OutputStreamWriter(new FileOutputStream(f), utf-8);
freemarkerTemplate.process(dataMap, w);
w.flush();
w.close();
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}
5. 实际应用
震情快报自动产出软件自2018年1月开始在线试运行,实时接收EQIM或AU发布的地震信息,产出对应的震情快报和震情报告等文件。如2018年2月6日23点50分台湾花莲县附近海域M6.5地震,软件正确地将模版中的发震时刻、震中经纬度、震级、深度和震中图等内容进行了替换,自动产出了格式和内容正确的震情快报和新闻签发稿等文档(图3)。据统计,2018年2月4日至8日台湾花莲海域连续发生几十次M4.0级以上地震,震情快报自动产出软件对每次地震均能在接收到地震参数后数秒内自动产出震情快报等文件,文件内容正确,格式和模板样式一致,打印结果不变形,大大减少了值班人员工作量,避免了人工编辑带来的问题。
6. 结论与讨论
本文基于FreeMarker模版引擎开发的震情快报自动产出软件自试运行以来,效果良好,未出现遗漏震情快报和格式错误的问题。该软件具有功能简单、配置灵活、易安装和跨平台的特点,具有一定的实用性。2018年2月台湾花莲海域的几十次地震的实践检验表明,该软件能够很好地处理每次地震,在接收到地震参数数秒内便能自动生成震情快报等文档,并自动发送至FTP指定位置,文档内容和格式正确,打印不变形,有效地提升了震情值班人员的工作效率。
致谢
本研究得到《福建省地震局科技攻关项目》的资金支持,在此表示感谢。感谢Wessel等开发的GMT (Generical Mapping Tools)软件,其它对本研究有过帮助和贡献的研究人员在此一并表示感谢。
基金项目
福建省地震局科技攻关项目“福建地震预警与烈度速报运维保障系统研究”,编号:G201502。