数字城管防汛决策支持系统的设计与开发
2013-02-20王剑秋陈观林李真楠
王剑秋 陈观林 李真楠
摘 要: 结合城市防汛预警决策的信息化建设,开发了数字城管防汛决策支持系统。介绍了开发该系统的意义、所使用的关键性技术、设计模式和开发工具。该系统应用了基于MVC模式的SSH2框架技术,以及目前主流的JavaScript技术等。分析和展望了数字城管防汛决策支持系统的使用前景。
关键词: 数字城管; 防汛决策支持系统; J2EE; SSH2框架; Oracle
中图分类号:TP31 文献标志码:B 文章编号:1006-8228(2013)02-63-05
Design and development of flood control decision-making support system for digital urban management
Wang Jianqiu1, Chen Guanlin2, Li Zhennan2
(1. China Telecom Corporation Ltd. Hangzhou Branch, Hangzhou, Zhejiang 310003, China;
2. School of Computer and Computing Science, Zhejiang University City College)
Abstract: With deepening of city-oriented development, the impact of floods become more serious so the information construction of flood control decision-making support system has been paid more and more attention. The way of how to use the J2EE platform with SSH2 (the Struts2+Spring+Hibernate) framework for the development of flood control decision-making support system is introduced, including the significance of developing the system, the key technology of the system, the system design model, development tools. SSH2 framework technology with MVC pattern and the current mainstream JavaScript technology are implemented in this system. A summarized analysis of how to better meet the needs of the flood control decision-making support system is presented for digital urban management.
Key words: digital urban management; flood control decision-making support system; J2EE; SSH2; Oracle
0 引言
数字城管意为数字化城市管理,是指用信息化手段和移动通信技术手段来处理、分析和管理整个城市的所有城管部件和城管事件信息,是促进城市管理现代化的信息化措施。数字城管是现代城市的发展趋势,也是城市管理走向现代化的必然要求[1]。
近年来,许多国外发达城市相继开展了“数字城管”的研究和实践,实施“数字城管”也已成为中国城市管理建设的热点。据统计,目前全国已有百余个城市已建设或正在推行数字化城市管理[2]。以浙江省杭州市为例,杭州市于2006年8月顺利通过国家建设部的验收,成为首批十个“数字城管”试点城市中第一个通过验收的城市,其创新模式被冠名为“杭州模式”[3];至2010年底,杭州市已建成覆盖城市市域的市辖城域数字城管统一平台。
随着城市化进程的推进,洪水对城市的影响日益严重,城市防汛预警决策的信息化建设日益受到人们的重视[4]。同时,技术发展与应用的不断升级使得现有的决策支持系统已经不能满足各行各业解决复杂空间决策问题的需要,空间决策支持系统作为GIS与DSS相结合发展的趋势,已在国内外引起越来越广泛的关注[5]。本文介绍一个面向数字城管的防汛决策支持系统的设计和开发,通过对城市河道、水库等的防汛数据进行综合收集和整理,实现对重点区域的有效监控;建立和优化防汛决策的基础数据库,为城市的防汛减灾决策提供支持。在设计和开发面向数字城管的防汛决策支持系统过程中,主要运用Java EE平台技术结合SSH2(Spring+Struts2+Hibernate)框架,采用MVC架构实现数字城管防汛决策支持平台,同时,还应用了许多其他的主流技术,包括Java Script,AJAX,JQuery,Open Flash Chart,Oracle数据库等。
1 系统总体设计与分析
1.1 系统总体需求设计
设计和开发一个面向数字城管的防汛决策支持系统,需要通过对城市河道、水库等的防汛数据进行综合收集和整理,以实现对重点区域的有效监控,并建立和优化防汛决策的基础数据库。系统功能模块主要包括系统管理、防汛信息获取、实时水情分析、防汛预警、统计查询等。要求完成系统的总体设计,对系统进行充分的需求调研,并在此基础上认真进行系统的数据库设计和功能模块设计,重点完成分析模型和分类统计模块,提供方便的查询统计功能。
1.2 系统功能框架
数字城管防汛决策支持系统框架如图1所示。
[数字城管防汛决策支持系统][系统管理][防汛信息获取][实时水情分析][防汛预警][统计查询] [系统基本信息管理][用户管理] [表格导入][手工输入][实时水情报表][实时水情图示][预警测站分析][水情信息查询统计][测站水位过程查询]
图1 数字城管防汛决策支持系统框架图
数字城管防汛决策支持系统分为五个模块。
⑴ 系统管理:主要实现用户管理和系统基本信息的管理。其中用户管理包括了用户的创建、修改、删除和密码重置,系统基本信息管理包括了地区、检测站等系统基本信息的增删改。
⑵ 防汛信息获取:将各个监测站监测到的水位数据导入到系统中,是本系统数据的主要来源。导入方法包括手工输入和现成表格的导入。
⑶ 实时水情分析:将各个测站监测到的最新的水位数据以各种形式展现给用户。展现方式主要包括了图示、表格展示。
⑷ 防汛预警:利用之前的数据通过算法预测出某天的水位数据,给防汛的决策提供一定的数据支持。
⑸ 统计查询:利用系统采集到的数据,统计一段时间内的水情水位信息,并以图表表格等形式展现给用户。
1.3 系统数据库设计
系统数据库包含了水体,地区,检测点,水位信息,用户五张表,如图2所示。
图2 系统数据库表结构
2 系统详细设计与实现
2.1 用户登录功能的实现
系统初始的登录界面如图3所示。本系统拥有权限控制功能,主要有用户管理、系统管理、信息录入等权限,每个用户都可以逐个分配权限点。同时,管理员可以给其他用户分配或取消权限。
图3 登录界面
处理登录请求的后台关键代码如下:
public class UserAction extends PagealbeAction
@Autowired
private UserService serivce;
/**
* 用户登录
*/
public String login() {
AppUser u=null;
try {
u=serivce.login(user.getLoginName(),user.getLoginPwd());
setLoginUser(u);
return "home";
} catch (MessageException e) {
setSessionErrorMessage(e.getMessage());
return LOGIN;
}
}
(其他功能的代码省略)
}
2.2 防汛信息获取的设计和实现
防汛信息的获取,主要是通过手工输入测站的水位数据或者将Excel表格中的水位数据导入系统来实现的,界面如图4和图5所示。手工输入主要是监测员根据测得的数据,将水位记录逐一录入到系统中,效率较低,而表格导入则可以将监测数据批量导入到系统中,从而提高数据获取的效率。
图4 手工输入水位信息界面
图5 从Excel表格中导入水位信息界面
⑴ 手工录入的实现
手工录入主要功能是将网页表单中的数据添加到数据库中,因此实现比较简单,其Struts的Action的关键代码如下:
public class WaterLevelAction extends PagealbeAction
@Autowired
private WaterLevelService service;
@Autowired
private StationService stationService;
@Autowired
private UserService userService;
private WaterLevel model=new WaterLevel();
private int stationId=-1;
private int monitoreeId=-1;
private WaterLevelQueryArg arg=new WaterLevelQueryArg();
private File excel;
private String excelContentType;
private String excelFileName;
/**
* 手工输入
*/
public String handInput() {
model.setId(null);
model.setStation(new Station(stationId));
model.setMonitoree(new AppUser(getLoginUser().getId()));
service.saveOrUpdate(model);
getRequest().setAttribute("resultMessage", "录入成功");
return "view";
}
(其他代码省略)
}
⑵ Excel导入数据的实现
表格导入主要过程包括了文件上传,Excel文件遍历和数据库记录插入,其Struts的Action的关键代码如下:
public class WaterLevelAction extends PagealbeAction
/**
* 从表格中导入
*/
public String excelImport() throws Exception {
final Integer[] count={ 0 };
try {
ExcelTableReader reader=new ExcelTableReader(excel);
reader.process(new ExcelRecordProcessor() {
@Override
public void ProcessRecord(Cell[] columns) {
WaterLevel w=new WaterLevel();
// 初始化一个实例
w.setId(null);
w.setMonitoree(getLoginUser());
w.setStation(new Station(new Integer(columns[0]
.getContents())));
w.setTime(ExcelTableReader.getDate(columns[1]));
w.setWaterLevel(Double.valueOf(columns[2].getContents()));
// 保存
service.saveOrUpdate(w);
(其他代码省略)
}
2.3 实时水情分析的设计和实现
实时水情分析,是指利用已有的最新水情数据,将当前的实时水情及其分析结果用图、表的形式展现出来,方便用户掌控当前的实时水情。实时数据的展现形式主要包括图示和报表显示。图示即标明每个检测站在地图中的位置及当前的状态信息,让用户对当前的水情在地理上的分布有一个直观的认识,如图6所示。而报表显示则将水库和河道的实时信息通过表格的形式展示给用户,表格中包括水情的详细统计数据,如图7所示。
图6 实时水情图示
图7 实时水情报表
水情图示功能是利用百度地图的API来显示地图。百度地图API是一套应用程序接口,通过该API,即可在应用中构建功能丰富、个性化的、高效的地图功能,其中包含了构建地图基本功能的多个接口,提供了诸如位置搜索、周边查询、出行路线规划等功能服务。本系统主要利用了API中地图显示功能,并将测站的信息以覆盖物(覆盖物是百度地图API中叠加或覆盖到地图中的内容)的形式显示出来。载入地图并初始化的JS代码如下:
var map;
$(document).ready(function() {
// 创建地图实例
map=new BMap.Map("container");
// 禁用双击放大
map.disableDoubleClickZoom();
// 添加导航控件
map.addControl(new BMap.NavigationControl({
type:BMAP_NAVIGATION_CONTROL_LARGE
}));
// 添加地图类型控件
map.addControl(new BMap.MapTypeControl());
// 添加图例控件
map.addControl(new CutLineControl());
// 添加地区控件
map.addControl(new RegionControl());
// 初始化地图,设置中心点坐标和地图级别
map.centerAndZoom('杭州');
// 用于保存创建的站点列表
var stationMarkers=new Array();
// 从服务器获取水位信息并更新显示
function getAndUpdateStations() {
$.getJSON("../waterLevel/getAllLatest.action",function(data) {
var list=stationMarkers;
var levels=data.list;
var i, j;
for(i=0; i list[i].level=levels[i]; list[i].updateDiv(); } }); } // 获取站点列表并加载 $.getJSON("../station/getAll.action", function(data) { // 加载返回的站点列表 for(var i=0; i var lng=data.list[i].lng; var lat=data.list[i].lat; var marker=new StationMarker(new BMap.Point(lng,lat), data.list[i]) stationMarkers[i]=marker; map.addOverlay(marker); marker.waterLevel=''; marker.updateDiv(); } // 获取水位信息并更新显示 getAndUpdateStations(); // 定时器:获取水位信息并更新显示 $(document).everyTime( 60*1000, function() { getAndUpdateStations(); }); }); }); (其余功能代码省略) 2.4 实时水情分析的设计和实现 统计查询是指利用系统采集到的数据,统计一段时间内的水情水位信息,并以图、表等形式展现给用户。主要界面如图8和图9所示。 图8 某个测站在一段时间内的统计信息 图9 在一段时间内的水情的统计报表 统计查询中涉及到许多不同类型信息的统计,这里以一个时间段内的每个时间单位的平均水位为例。为了防止系统中单纯为传递数据的Java Bean数量的无限制地增长,我们用了Map(映射)代替Java Bean来返回查询的结果。其主要代码略。 2.5 防汛预警的设计和实现 防汛预警,主要是利用之前的数据通过算法预测出某天的水位数据,给防汛的决策提供一定的数据支持,其主要界面如图10所示。 图10 在一段时间内的水情的统计报表 预测算法如下: public class PredectionService { /** * 根据之间的数据预测下一天的数据 * * @param list * @param algorithm * @return * @throws MessageException */ public Map list, String algorithm) throws MessageException { // 变量声明 double result=0; int n=list.size(); double[] x=new double[n]; // 初始化原始数组 int i=n-1; for (Map x[i--]=(Double) m.get("level"); } // 调用相应算法 try { Method method=this.getClass().getMethod(algorithm, double[].class); result=(Double) method.invoke(this, x); } catch (Exception e) { throw new MessageException("不支持的算法"); } // 添加到结果中 Map t=new HashMap try { SimpleDateFormat sdf=new SimpleDateFormat ("yyyy-MM-dd"); Date date=sdf.parse((String) t.get("time")); date=new Date(date.getTime()+24L*60*60*1000); t.put("time", sdf.format(date));
t.put("level", result);
t.put("isPrediction", true);
} catch (ParseException e) {
e.printStackTrace();
}
// 返回
return t;
}
/**
* 平均算法
*
* @param x
* @return
*/
public Double average(double[] x) {
double p=0;
for (double a:x) {
p+=a;
}
return p/x.length;
}
/**
* 插值算法
*
* @param x
* @return
*/
public Double interpolation(double[] x) {
double p=0;
int n=x.length;
double avg=average(x);
if (n==7) {
p=x[6]-7*x[5]+21*x[4]-35*x[3]+35*x[2]-21*x[1]+7*x[0];
} else if (n==6) {
p=-x[5]+6*x[4]-15*x[3]+20*x[2]-15*x[1]+6*x[0];
} else if (n==5) {
p=1*x[4]-5*x[3]+10*x[2]-10*x[1]+5*x[0];
} else if (n==4) {
p=-1*x[3]+4*x[2]-6*x[1]+4*x[0];
} else if (n==3) {
p=1*x[2]-3*x[1]+3*x[0];
} else if (n==2) {
p=1*x[1]-2*x[0];
} else if (n==1) {
p= [0];
}
if (p<0||p>2*avg||p double xx[]=new double[n-1]; for (int i=0; i xx[i]=x[i]; } return interpolation(xx); } return p; } } 3 结束语 面向数字城管的防汛决策支持系统平台是当今数字城管建设的重要组成部分,通过对城市河道、水库等防汛数据进行综合收集和整理,实现对重点区域的有效监控,建立和优化防汛决策的基础数据库,可为城市的防汛减灾决策提供支持。面向数字城管的防汛决策支持系统,有效地利用数字城管平台积累的数据,并在此基础上进行数据分析,提取有价值的信息,可进一步促进数字城管应用的开发利用和知识发现,提升城市管理的水平和效能。面向数字城管的防汛决策支持系统使用当今主流的Java EE技术设计开发,以Oracle作为其数据库系统,以Hibernate作为持久层管理,用Spring作依赖注入,使用Struts2作为控制层。系统充分展示了MVC设计模式的运用。B/S架构使得该系统可以在任何有浏览器而无需JRE支持的系统上直接使用。 参考文献: [1] 余孟泽,赵美英.打造“全省示范,全国领先”数字城管[J].城乡建设,2006.8:53-54 [2] 河南省洛阳市文明办,洛阳以数字化城市管理给力文明城市创建,http://archive.wenming.cn/gzyd/2010-11/15/content_21390931.htm. [3] 陈观林,李圣权,周鲁耀.杭州市“数字城管”现状及发展对策研究[J].情报杂志,2009.28(3):43-45 [4] 贾超,徐帮树,韩永军等.济南城市防汛预警决策支持系统研究[J].中国水利,2010.5:42-44 [5] 田丽秋.水环境空间决策支持系统的研究与实现[J].计算机光盘软件应用,2011.3:110-110