系統演示請看《我的插件GIS系統演示》
GIS應用系統最基礎的功能就是要實現空間數據的可視化展示,能夠進行縮放、漫游、測距等操作。不管是CS還是BS架構的系統,所有的功能離不開地圖展示控件。在本節中,將對地圖控件進行一個簡單的介紹。
DefaultMapControl(DM控件)是一個自定義控件,該控件是在Esri的MapControl的基礎上進行了一些擴展,增加了幾個簡單的功能。
該節敘述的只是一些較為重要的擴展,詳細的代碼,我會在重構之后放出。
DM控件有這么幾個特點:
1、全局訪問
2、全局唯一
3、是數據顯示、數據選擇、數據編輯的UI接口
基於DM的特點與功能要求,進行了如下擴展:
1、 DefaultMapControl的單件實例
由於在整個系統中有很多地方需要訪問DM控件,且DM控件在整個應用里具有惟一性,因此封裝了一個DM控件的靜態單件實例,方便對DM控件的訪問。
2、視圖刷新提示
當數據量較大,或者圖層數過多時,在DM中繪制圖形會耗時較多,因此,需要在狀態欄中顯示繪制進度。
主要是對Esri的AxMapControl的如下事件進行捕獲,並操作:
1)OnBeforeScreenDraw
在狀態欄中顯示視圖繪制的提示信息。視圖繪制信息可以以文本的方式顯示,我在系統中,使用了一個圖標來標識當前地圖視圖是否在繪制過程中。如下圖所示:
大家可以根據自己的需求來定義顯示格式。
1 void axMapControl1_OnBeforeScreenDraw(object sender, IMapControlEvents2_OnBeforeScreenDrawEvent e)
2 {
3 //在狀態欄中顯示視圖繪制提示
4 StatusBarService.ShowMapDrawing(true);
5 }
2)OnAfterScreenDraw
在狀態欄中顯示繪制結束信息。
1 void axMapControl1_OnAfterScreenDraw(object sender, IMapControlEvents2_OnAfterScreenDrawEvent e)
2 {
3 StatusBarService.ShowMapDrawing(false);
4 if (this.AxMapControl.Map.SelectionCount == 0)
5 StatusBarService.SetMessage("就緒");
6 }
3)OnViewRefreshed
在狀態欄中顯示具體繪制圖層的信息。
1 void axMapControl1_OnViewRefreshed(object sender, IMapControlEvents2_OnViewRefreshedEvent e)
2 {
3 StatusBarService.ShowMapDrawing(true);
4 if (e.layerOrElement != null && e.layerOrElement is ILayer)
5 {
6 StatusBarService.SetMessage(string.Format("正在顯示{0}…",
7 ((ILayer)e.layerOrElement).Name), true);
8 }
9 }
3、數據編輯
數據編輯也是GIS系統不可或缺的功能,在DM控件中定義了一個 IEngineEditor類型的編輯器屬性,同時將當前編輯圖層CurrentEditLayer也以屬性的方式定義。
1)編輯器
2)當前編輯圖層
1 /// <summary>
2 /// 當前編輯圖層
3 /// </summary>
4 public IFeatureLayer CurrentEditLayer
5 {
6 get
7 {
8 currentEditLayer = null;
9 IEngineEditLayers editLayers = DefaultMapControl.Instance.Editor as IEngineEditLayers;
10 if (editLayers != null)
11 currentEditLayer = editLayers.TargetLayer;
12 return currentEditLayer;
13 }
14 }
15
16 /// <summary>
17 /// 編輯器
18 /// </summary>
19 public IEngineEditor Editor
20 {
21 get { return this.axMapControl1.Editor; }
22 }
4、工作區域管理
在大多數GIS應用系統中,在進行某些作業時,會針對指定的區域進行操作(如導出數據、數據分析),為此我在系統中引入了工作區域(WorkArea)的概念,建立了工作區域、工作區域管理器等類,便於管理。
1 public WorkAreaManager WorkAreaManager
2 {
3 get { return this.workAreaManager; }
4 }
有關工作區域的詳細內容,將在后續章節中敘述。