基於sharpdevelop核心和ArcEngine打造插件式桌面GIS應用之三——核心控件DefaultMapControl


  系統演示請看《我的插件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 }

  有關工作區域的詳細內容,將在后續章節中敘述。
  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM