鐘凱 黃義忠 譚榮建 馬義超 王恒煊
摘 要:為了提高溫州市鹿城區城市管理與行政執法局執法效率,采用數據庫技術與地理位置相結合的方式,設計并開發了溫州市鹿城區違停管理系統,以取代傳統的手工Excel記錄方式。通過數據分析和功能分析明確系統功能,并進一步給出設計方向、實現方法與關鍵技術,包括SQL查詢、Excel表數據添加、圖層屬性查看、查詢統計、密度分析與熱力圖顯示等。開發設計出的基于GIS的城市違停管理數據庫系統,可以將歷史違停數據與地理位置信息相結合,形成可視化的數據綜合統計分析平臺,從而對未來形勢進行預判,并為今后的停車場選址提供依據。
關鍵詞:GIS;車輛違停管理;SQL查詢;統計查詢;熱力圖;數據可視化
DOI:10. 11907/rjdk. 182019
中圖分類號:TP319文獻標識碼:A文章編號:1672-7800(2019)004-0127-06
0 引言
隨著機動車數量的不斷增長,城市道路的承載量日趨增大,泊車位呈現過飽和狀態,城市違停現象時有發生,對此,本文以溫州市鹿城區為例進行研究。吳益[1]和陳志利[2]從公共管理角度論證了溫州市鹿城區的違停狀況與解決違停問題的必要性;吳鎏鵬[3]采用B/S架構和Java語言設計開發了一套違停信息管理系統,但其研究未將違停數據與地理位置信息相結合進行可視化展示。因此,本文采用數據庫技術以及C#結合ArcEngine二次開發技術,設計一套城市違停管理數據庫系統[4-5],可實現違停數據的快速導入并關聯地理位置信息,生成可視化的違停數據矢量圖,并能快速查詢違停數據,實現密度分析并生成可視化的違停數據熱力圖,從而實現對違停狀況的分析與管理。
1 需求分析
城市違停管理數據庫系統包含數據庫與管理系統兩部分[6]。
1.1 數據庫需求分析
數據庫部分應包含以下3個功能,分別為:
(1)數據導入。本項目數據源為Excel表格,包括歷史記錄表格數據與通過網絡自動生成的實時表格數據。通過新建查詢功能或操作員的手動操作,將數據導入數據庫系統。
(2)數據統計與關聯。完整的數據庫系統包括地理基礎空間數據、車輛違停歷史數據、違停實時數據、路段數據以及中隊數據,本系統包含的地理空間數據為地名坐標文件數據。通過查詢語句將缺少空間坐標的違停記錄與地址坐標數據相關聯,生成一個包含X/Y空間坐標數據的新表,從而完成數據關聯。
(3)數據導出。根據數據庫的穩定性需求以及大數據環境的現實情況,需要將數據庫中關聯的數據定時導出備份,并入庫存檔。數據導出類似于數據導入。
1.2 管理系統需求分析
管理系統應包含以下5個功能,分別為:
(1)圖層加載功能。本系統基于ArcEngine技術進行二次開發,所以基礎數據需要通過“加載圖層”功能實現。
(2)表數據加載功能。表數據即為導出備份的Excel表數據,以及其它歷史違停數據。通過該功能將表中一條條獨立記錄以X/Y坐標數據形式結合空間參考文件生成統計點,自動添加至圖層窗口,作為統計分析的主體。
(3)右鍵菜單查看屬性功能。將生成的統計點數據添加至圖層窗口后,圖層名自動添加至圖層列表,然后通過圖層列表右鍵菜單調出“查看屬性表”選項,打開屬性表窗口,可以查看選中圖層的完整屬性。
(4)統計查詢功能。類似于GIS中的按屬性查詢,是本系統的核心功能。通過篩選關鍵數據信息,實現分時段統計、分路段統計與分中隊統計等查詢統計功能,并能實時顯示在窗口,十分快速、準確。
(5)密度分析與熱力圖顯示功能。通過數據可視化分析技術生成熱力圖,能直觀了解點的分布規律及分布形式,從而幫助管理者快速理解數據,找出海量數據中的規律并從中提取有用信息,為決策分析提供了便利。
2 總體架構
一個完整的管理信息系統應包括軟硬件支持層、數據層、應用層3部分[7-8]。本系統總體架構如圖1所示。
2.1 軟硬件支持層
軟硬件支持層是平臺運行的主要環境支撐,包括數據庫服務器、應用服務器、網絡設備、操作系統軟件等設施,可為違停大數據分析平臺建設提供軟硬件支持。
2.2 數據層
數據層主要負責存儲與管理數據,包括數據存儲、數據讀寫、數據備份等功能。數據層由數據庫軟件、數據處理語言與數據表組成,其中包含地理空間數據、車輛違停歷史數據、車輛違停實時數據、路段數據、中隊數據等。
2.3 應用層
應用層是面向用戶提供各類業務功能與交互的界面層,將服務層提供的各類服務通過友好的功能界面進行封裝,提供給用戶使用,并與用戶進行交互操作,主要包括地圖加載切換功能、數據加載功能、實時統計分析功能、屬性表查詢功能、密度分析與熱力圖顯示功能等。
3 數據庫結構與查詢
3.1 數據庫結構
違停數據庫中主要存儲基礎地理數據與違停數據。數據結構如圖2所示。
其中,基礎地理數據包含中隊數據、路段數據、地名統計數據等涉密敏感數據,所以本文未作收錄,也不作演示,但本文在數據庫中模擬了一份臨時地名地址數據作為基礎地理數據,包含3個字段:地名、X坐標、Y坐標。
違停數據包括歷史違停數據與實時數據。歷史數據為歷史時間段的違停記錄,可關聯地理坐標數據,是完整的違停數據記錄,數據量龐大且涉密;實時數據是通過多渠道實時接收到的違停記錄數據,包括實時更新的涉密數據以及一份采取去密操作后的樣例數據。實時數據只包含違停記錄的地址或位置信息,而缺少對應坐標信息。樣例數據包含以下7條記錄:記錄編號、錄入時間、道路編號、路段編號、違規項、中隊編號及車牌號。
3.2 SQL查詢
樣例數據與臨時地名地址數據之間相互獨立,且數據量較大,要為樣例數據增添地理位置坐標,可以通過在兩張Excle表數據之間建立SQL查詢加以實現[9-14]。在數據庫中,違停樣例數據為表wt,而臨時地名地址數據為表loc,現需要通過查詢,將表loc中的坐標信息通過地址字段值關聯至表wt中的每一條記錄。
查詢思路如下:如果wt的地址字段值(H_Address)出現了對應表loc中的地址記錄,意味著該違停記錄有了對應的位置信息(WEITING_poi_x,WEITING_poi_y),否則,在wt表與本記錄之外的其它違停記錄中查找:“是否有對應的道路及其路段(h_roadid,H_RoadSectionId)相同的其它記錄,且其地址(H_Address)也在loc中的地址(H_Address)出現”,如果有滿足該條件(condition1)的記錄r2,則取出r2的地址,并替換r1的地址,r1.h_address=r2.h_address。如果以上兩點都不滿足,即意味著表wt中該項記錄的地址字段值在表loc中不存在完全對應的記錄。繼續用地址(r1.h_address)在loc中尋找地址記錄,觀察r1.h_address的前部是否與其一致。例如 r1.h_address=“甌江大廈南門”在loc中有loc.h_address=“甌江大廈”的記錄,則r1.h_address=“甌江大廈”。如果上述查找都失敗,則說明該地址無法(直接或間接)找到匹配的地址位置信息,需要操作員手工篩選關聯數據。
具體查詢流程如圖3所示。
4 功能設計與實現
4.1 圖層加載
通過menuStrip菜單欄上的“文件”-“載入”,打開文件選擇界面,選擇并添加圖層文件“溫州市鹿城區歷史違停柵格-矢量圖”,實現圖層加載功能,得到結果如圖4所示。
打開。mxd文件關鍵代碼如下:
System.Windows.Forms.OpenFileDialog open2 = new OpenFileDialog();
open2.Filter = "Arcgis mxddocument(*mxd)|*mxd";
open2.Multiselect = false;
open2.Title = "打開arcgis地圖文檔";
if (open2.ShowDialog() == DialogResult.OK)
{
if (axMapControl1.CheckMxFile(open2.FileName))
{
axMapControl1.LoadMxFile(open2.FileName);
axMapControl1.Refresh();
}
}
如果要實現分別加載柵格數據、矢量數據以及多種類地圖文檔,代碼如下:
System.Windows.Forms.OpenFileDialog open1 = new OpenFileDialog();
open1.Filter = "shape文件(*.shp)|*.shp";
open1.Filter += "柵格數據(*.jpg,*.bmp,*.tiff)|*.jpg;*.bmp;*.tiff|";
open1.Filter += "地圖文檔(*.mxd,*.mxt,*.jmf)|*.mxd;*.mxt;*.jmf|";
open1.Multiselect = false;
open1.Title = "打開文件";
4.2 表數據添加
添加表數據也是本系統的核心功能之一,將Excel表數據轉換為shapefile格式的空間點數據,并添加到MapControl中作為統計點數據用于后續統計查詢。通過menuStrip菜單欄上的“文件”-“導入表數據”,打開導入表數據的彈框,在“選擇數據源”中選中“樣例.xls”文件;在“選擇X/Y坐標數據”中,X坐標選擇WEITING_poi_x(經度),Y坐標選擇WEITING_poi_y(緯度);在“選擇投影圖層”中,選中CGCS2000坐標系;在“選擇輸出路徑”中,選擇保存路徑即可。添加表數據界面如圖5所示。
此時可得到新的結果,將溫州市的柵格圖層去掉,得到新的溫州市鹿城區違停數據矢量圖。如圖6所示,圖中紫色點為歷史違停數據,綠色點為新增違停樣例數據(彩圖見封二)。
導入數據窗體功能的實現分為3部分。第一部分為表數據選擇,單擊窗體上的“打開數據”按鈕,激活系統窗口選擇Excel文件,并讀取其sheet數據和每一欄標題數據。關鍵代碼如下:
OpenFileDialog file = new OpenFileDialog();
string[] SheetName;
file.Filter = "Excel03文件(*.xls)|*.xls|文本文件(*.txt)|*.txt";
file.Title = "選擇數據表";
file.RestoreDirectory = true;
if (file.ShowDialog() == DialogResult.OK)
{
sheetcmbx.Items.Clear();
path.Text = @file.FileName;
if (System.IO.Path.GetExtension(file.FileName) == ".xls")