基于AE的SimpleGIS框架的搭建

ArcGIS是Esri公司集40余年地理信息系统(GIS)咨询和研发经验,奉献给用户的一套完整的GIS平台产品,具有强大的地图制作、空间数据管理、空间分析、空间信息整合、发布与共享的能力。本人主要就AE搭建框架做简单的介绍

框架是指一个系统的全部或部分可复用设计,通常由一组抽象类和类之间的协助组成,其有几个特点。

1.模块化:应用框架可以从逻辑上划分为若干个不同的功能模块。

2.可重用性:代码的可重用性是衡量代码健壮性的一个标志,无论是函数,类,接口,还是其他更高层次的模型,都是为了提高其重用性。

3.可扩展性:可扩展性是应用框架一个最显著地标志,他意味着框架的能力具有可生长性。

其实arcmap也是一个可以扩展的框架,下面我们通过对arcmap的框架的研究来学习如何搭建自己的框架

首先我们打开arcmap编写一个简单的宏

 

 

宏命名为zoomin--实现一个简单的放大功能

 2 Dim imxdocument As imxdocument
 3 Dim penovlop As IEnvelope
 4 Set imxdocument = ThisDocument
 5 Set penovlop = imxdocument.ActiveView.Extent
 6 penovlop.Expand 0.2, 0.2, True
 7 imxdocument.ActiveView.Extent = penovlop
 8 imxdocument.ActiveView.Refresh

 

保存宏,在菜单--自定义--自定义模式--工具条  新建工具条

 

我们在arcmap工具条看到一个新的工具栏,

 在菜单--自定义--自定义模式--命令  找到 --宏   将我们刚才写的宏拖到菜单栏,这样我们就实现 了一个简单的功能

如此可见arcmap是一个可拓展的框架

2.通过实现接口或者抽象类的方法实现arcgis功能

