震情简报是震后以书面文字材料传递震情参数的简报,具有汇报性、交流性和指导性的特点。每次大地震发生后,第1份包含地震参数及震中地理信息的震情简报,是地震局与政府部门、新闻媒体沟通交流信息的书面材料,需要快速产出。一直以来,新疆维吾尔自治区地震局震情简报由人工编写。因工作人员操作水平差异,震情简报内容格式不统一,存在排版错误、上报效率低等问题。震情简报内容和排版格式在Office下编辑简单,受人工操作水平影响,效率不高,工作质量无法得到保障。为此开发一套新疆震情简报自动生成软件,为新疆维吾尔自治区地震局应急指挥中心提供震情文字材料,避免出现人工操作存在的问题。
1 设计方案 1.1 思路新疆震情简报自动生成软件从数据库检索最新地震,根据地震参数从地理信息数据库获取震中海拔和主要城市震中距数据,通过矢量化绘制震中位置图件,并对震情简报文字信息进行自动排版,然后在Word文档中插入震中位置图件和震情简报抄送信息,以地震参数命名震情简报Word文档,并保存到预设路径下。同时,软件实现对震情简报文件实时归档,方便用户查询最新文件。
1.2 工作流程新疆震情简报自动生成软件包含震情简报生成模块和文件归档模块。震情简报生成模块每隔1 min读取1次配置文件,并自动从EQIM(中国地震台网中心地震速报信息共享交换平台)系统数据库检索1次最新地震,通过判断已处理事件的ID历史记录,筛选符合条件的最新地震参数(发震时刻、震中位置、震级、震源深度、参考地名),根据地震参数组织格式化文本;利用地震参数,通过数据库地理信息检索震中海拔和主要城市震中距数据,形成格式文本;震中位置图件通过矢量化绘图,保存为JPG格式,并在Word文档中引用插入;震情简报抄送信息是以文本格式化后插入文档末尾;获取震情简报内容后,软件根据用户设置路径,以地震参数命名Word文档(如:2017年01月02日16时55分27秒新疆昌吉州呼图壁县发生3.9级地震.doc)并保存。对保存路径下的Word文件,归档模块实现每隔5 min进行整理,仅保留最新生成的10个文件,其余文件转移到保存路径的Eqdoc子目录下。震情简报生成软件工作流程见图 1。
新疆震情简报自动生成软件的主要功能有震情简报自动生成和文件自动归档。
(1)震情简报自动生成。以EQIM(中国地震台网中心地震速报信息共享交换平台)系统数据库为基础,为用户大震应急工作提供震情简报,实现:①利用Word控件操作不同格式和段落的图文排版;②每隔1 min从地震速报数据库读取1次地震参数(发震时刻、经度、纬度、震级、参考地名),对最新地震生成震情简报;③根据地震参数,从数据库地理信息中获取震中附近海拔高度;④根据地震参数,使用Image控件的Canvas方法绘制震中图;⑤根据地震参数,使用新疆地区主要城市、乡镇位置数据计算得到震中附近城镇震中距信息;⑥对抄送信息实现可修改、可编辑,满足后续更新。
(2)文件自动归档。软件实现对震情简报保存路径下的所有文档实时归档,方便用户快速查询,得到最新震情简报。
2 具体实现 2.1 开发环境软件开发选择Windows操作系统,采用Delphi XE平台,以C/S体系结构,结合Word文档读写技术,使用Pascal语言和UniDAC组件(功能强大的非可视化跨数据库数据访问组件)操作Mysql数据库,并依托Mysql数据库建立规范化结构的数据库,通过Google Map测距算法计算震中距信息,用WordApplication、WordDocument控件操作Word文档完成图文排版,利用Image控件的Canvas方法完成震中绘图。
2.2 震情简报模板新疆震情简报内容包括6个部分,分别是:红头标识和标题、地震参数、震中海拔、震中主要城镇震中距信息、震中位置图和抄送信息。红头标识部分为图文混排格式,其中单位名称和日期字号要求为三号仿宋;标题为二号方正小标宋体,行距固定值35磅,居中;地震参数、震中海拔、震中附近城镇震中距信息均要求段首缩进2字符,正文为三号仿宋,行距固定值25磅;震中位置图要求行政区边界清晰,标注震中位置;抄送信息为小四宋体,行距固定值16磅。
2.3 Word排版实现在Delphi XE环境下使用WordApplication、WordDocument控件连接Office Word程序,实现对Word文字格式的排版(张增强等,2002;杨志国等,2003),具体操作如下。
(1)“震情简报”红头标识图片(bmp01为图片文件变量)插入及格式排版,代码如下
WordApplication.Selection.ParagraphFormat.Alignment :=wdAlignParagraphCenter;//居中
WordApplication.Selection.InlineShapes.AddPicture(bmp01, emptyparam, emptyparam, emptyparam);
WordApplication.Selection.Font.Size := 16;//字号
WordApplication.Selection.Font.Name := '仿宋';//字体
WordApplication.Selection.TypeText(#13);
WordApplication.Selection.TypeParagraph;//换行
(2)“震情简报”红头标识文字内容插入和格式排版(DataStr为发震时刻日期变量),代码如下
WordApplication.Selection.TypeText('第X期');
WordApplication.Selection.TypeParagraph;//换行
WordApplication.Selection.TypeText('新疆维吾尔自治区地震局'+ DateStr);
(3)“震情简报”红头标识红色分隔线图片(bmp02为图片文件变量)插入和格式排版,代码如下
WordApplication.Selection.InlineShapes.AddPicture(bmp02, emptyparam, emptyparam, emptyparam);
(4)标题文字(TitleStr)内容格式排版,代码如下
WordApplication.Selection.Font.Size := 22;//字号
WordApplication.Selection.Font.Name := '方正小标宋简体';//字体
WordApplication.Selection.Font.Bold := wdToggle;//加粗
WordApplication.Selection.TypeText(TitleStr);
WordApplication1.Selection.Font.Size := 16;//字号
WordApplication1.Selection.TypeText(#13);
(5)地震参数正文内容排版,代码如下
WordApplication.Selection.Font.Size := 16;//字号
WordApplication.Selection.Font.Name := '仿宋';//字体
WordApplication.Selection.ParagraphFormat.Alignment:=wdAlignParagraphLeft;//靠左对齐
WordApplication.Selection.Font.Bold := 0;//正文
WordApplication.Selection.TypeParagraph;
(6)抄送内容(remarks)段落设置及格式排版,代码如下
with WordApplication.Selection.ParagraphFormat do
begin
LeftIndent := 0.53;
RightIndent := 0;
SpaceBefore := 0;
SpaceAfter := 0;
LineSpacingRule := wdLineSpaceExactly;
LineSpacing := 16;
Alignment := wdAlignParagraphJustify;
FirstLineIndent := -0.53;
OutlineLevel := wdOutlineLevelBodyText;
CharacterUnitLeftIndent := 0;
CharacterUnitRightIndent := 0;
CharacterUnitFirstLineIndent := -2.99;
LineUnitBefore := 0;
LineUnitAfter := 0;
BaseLineAlignment := wdBaselineAlignAuto;
End;
WordApplication.Selection.ParagraphFormat.Alignment :=
wdAlignParagraphLeft;//靠左对齐
WordApplication.Selection.TypeText(remarks + #13);
2.4 震中位置图片生成震中位置图未选择百度和Google等互联网在线地图,主要原因在于,在线图件不符合新疆维吾尔自治区地震局关于震情简报图件的要求,且受网络环境影响,图件生成无保障。为了提供清晰的行政边界地图,笔者利用Image控件进行绘制。Image控件是图像控件,支持JPG、BMP、ICO等格式,以像素为基本单位成图,功能类似于Windows系统的画图工具(杨富国,2006;刘瑞新等,2009;刘苗苗等,2013)。
利用Image控件绘制震中位置图,首先要完成经纬度数据与Image控件像素值的关系转换。地理坐标的定义规则为:X轴(代表经度)向右递增,Y轴(纬度)向上递增;屏幕坐标定义规则为:X轴向右递增,Y轴向下递增。地理坐标和屏幕坐标的区别在于Y轴递增方向是相反的。为了保证精度,地理坐标精确到″,取值用实数型计算,结果再转为整数型。
地理坐标区域中的任何一点(Xlon,Ylat),在屏幕上的坐标设为(X,Y),则
$ X{\rm{ = (lon - minLon}}{{\rm{)}}^{\rm{*}}}{\rm{3600/((maxLon - minLon)*3600)/}}h $ | (1) |
$ Y{\rm{ = (maxLat - lat}}{{\rm{)}}^{\rm{*}}}{\rm{3600/((maxLat - minLat}}{{\rm{)}}^{\rm{*}}}{\rm{3600)/}}y $ | (2) |
式中,lon、lat为地理坐标点的经度、纬度,X、Y为屏幕点的坐标,y为屏幕的高,h为屏幕的宽,minLon、maxLon分别为地理坐标区域经度的最小值、最大值,minLat、maxLat分别为地理坐标区域纬度的最小值、最大值。
2.5 震中附近主要城镇震中距信息计算对于震中附近主要城镇的震中距数据,需要准备新疆全区各县城、乡镇经纬度和地名数据,并通过Google Map经纬度测距函数来计算。测距函数代码如下
Function TForm1.GetDistance(var lat1, lng1, lat2, lng2 : Double) : Double; var R, dLat, dLng, a, c, d : Double;
begin
dLng:=(lng2-lng1)* Pi/180;
a :=sin(dLat/2) * sin(dLat/2) + cos(lat1 * Pi/180) * cos(lat2 * Pi/180) * sin(dLng/2) * sin(dLng/2);
c := 2 * Math.ArcTan2(sqrt(a), sqrt(1 -a));
d := R * c/1000;
GetDistance := d;
end;
3 实际应用新疆震情简报自动生成软件开启后自动运行,最新地震检索和处理过程及运行报错信息均显示在软件主界面信息栏中。该软件自2016年9月投入使用,对新疆地震台网速报的所有地震均生成对应的震情简报,震情简报格式符合地震应急工作报送要求,如:2017年1月4日09时03分新疆拜城MS 3.9地震,震情简报内容包含:发震时刻、震中位置、震级、震源深度、震中海拔、城市震中距、震中图、抄送单位,见图 2。新疆震情简报自动生成软件代替人工编辑自动生成震情简报,实现与人工正式速报地震参数结果的同步,使工作人员工作量减少,工作效率得到较大幅度提高。
新疆震情简报自动生成软件自使用以来,效果良好,未出现遗漏震情简报现象。该软件功能简单,具有一定实用性。通过2016年11月、12月5次5级以上地震应急工作的实践检验,其中主震和余震震情简报与正式速报结果实现同步,震情简报报送速度得到明显提升,满足地震应急工作时效性需求,值得推广使用。
刘苗苗, 邢煜, 张永生, 等. Delphi程序设计及应用[M]. 北京: 清华大学出版社, 2013. | |
刘瑞新. Delphi程序设计教程[M]. 第2版. 北京: 机械工业出版社, 2009. | |
杨富国. Delphi程序开发案例解析[M]. 北京: 清华大学出版社, 2006. | |
杨志国, 王小琼, 李世姣. Delphi应用软件开发精彩实例[M]. 北京: 机械工业出版社, 2003. | |
张增强. 突破Delphi 7.0编程实例五十讲[M]. 北京: 中国水利水电出版社, 2002. |