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完成设置
-
d) 文件组织
-
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) 测试
点击按钮后即可使用该工具。