ArcGIS Desktop Add-in插件开发

时间:2024-03-03 15:39:12
1.概述

ArcGIS在10版本之后引入了几个新的创新的功能,使您更容易定制和扩展ArcGIS桌面应用,包括新的桌面插件模型。

 Add-in可以理解为包含多种UI和非UI对象的插件包,其中支持的对象类型包括:

a) 交互类

1) 按钮

按钮是一种简单的控制,可以出现在工具栏上。

2) 工具

工具也是一种简单的控制,可以出现在工具栏上或菜单中。

3) 组合框

组合框提供了一个项目的下拉列表,可以选择提供一个可编辑的输入区域。

4) 多项目

多项目是在运行时动态创建菜单项的集合。

5) 应用程序扩展

应用程序扩展用于组件之间的协调活动,如按钮、工具和停靠窗口。应用程序扩展经常用于侦听和响应由宿主应用程序公开的各种活动。应用程序扩展,可配置为自动加载或在加载它们的相关的应用程序时自动启动,也可以出现在标准ArcGIS的扩展对话框。

6) 编辑器扩展

编辑器扩展可以通过插入框架直接进入编辑工作流程。相对于应用程序扩展,编辑器扩展加载项被加载编辑会话时需要开始编辑。你也可以通过创建编辑器扩展自定义编辑会话的行为

7) 可停靠窗口

在ArcGIS桌面应用程序的显示中,可停靠窗口是浮动或停靠的窗口。在可停靠窗口中你可以填充的内容分为:图表、幻灯片、视频、地图或包括Esri自定义对话框控件。

b) 容器类

 

 1) 工具栏

工具栏可以承载按钮、工具、菜单、工具栏和组合框。

2) 工具盘

工具盘提供了一种紧凑的方式将一组相关的工具集。

3) 菜单

菜单提供了一个菜单项的下拉列表。

4) 右键菜单

右键菜单提供了一个右键弹出的菜单项的下拉列表。

2.开发流程

2.1 开发环境

ArcGISAdd-in的开发环境为VS2010+ArcGIS Desktop10.1+ArcGIS Engine 10.1+Win 7 64bit。

2.2开发步骤

2.2.1       项目需求

查找出面积小于给定值的地块,并合并到相邻的地块中最大的地块。

 2.2.2       功能实现

a)        新建解决方案

启动VS2010,新建项目。

 点击确定,新建一个项目。

b)       进入Welcome页面设置

        Add-in Name:插件的名称;

Company/Publisher:插件的制作公司或发布者;

Author:插件的制作者;

Description:插件的描述;

Image:插件的图标。

 c)        进入Add-in Types页面

Add-in Types页面用于设置创建的插件的类型。

选择Add-in Types,此处选择按钮。

Class Name:类的名称;

Caption:按钮上显示的文本;

Image:按钮上的图标;

Category:所属Command的分类;

Tooltip:鼠标在上面时状态栏显示的文字;

Description:工具的描述。

点击Finish完成设置

  1. d)       文件组织

  2.  

Config.esriaddinx文件是一个XML文件,它是一个配置文件,里面包含了项目的相关配置,是自动生成的。内容如下:

<ESRI.Configurationxmlns="http://schemas.esri.com/Desktop/AddIns"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <Name>FeaturesMerge</Name>

  <AddInID>{94327fc0-a266-44a1-8797-3525955249cf}</AddInID>

  <Description>查找出面积小于给定值的地块,并合并到相邻的地块中最大的地块。</Description>

  <Version>1.0</Version>

  <Image>Images\FeaturesMerge_1.png</Image>

  <Author>zx</Author>

  <Company>Higis</Company>

  <Date>2014/11/17</Date>

  <Targets>

    <Targetname="Desktop"version="10.1" />

  </Targets>

  <AddInlanguage="CLR4.0"library="FeaturesMerge.dll"namespace="FeaturesMerge">

    <ArcMap>

      <Commands>

 <Buttonid="Higis_FeaturesMerge_FeaturesMerge"class="FeaturesMerge"message="查找出面积小于给定值的地块,并合并到相邻的地块中最大的地块。"caption="FeaturesMerge"tip="查找出面积小于给定值的地块,并合并到相邻的地块中最大的地块。"category="Add-In Controls"image="Images\FeaturesMerge.png" />

      </Commands>

    </ArcMap>

  </AddIn>

</ESRI.Configuration>

FeaturesMerge.cs文件是类文件,初始内容如下:

using System;

using System.Collections.Generic;

using System.Text;

