摘 要: 結合城市防汛預警決策的信息化建設,開發了數字城管防汛決策支持系統。介紹了開發該系統的意義、所使用的關鍵性技術、設計模式和開發工具。該系統應用了基于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=1;
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(1);
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(1);
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