zoukankan      html  css  js  c++  java
  • 基于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     }

    功能配置:

    系统会自动检测配置功能

  • 相关阅读:
    NUMBER BASE CONVERSION(进制转换)
    2776 寻找代表元(匈牙利算法)
    最长严格上子序列(二分优化)
    c++ bitset类的使用和简介
    笨小猴 2008年NOIP全国联赛提高组
    三国游戏 2010年NOIP全国联赛普及组
    全国信息学奥林匹克联赛(NOIP2014)复赛 模拟题Day2 长乐一中
    codevs 1704 卡片游戏
    热浪
    全国信息学奥林匹克联赛 ( NOIP2014) 复赛 模拟题 Day1 长乐一中
  • 原文地址:https://www.cnblogs.com/liuyuqing/p/3746552.html
Copyright © 2011-2022 走看看