using System.IO;

namespace FeaturesMerge

{

    public class FeaturesMerge: ESRI.ArcGIS.Desktop.AddIns.Button

    {

        publicFeaturesMerge()

        {

        }

        protectedoverride voidOnClick()

        {

            ArcMap.Application.CurrentTool= null;

        }

        protectedoverride voidOnUpdate()

        {

            Enabled = ArcMap.Application!= null;

        }

    }

}

类文件中包含两个方法:

1)OnClick()方法

OnClick()方法是按钮点击方法。

2)OnUpdate()方法

OnUpdate()方法是更新的方法。

e)        添加引用

需要调用的类库包括:

  f)        代码编写

1) 添加一个窗体

该功能需要用户点击按钮后,弹出一个窗体。因此,需要添加一个Form窗体。

2) 设计窗体界面

设计窗体界面如下:

导入要素:用于选择处理的要素图层。

最小面积:用于设置合并要素的面积。

3) 编写窗体代码

//获取处理的图层

string strLayerName =thisNaNb_InputFeature.Text;

IFeatureLayerpFeatureLayer = GetFeatureLayer(strLayerName);

IFeatureClasspFeatureClass = pFeatureLayer.FeatureClass;

IQueryFilterpQueryFilter = new QueryFilter();

pQueryFilter.WhereClause= "area<=" + this.txt_MinArea.Text;

IFeatureCursorpFeatureCursor = pFeatureClass.Search(pQueryFilter, false);

IFeature pFeature = pFeatureCursor.NextFeature();

while (pFeature !=null)

{

//面积小于等于设定值的要素

IGeometry pGeometry =pFeature.Shape;

IRelationalOperatorpRelationalOperator = pGeometry as IRelationalOperator;

IQueryFilter pQueryFilter2 = newQueryFilter();

pQueryFilter2.WhereClause ="area>" + this.txt_MinArea.Text;

FeatureCursor pFeatureCursor2 =pFeatureClass.Search(pQueryFilter2, false);

IFeature pFeature2 =pFeatureCursor2.NextFeature();

//是第一个要素

bool IsFirst = true;

//基本要素

IFeature pBaseFeature = null;

while (pFeature2 != null)

{

    //面积大于设定值的要素

    IGeometry pGeometry2 = pFeature2.Shape;

    //判断面积大于设定值的要素是否与面积小于设定值的要素相临

     if(pRelationalOperator.Touches(pGeometry2))

     {

       if (IsFirst)

         {

          pBaseFeature = pFeature2;

          }

        else

       {

           IGeometry pBaseGeometry =pBaseFeature.Shape;

           IGeometry pMaxGeometry = pGeometry2;

           IArea pBaseArea = pBaseGeometry asIArea;

           IArea pMaxArea = pMaxGeometry asIArea;

           if (pBaseArea.Area < pMaxArea.Area)

           {

             pBaseFeature = pFeature2;

            }

          }

        }

          pFeature2 =pFeatureCursor2.NextFeature();

       }

      int index =pBaseFeature.Fields.FindField("area");

       object value = pBaseFeature.get_Value(index);

      MessageBox.Show(value.ToString());

        object missing = Type.Missing;

        IGeometryCollection pGeometryCollection= new GeometryBagClass();

       pGeometryCollection.AddGeometry(pGeometry,ref missing, ref missing);

       pGeometryCollection.AddGeometry(pBaseFeature.Shape, ref missing, refmissing);

        ITopologicalOperator pTopologicalOperatory =new PolygonClass();

pTopologicalOperatory.ConstructUnion(pGeometryCollectionas IEnumGeometry);

IDataset dataset = pFeatureClassas IDataset;

IWorkspaceEdit workspaceEdit =dataset.Workspace as IWorkspaceEdit;

workspaceEdit.EnableUndoRedo();

workspaceEdit.StartEditOperation();

pBaseFeature.Shape =pTopologicalOperatory as IGeometry;

pBaseFeature.Store();

//删除

//DeleteOtherSelectedFeatures(selectedFeatures);

workspaceEdit.StopEditOperation();

 pFeature = pFeatureCursor.NextFeature();

}

  m_MxDocument.ActiveView.Refresh();          

       this.Close();

4) 调试

g)       编译目录

编译完成后,文件如下:

   h)       添加到ArcMap

打开ArcMap,打开扩展管理,选择Commands选项卡,找到Add-in Controls,这时候会发现编写的工具会出现在这一组中。

 

  i)         测试

点击按钮后即可使用该工具。