如图安装了arcgis后 可以使用arcgis addin 来扩展功能

  1 namespace ClassLibrary1
  2 {
  3     /// <summary>
  4     /// Command that works in ArcMap/Map/PageLayout
  5     /// </summary>
  6     [Guid("86fbcea5-043b-404a-a00c-5c480b42f51e")]
  7     [ClassInterface(ClassInterfaceType.None)]
  8     [ProgId("ClassLibrary1.Command1")]
  9     public sealed class Command1 : BaseCommand
 10     {
 11         // 将.net 注册为com函数
 12         #region COM Registration Function(s)
 13         [ComRegisterFunction()]
 14         [ComVisible(false)]
 15         static void RegisterFunction(Type registerType)
 16         {
 17             // Required for ArcGIS Component Category Registrar support
 18             ArcGISCategoryRegistration(registerType);
 19 
 20             //
 21             // TODO: Add any COM registration code here
 22             //
 23         }
 24 
 25         [ComUnregisterFunction()]
 26         [ComVisible(false)]
 27         static void UnregisterFunction(Type registerType)
 28         {
 29             // Required for ArcGIS Component Category Registrar support
 30             ArcGISCategoryUnregistration(registerType);
 31 
 32             //
 33             // TODO: Add any COM unregistration code here
 34             //
 35         }
 36 
 37         #region ArcGIS Component Category Registrar generated code
 38         /// <summary>
 39         /// Required method for ArcGIS Component Category registration -
 40         /// Do not modify the contents of this method with the code editor.
 41         /// </summary>
 42         private static void ArcGISCategoryRegistration(Type registerType)
 43         {
 44             string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
 45             MxCommands.Register(regKey);
 46             ControlsCommands.Register(regKey);
 47         }
 48         /// <summary>
 49         /// Required method for ArcGIS Component Category unregistration -
 50         /// Do not modify the contents of this method with the code editor.
 51         /// </summary>
 52         private static void ArcGISCategoryUnregistration(Type registerType)
 53         {
 54             string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);
 55             MxCommands.Unregister(regKey);
 56             ControlsCommands.Unregister(regKey);
 57         }
 58 
 59         #endregion
 60         #endregion
 61 
 62         private IHookHelper m_hookHelper = null;
 63         public Command1()
 64         {
 65             // 初始化
 66             // TODO: Define values for the public properties
 67             //
 68             base.m_category = ""; //localizable text
 69             base.m_caption = "";  //localizable text 
 70             base.m_message = "This should work in ArcMap/MapControl/PageLayoutControl";  //localizable text
 71             base.m_toolTip = "";  //localizable text
 72             base.m_name = "";   //unique id, non-localizable (e.g. "MyCategory_MyCommand")
 73 
 74             try
 75             {
 76                 //
 77                 // TODO: change bitmap name if necessary
 78                 //
 79                 string bitmapResourceName = GetType().Name + ".bmp";
 80                 base.m_bitmap = new Bitmap(GetType(), bitmapResourceName);
 81             }
 82             catch (Exception ex)
 83             {
 84                 System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap");
 85             }
 86         }
 87 
 88         #region Overridden Class Methods
 89 
 90         /// <summary>
 91         /// Occurs when this command is created
 92         /// </summary>
 93         /// <param name="hook">Instance of the application</param>
 94         public override void OnCreate(object hook)
 95         {
 96             //重写基类
 97             if (hook == null)
 98                 return;
 99 
100             try
101             {
102                 m_hookHelper = new HookHelperClass();
103                 m_hookHelper.Hook = hook;
104                 if (m_hookHelper.ActiveView == null)
105                     m_hookHelper = null;
106             }
107             catch
108             {
109                 m_hookHelper = null;
110             }
111 
112             if (m_hookHelper == null)
113                 base.m_enabled = false;
114             else
115                 base.m_enabled = true;
116 
117             // TODO:  Add other initialization code
118         }
119 
120         /// <summary>
121         /// Occurs when this command is clicked
122         /// </summary>
123         public override void OnClick()
124         {
125             //全图显示
126             IMapControl2 Pmapcontrol2 = m_hookHelper as IMapControl2;
127             Pmapcontrol2.Extent = Pmapcontrol2.FullExtent;
128             Pmapcontrol2.Refresh();
129         }
130 
131         #endregion
132     }
133 }
生成dll文件,将其bin下面的 tlb.格式的文件 加载到 arcmap
二:基于simplegis的水电工程系统
初始化
  1  #region 私有变量
  2         IDockableMapWindow m_pMapDockWindow = null;
  3         private IFramework m_pFramework = null;
  4         private ITocWindow m_pTocWindow = new TocWindow();
  5         private bool m_bCanceledExit = false;
  6         //private License m_pLicense = null;
  7         #endregion
  8 
  9         #region 构造函数和窗体事件函数
 10         public MainForm()
 11         {
 12             //ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Engine);
 13             ESRI.ArcGIS.RuntimeManager.BindLicense(ESRI.ArcGIS.ProductCode.EngineOrDesktop);
 14             //this.m_pLicense = System.ComponentModel.LicenseManager.Validate(typeof(MainForm), this);
 15             m_pMapDockWindow = new MapDockWindow();
 16             this.Controls.Add(m_pMapDockWindow as Control);
 17 
 18 
 19             InitializeComponent();
 20             this.Load += new EventHandler(MainForm_Load);
 21             this.FormClosing += new FormClosingEventHandler(MainForm_FormClosing);
 22             (m_pMapDockWindow as Control).Dock = DockStyle.Fill;
 23 
 24 
 25             #region 初始化框架
 26             this.m_pFramework = new FrameworkClass();
 27             this.m_pFramework.MdiForm = this;
 28             IBarManager pBarManager = new BarManagerClass();
 29             pBarManager.BarManager = this.barManager1;
 30             IDockManager pDockManager = new DockManagerClass();
 31             pDockManager.DockManager = this.barManager1;
 32             this.m_pFramework.BarManager = pBarManager;
 33             this.m_pFramework.DockManager = pDockManager;
 34             //(this.m_pFramework as ICommandLineManager).CommandLineWindow = this.m_frmCommandLine;
 35             #endregion
 36 
 37             #region 命令工具栏赋值
 38             //this.m_frmCommandLine.Framework = this.m_pFramework;
 39             //this.m_frmCommandLine.DockManager = this.dockPanel1;
 40             #endregion
 41 
 42             # region 加载TOC
 43             DockableTocControl ctrToc = new DockableTocControl();
 44             IContentsViewManager pContensViewManager = ctrToc as IContentsViewManager;
 45             IContentsView pContentsView = new DisplayWindow();
 46             pContensViewManager.AddContentsView(pContentsView);
 47             pContentsView = new DataSourceWindow();
 48             pContensViewManager.AddContentsView(pContentsView);
 49             pContentsView = new CatalogWindow();
 50             pContensViewManager.AddContentsView(pContentsView);
 51             pContentsView = new VisibleWindow();
 52             pContensViewManager.AddContentsView(pContentsView);
 53             pContentsView = new SelectionView();
 54             pContensViewManager.AddContentsView(pContentsView);
 55 
 56             pDockManager.DockWindow(ctrToc as IDockableWindow);
 57             IDockableWindow pDockableWindow = pDockManager.GetDockableWindow((ctrToc as IDockableWindow).ID);
 58             this.m_pTocWindow.Toc = pDockableWindow;
 59             this.m_pTocWindow.DockManager = this.barManager1;
 60             this.m_pFramework.OverviewWindow = pContensViewManager.OverviewWindow;
 61             this.m_pFramework.TocWindow = this.m_pTocWindow;
 62             #endregion
 63 
 64             #region 加载地图控件
 65             this.m_pFramework.DelayEvents(true);
 66             this.m_pFramework.Hook = this.m_pMapDockWindow.Hook;
 67             this.m_pFramework.ActiveMapControl = this.m_pMapDockWindow.ActiveMapControl;
 68 
 69             #endregion
 70             #region 加载命令窗体
 71 
 72             #endregion
 73 
 74             #region 符号库
 75             IStyleGallery pStyleGallery = new StyleGalleryClass();
 76 
 77             string sStyleFile = Application.StartupPath + @"\SimpleGIS.style";
 78             if (System.IO.File.Exists(sStyleFile))
 79             {
 80                 (pStyleGallery as IStyleGalleryStorage).AddFile(sStyleFile);
 81             }
 82             (pStyleGallery as IStyleGalleryStorage).TargetFile = sStyleFile;
 83             //if (System.IO.File.Exists(Application.StartupPath + @"\Civic.ServerStyle"))
 84             //{
 85             //    (pStyleGallery as IStyleGalleryStorage).AddFile(Application.StartupPath + @"\Civic.ServerStyle");
 86             //}
 87             this.m_pFramework.StyleGallery = pStyleGallery;
 88             #endregion
 89 
 90             #region 绑定图层显示控件和鹰眼图
 91             this.m_pTocWindow.ContentsViewManager.SetBuddyControl(this.m_pMapDockWindow.Hook, this.m_pFramework);
 92             IOverviewWindow pOverviewWindow = this.m_pTocWindow.ContentsViewManager.OverviewWindow;
 93             if (pOverviewWindow != null)
 94             {
 95                 pOverviewWindow.MainActiveView = this.m_pFramework.Application.ActiveView;
 96                 pOverviewWindow.StyleGallery = this.m_pFramework.Application.StyleGallery;
 97                 pOverviewWindow.Framework = this.m_pFramework;
 98             }
 99             #endregion
100 
101             #region 创建状态栏
102             StatusStrip ctrSta = new StatusStrip();
103             ctrSta.Dock = DockStyle.Bottom;
104             ToolStripStatusLabel lblToolTip = new ToolStripStatusLabel();
105             ctrSta.Items.Add(lblToolTip);
106             ToolStripStatusLabel lblMapPosition = new ToolStripStatusLabel();
107             lblMapPosition.Spring = true;
108             lblMapPosition.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
109             ctrSta.Items.Add(lblMapPosition);
110             this.Controls.Add(ctrSta);
111             IStatusBar pStatusBar = new StatusBarClass();
112             pStatusBar.StatusBarControl = ctrSta;
113             pStatusBar.BarMessageItem = lblToolTip;
114             pStatusBar.BarMousePositionItem = lblMapPosition;
115 
116             pBarManager.StatusBar = pStatusBar;
117 
118             #endregion
119 
120             #region 加载插件
121             string sMainFrameCommands = ConfigurationManager.AppSettings["PluginFile"];
122             pBarManager.CreateToolBar(Application.StartupPath + "\\" + sMainFrameCommands);
123             #endregion
124 
125             #region 绑定右键菜单控件
126             pOverviewWindow = this.m_pFramework.OverviewWindow;
127             if (pOverviewWindow is IControlContextMenu)
128             {
129                 pBarManager.RegisterControlWithPopupContext(pOverviewWindow as IControlContextMenu);
130                 IControlContextMenu2 pControlContextMenu = pOverviewWindow as IControlContextMenu2;
131                 pControlContextMenu.Clear();
132                 pControlContextMenu.AddItem("RefreshOverview", false);
133                 pControlContextMenu.AddItem("Overview", false);
134                 pControlContextMenu.AddItem("OverviewWindowProperty", true);
135             }
136             if (this.m_pTocWindow.ContentsViewManager != null)
137             {
138                 for (int i = 0; i < this.m_pTocWindow.ContentsViewManager.Count; i++)
139                 {
140                     IContentsView pView = this.m_pTocWindow.ContentsViewManager.ContentsView(i);
141                     if (pView is IControlContextMenu)
142                     {
143                         pBarManager.RegisterControlWithPopupContext(pView as IControlContextMenu);
144                     }
145                 }
146             }
147             #endregion
148         }
149 
150         private void MainForm_Load(object sender, EventArgs e)
151         {
152             try
153             {
154                 this.Text = ConfigurationManager.AppSettings["AppName"];
155             }
156             catch (Exception)
157             {
158             }
159             //初始化一个当前工具
160             ICommand pCommand = this.m_pFramework.FindCommand("SelectElementTool");
161             if (pCommand is ITool)
162             {
163                 this.m_pFramework.CurrentTool = pCommand as ITool;
164             }
165 
166             ////打开配置文件中指定的MXD文档
167             //string sMxd = ConfigurationManager.AppSettings["Mxd"];
168             //pCommand = this.m_pFramework.FindCommand("OpenDocumentCommand");
169             //if (pCommand != null && System.IO.File.Exists(sMxd))
170             //{
171             //    IMxdFile pMxdFile = pCommand as IMxdFile;
172             //    if (pMxdFile != null)
173             //    {
174             //        pMxdFile.MxdPath = sMxd;
175             //        pMxdFile.Open();
176             //    }
177             //}
178             this.m_pFramework.DelayEvents(false);
179         }
180 
181         private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
182         {
183             ICommand pCommand = this.m_pFramework.FindCommand("ExitApplication");
184             if (pCommand != null)
185             {
186                 if (pCommand is IExitApplicationEvents)
187                 {
188                     (pCommand as IExitApplicationEvents).CancelExitApplicationEvent += new OnCancelExitApplicationEventHandler(MainForm_CancelExitApplicationEvent);
189                 }
190                 e.Cancel = this.m_bCanceledExit;
191             }
192         }
193 
194         void MainForm_CancelExitApplicationEvent(bool bCanceledExit)
195         {
196             this.m_bCanceledExit = bCanceledExit;
197         }
198         #endregion
199     }

功能配置:

 

系统会自动检测配置功能

 

 

posted @ 2014-05-23 09:07  EcitGis  阅读(1294)  评论(0编辑  收藏  举报