地震发生后,流动测震现场工作主要为流动测震台站架设及观测系统组网,以便于迅速开展地震现场监测(申俊,2017)。应急流动测震现场工作组需要产出现场监测方案,这包括震中位置图、震前震后监测能力图、故障台站分布图等,可为流动测震台的布设提供依据;同时,需要根据记录到地震的强震动台站的数据尽快产出加速度峰值分布图、速度峰值分布图、仪器烈度分布图等,为灾评提供参考。目前,以上工作均需人工完成,并于震后1—2 h内产出各类图件。
本文主要就山西地震应急流动测震及强震自动化产出系统数据库设计,及山西地震应急流动测震及强震产出自动化系统各功能模块实现进行介绍。该系统可由地震应急或演练触发,快速产出一系列流动测震及强震动产品,为地震现场监测服务。
1 系统开发 1.1 需求分析根据山西省地震局应急预案,应急流动现场工作组需在震后快速产出现场监测方案,包括震中位置图、监测能力图、故障台站分布图、流动台站分布图、加速度峰值分布图、速度峰值分布图、仪器烈度分布图等,工作流程较复杂,且时效性不强。可见,山西地震应急流动测震及强震产出自动化系统需要具有为地震现场监测工作人员快速提供现场监测方案的功能。UML系统用例图见图 1。
根据震后应急流动测震响应流程,针对流动测震产出(各类台站分布图、流动台布设、监测能力变化等)和强震动产出(时程、PGA、PGV、仪器烈度、反应谱、傅里叶谱等),分析系统处理流程见图 2。
(1)用户根据已有用户名、密码进行登录或新用户注册。登录成功后,系统自动读取指定邮箱内最新地震信息并写入数据库,自动在系统主页面显示;或进行地震演练时,用户手动输入地震信息。主页面在高德地图上显示震中位置,并叠加山西省市界。滚动显示最新地震信息,历史地震信息以列表显示。
(2)系统读取最新地震震中位置或人工输入地震信息。在高德行政地理地图及影像图上分别叠加山西省市界、测震台站、强震动台站、断层等,显示震中分布图。
(3)选择故障测震和强震动台站,并计算在此次地震震中附近100 km范围内的台站,并将相应信息在高德行政地理地图上叠加山西省市界、测震台站、强震动台站、震中等进行显示。
(4)在地图鼠标点选或手动输入经纬度进行流动台站的布设,并在高德行政地理地图及影像图上分别叠加山西省市界、测震台站、强震动台站、震中、断层及流动台站等进行显示。
(5)根据故障测震台站信息,从数据库读取测震台站参数,这包括经纬度、噪声等,根据近震震级公式计算得出各格网点的监测能力。本文基于李善邦先生测定的近震震级公式(中国地震局监测预报司,2009),并依据地动噪声速度进行改写,计算量规函数(尹继尧等,2011),以此反推单台控制距离进行计算,从而得到监测能力。
(6)读取强震动事件文件并进行转换,根据《仪器地震烈度计算暂行规程》(中国地震局,2015)中要求的数据处理流程进行基线校正、积分或微分、数字滤波、记录合成,计算PGA和PGV,计算IPGA和IPGV。
(7)汇总上述产出的一系列信息,并结合对山西省应急流动震情监测组产出文档的要求,将所有信息及图表自动产出文档。
1.2.2 系统结构系统采用B/S结构(全称Browser/Server,即浏览器/服务器模式),将系统功能实现核心部分集中在服务器上,简化系统开发、维护和使用过程。在MyEclipse开发环境中构建系统,Java作为后台开发语言,MySQL作为后台数据库管理系统,Geoserver作为地图服务器,结合高德地图API进行地图显示。
系统采用经典3层架构框架进行模型建立和交互处理控制,通过com.entity建立实体,com.dao中包含dao及dao的实现,com.servlet通过request和response处理浏览器的请求及响应,com.util实现与数据库建立连接及查询、修改等操作,com.filter实现过滤器功能,在jsp页面中进行视图显示。
1.2.3 数据库设计系统采用MySQL 5.6建立名称为db_seisemer的数据库,数据库实体分别为用户实体、测震台站实体、强震动台站实体、地震实体、流动台站实体、监测能力实体及强震实体等,根据这些数据实体对象,可以得到数据表结构的基本模型,并形成共包含7张数据表的完整数据结构,结构图见图 3,其中,用户信息表、测震台站信息表、地震信息表的表结构见表 1—表 3。
根据山西地震应急流动测震及强震产出自动化系统的需求,可以将其分为震中分布图、故障台站分布图、流动台站分布图、监测能力图、强震动产出及统计图表等6个部分,具体功能模块见图 4。
针对系统需实现的功能模块及7张数据库表,在com.entity中定义User、CZSta、QZSta、Epicenter、GZCZSta、GZQZSta、LDSta、JCNL和QZInfo等实体类,在com.dao中建立各实体对应的Dao及DaoImpl方法类,实现各种算法及对数据库进行查询、修改等操作,通过com.servlet实现各实体对应Dao方法的调用及参数传递,在com.util中建立数据库连接及操作类DBconn类,在com.filter中建立过滤器类EncodingFilter,实现Filter接口,成为Servlet过滤器。
(1)数据库连接及操作类。在数据库操作类DBconn类建立连接、查询、修改及关闭数据的方法,部分源代码如下
public class DBconn {
static String url = "jdbc:mysql://localhost:3306/db_seisemer?useunicuee=true & characterEncoding=UTF-8";
static String username = "root";
static String password = "******";
static Connection conn = null;
static ResultSet rs = null;
static PreparedStatement ps =null;
public static void init(){
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
System.out.println("数据库驱动初始化失败!");
e.printStackTrace();
}
}
(2)过滤器类。系统通过过滤器类EncodingFilter类配置解决中文乱码,部分源代码如下
public class EncodingFilter implements Filter{
public EncodingFilter(){
System.out.println("过滤器构造");
}
public void destroy() {
System.out.println("过滤器销毁");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
chain.doFilter(request, response);
}
public void init(FilterConfig arg0) throws ServletException {
System.out.println("过滤器初始化");
}
}
(3)地图显示。高德地图JS API是一套JavaScript语言开发的的地图应用编程接口,本地地图数据通过geoserver服务器生成json文件,利用高德地图进行显示。可直接在jsp的<script>标签中编写代码,部分源代码如下
var geojsonURL1 = 'map/JSON/57czsta.json';//添加由geoserver生成的台站json文件
var xhr1 = new XMLHttpRequest();
xhr1.onreadystatechange = function() {
if (xhr1.readyState === 4 & & xhr1.status === 200) {
var geojson1 = new AMap.GeoJSON({
geoJSON:JSON.parse(xhr1.responseText),
'getMarker': function(geojson1, lnglats) {
return new AMap.CircleMarker({
center: lnglats, //圆心位置
radius: 5, //半径
opacity: 0.6});
}});
geojson1.setMap(map1);
}};
xhr1.open('GET', geojsonURL1);
xhr1.send();
(4)获取地震信息。用户通过index.jsp登录系统,通过form表单调用loginservlet,通过Javamail的POP3邮箱协议获取邮箱内地震信息,部分源代码如下
Properties props=new Properties(); //创建一个Properties对象
props.put("mail.store.protocol", "pop3"); //协议
props.put("mail.pops.port", port); //端口
props.put("mail.pops.host", host); //服务器
props.put("mail.pop3.auth", "true"); //邮件服务器认证
Session session=Session.getInstance(props);
try {
Store store =session.getStore("pop3");
store.connect(host, userName, password);
Folder folder =store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
Message[] messages=folder.getMessages();
MimeMessage msg=(MimeMessage)messages[i];
folder.close(true);
store.close();
} catch (MessagingException e) {
e.printStackTrace(); }
}
(5)地震信息展示。从数据库获取地震信息,显示至主页面main.jsp,部分源代码如下
EpicenterDao edd = new EpicenterDaoImpl();
List<Epicenter>epicAll = edd.getEpicenter();
request.setAttribute("epicAll", epicAll);
request.getRequestDispatcher("main.jsp").forward(request, response);
(6)计算距震中100 km范围内台站信息。根据读取的震中位置,计算并显示100 km范围内的台站缓冲区,使用户对于地震造成的影响有直观了解,部分源代码如下
//计算震中100km内台站信息
for(int i=0;i<num; i++){
double long1=czAll.get(i).getcLongitude();
double lat1=czAll.get(i).getcLatitude();
double radlat2=lat2*Math.PI/180;
double radlat1=lat1*Math.PI/180;
double dlong=(long2-long1)*Math.PI/180;
double dlat=(lat2-lat1)*Math.PI/180;
double a=2*Math.asin(Math.sqrt(Math.pow(Math.sin(dlat/2),
2)+Math.cos(radlat2)*Math.cos(radlat1)*Math.pow(Math.sin(dlong/2), 2)));
dis=a*R;
if(dis<100){
j++;
stalist+=czAll.get(i).getcStaname()+", ";
}}
2 系统展示 2.1 用户登录用户通过用户名、密码登录,也可以注册新用户后再登录,登录界面见图 5。
使用高德地图显示震中分布图,分别显示地理位置及影像,震中分布示意见图 6。
用户可以通过浏览器选择输入此次地震受损台站,系统自动计算距震中100 km范围内的地震台站信息,并在浏览器页面显示,见图 7。
山西地震应急流动测震及强震产出自动化系统已设计完成,初步实现震后快速产出流动测震台站分布、监测能力等图件的目标。目前,故障地震台站信息仍需手动输入系统,今后需进行完善,并进一步提高系统安全性,以便实时从JOPENS数据库读取故障台站信息。
申俊. 2017. 地震现场监测工作[J]. 地震地磁观测与研究, 38(4): 246-250. DOI:10.3969/j.issn.1003-3246.2017.04.043 |
尹继尧, 朱元清. 2011. 上海数字地震台网监测能力评估[J]. 地震研究, 34(4): 476-481. DOI:10.3969/j.issn.1000-0666.2011.04.012 |
中国地震局.关于印发《仪器地震烈度计算暂行规程》的通知[R].中震测发[2015]18号, 中国地震局, 2015.
|
中国地震局监测预报司. 2009. 实用数字地震分析[M]. 北京: 地震出版社, 80-81.
|