• 建立自定义命令扩展ArcGIS


    关于本文

    本文演示如何创建一个简单的命令,实现缩放至所选图层范围的功能。该命令继承自ESRI公司的ADF里的BaseCommand类。以下是详细实现步骤。

    注:本文演示环境 VS2020 & C# & ArcGIS 10.0  本文PDF下载

    创建一个类库

    开启VS2010,以Visual C# >> ArcGIS >>Extending ArcObjects 下的Class Library (ArcMap) 为模板创建一个新类库项目,将该项目命名为CmdZoomToLayer,选择合适的存储位置,单击确定。如下图所示。

    添加引用

    为该项目添加所需的ESRI对象库引用以及System.Drawing引用。

    ESRI提供的ESRI.ArcGIS.ADF.Local程序集包含了ESRI.ArcGIS.ADF.BaseClasses命名空间,可以继承该程序集所提供的一些抽象类来创建一个自定义命令/工具。该程序集还包含了ESRI.ArcGIS.ADF.CATIDs命名空间,其中的一些类可用于注册组件至合适的ESRI组件类别。

    在上一步点击确定后,弹出ArcGIS Project Wizard,可以利用该向导添加ESRI对象库引用。因为现在创建的是ArcGIS Desktop应用程序,所以只有与ArcGIS Desktop相关的程序集才显示于该向导中。添加ESRI.ArcGIS.ADF.Local,ESRI.ArcGIS.ArcMapUI,ESRI.ArcGIS.Carto,ESRI.ArcGIS.Framework,ESRI.ArcGIS.Geometry,ESRI.ArcGIS.System和ESRI.ArcGIS.SystemUI这7个引用。点击Finish以创建项目。如下图所示。

    除了添加ESRI引用之外,还得添加System.Drawing引用。在添加引用对话框的.NET选项卡下选中System.Drawing,单击确定。如下图所示。

    删除class1文件

    删除项目默认创建的class1.cs文件,因为在该项目中不会使用该文件。

    创建一个ZoomToLayer命令

    使用ArcGIS项模板添加一个新的类,以创建ZoomToLayer命令。在解决方案资源管理器中右键单击项目,选择添加 >> 新建项,在添加新项对话框中,选择Visual C# >> ArcGIS >>Extending ArcObjects下的Base Command模板创建ZoomToLayer.cs类,单击添加。如下图所示。

    在弹出的ArcGIS New Item Wizard Options对话框中选择Desktop or ArcMap Command,单击OK。如下图所示。

    更换默认图标

    默认的,项目中已经添加了一张位图用作该命令的图标,可以是用图像编辑器对位图进行编辑。本示例中,删除原位图,再手工添加一张新位图以用作该命令的图标。

    删除原位图ZoomToLayer.bmp文件。

    在解决方案资源管理器中,右键单击项目,选择添加 >> 现有项,在添加现有项对话框中,导航至存储有合适的图标文件的文件夹,选中合适的图标,单击添加,将其复制到项目目录下。更改其名称前缀为ZoomToLayer,并在属性窗口中将其生成操作属性更改为嵌入的资源。如下图所示。

    继承BaseCommand抽象类

    抽象类是不能被实例化的类,抽象类可包含不被实现的抽象方法。抽象类与接口较为类似,但二者的不同之处也值得注意:一个类可以实现多个接口,但是只能继承自一个抽象类。

    归功于ArcGIS-Visual Studio集成框架,当使用添加项目模板为ArcMap Desktop创建命令时,会自动实现大部分托管代码。比如,自动创建了一个IApplication接口成员变量、构造函数、重写OnCreate和OnClick方法等。当然,要完全实现所需功能,仍需进一步完善这些自动实现的代码。

    ZoomToLayer的定义语句,表示ZoomToLayer是继承自BaseCommand抽象类的。如下所示。

    public sealed class ZoomToLayer : BaseCommand

    为构造函数添加代码

    完善ZoomToLayer的构造函数(覆写BaseCommand抽象类的构造函数),以实现客户化定制所需功能与效果。

    在ZoomToLayer.cs文件中,找到默认添加的构造函数,可以发现其所有属性都是空字符串,这些值是该命令嵌入ArcGIS时呈现给使用者的信息,在此修改它们为合适的值。如下代码所示。

    public ZoomToLayer()

    {

    //

    // TODO: Define values for the public properties

    //

    base.m_category = "Hans_GIS"; //localizable text

    base.m_caption = "缩放至图层"; //localizable text

    base.m_message = "缩放至内容目录窗口中活动图层的范围"; //localizable text

    base.m_toolTip = "缩放至图层"; //localizable text

    base.m_name = "Hans_GIS_ZoomToLayer"; //unique id, non-localizable (e.g. "MyCategory_ArcMapCommand")

     

    try

    {

    //

    // TODO: change bitmap name if necessary

    //

    string bitmapResourceName = GetType().Name + ".png";

    base.m_bitmap = new Bitmap(GetType(), bitmapResourceName);

    }

    catch (Exception ex)

    {

    System.Diagnostics.Trace.WriteLine(ex.Message, "无效的图标");

    }

    }

    添加缩放至图层的功能

    除了覆写抽象类的一些方法之外,还必须添加一些自定义的方法,以实现自定义的功能。添加ZoomToActiveLayerInTOC方法如下。

    public void ZoomToActiveLayerInTOC(IMxDocument mxDocument)

    {

    if (mxDocument == null)

    {

    return;

    }

    IActiveView activeView = mxDocument.ActiveView;

    // Get the TOC

    IContentsView IContentsView = mxDocument.CurrentContentsView;

    // Get the selected layer

    System.Object selectedItem = IContentsView.SelectedItem;

    if (!(selectedItem is ILayer))

    {

    return;

    }

    ILayer layer = selectedItem as ILayer;

    // Zoom to the extent of the layer and refresh the map

    activeView.Extent = layer.AreaOfInterest;

    activeView.Refresh();

    }

    添加GetMxDocumentFromArcMap方法如下。

    public IMxDocument GetMxDocumentFromArcMap(IApplication application)

    {

    if (application == null)

    {

    return null;

    }

    IDocument document = application.Document;

    IMxDocument mxDocument = (IMxDocument)(document); // Explicit Cast

    return mxDocument;

    }

    在ArcMap中单击命令时,会激发其OnClick事件,要想实现缩放至图层功能,还得在OnClick方法中调用前面添加的两个方法。如下所示。

    public override void OnClick()

    {

    // TODO: Add ZoomToLayer.OnClick implementation

    IMxDocument mxDocument =GetMxDocumentFromArcMap(m_application);

    ZoomToActiveLayerInTOC(mxDocument);

    }

    暴露ZoomToLayer类为COM

    ArcGIS是一套基于COM的应用程序,我们现如今在.NET平台下编辑的类必须暴露为COM才能为ArcGIS正确识别并使用。基于BaseCommand模板建立.NET程序集时,这个工作已经由模板自动完成了。感兴趣的话请参考#region COM Registration Function(s)代码片段。

    编译项目

    保存对项目所做的所有更改,单击生成 >> 生成解决方案。可以在项目文件夹的子目录下查看到生成结果。在Bin\Debug目录下可以看到有一个动态链接库文件(DLL)、另外两个文件(PDB & TLB)是由程序集注册工具生成的。

    如果在生成解决方案时提示错误,请按照错误提示更正代码,直至编译成功。

    在ArcMap中使用该命令

    启动ArcMap,打开一个地图文档。单击自定义 >> 自定义模式。在打开的自定义对话框中选择命令面板,在类别栏目下选中Hans_GIS,即可看到缩放至图层命令显示于命令栏目下。如图所示。

    可以看到显示于该界面下的命令的类别与标题是与构造函数中的信息是一致的。如果在该步骤找不到所定制的类别与命令,那么在Visual Studio 2010中打开项目属性,确保选中生成面板中的为COM互操作注册,然后再次编译项目。

    单击缩放至图层命令并拖放至ArcMap的任一工具栏,然后关闭自定义对话框。返回到ArcMap,在内容目录窗口中单击一个图层,然后单击刚添加的缩放至图层命令,地图就被缩放至该图层的范围。如下所示。

    总结

    本文详细讲述了如何使用ArcGIS集成模板建立一个命令来扩展ArcGIS的功能。(完)

  • 相关阅读:
    final 和 static
    EL表达式
    strusts2request,session取得
    Double的精度问题
    隐藏软件盘(个人因为好用的方法)
    ListView没有分割线怎么办?
    自定义ActionBar完全覆盖系统的
    保存图片的工具类
    Intent传递list<bean>集合
    Android取得图库图片的具体地址
  • 原文地址:https://www.cnblogs.com/hans_gis/p/2173376.html
Copyright © 2020-2023  润新知