ArcGIS Engine 小结
好久没有碰过ArcGIS Engine的东西了,最近有些事情需要用到,所以又重新熟悉了一下,不得不说我有一个不好的习惯,那就是不喜欢做总结。以前写了那么多的AE代码和程序,都没有保留下来,真是可惜,现在要用的时候,又得重新熟悉、重新找资料、重新调bug,真是浪费了很多的时间和精力。
好了,废话不多说,现在就AE中的一些情况,做一下简单总结吧。貌似现在AE用的人也少了,大家开始用新的技术了,我们也要与时俱进。
我使用的是VS2012+AE10.2。
1、在安装完AE之后,一般情况下会在VS平台中自动生成一个选项卡,然后自动添加上AE的相关控件。但是我从网上下载的这个AE安装包可能存在问题,安装完成后并没有自动添加,而且还少了很多的*.dll的库。于是我就自己添加了,添加的方法和平常添加别的插件的方法一样,名称就是AE的各种control控件,如下图所示。但是添加过之后,你会发现选项卡中的控件跟盗版似的,连个图标都没有。没有关系,这可能是AE安装导致的问题,不过这些不影响使用,添加到窗体上,效果是一样的。
2、控件的问题解决了之后,那就是开始编程了,在此之前需要做以下步骤:
(1)在窗体中添加License控件,也就是那个Esri LicenseControl控件,将其拖到窗口上就可以了。
(2)在程序的入口处,添加依据绑定许可的代码,这样程序运行起来就不会报一些权限的错误。如果说你在输入这句话的时候报错,说明你的程序中没有引入ESRI.ArcGIS.Version.dll,我的AE装的有问题,所以找别人要了这个10.2版本的dll,引用进去就可以了。如果你的程序中会使用到ArcGIS的一些扩展功能,你需要在添加的LicenseControl控件的属性中,把这些扩展功能勾选打开,不然在使用时也会报错,如下图所示。
ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);
3、接下来就是一些常用的代码了,这些都可以从网上找到,或者通过查看AE的API,不过这里做了一下简单的总结,节省大家的时间。包括常用的FeatureClass的获取;属性字段的添加和赋值;面积的计算;GP工具的调用;IDL代码的集成。
(1)根据路径获取FeatureClass
string filePath = System.IO.Path.GetDirectoryName(fileFullName);
string fileName = System.IO.Path.GetFileName(fileFullName);
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
IFeatureWorkspace pFeaWorkspace = pWorkspaceFactory.OpenFromFile(filePath, 0) as IFeatureWorkspace;
IFeatureClass pFeatureClass = pFeaWorkspace.OpenFeatureClass(fileName);
(2)属性字段的添加和赋值
string filePath = System.IO.Path.GetDirectoryName(fileFullName);
string fileName = System.IO.Path.GetFileName(fileFullName);
IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactory();
IFeatureWorkspace pFeaWorkspace = pWorkspaceFactory.OpenFromFile(filePath, 0) as IFeatureWorkspace;
IFeatureClass pFeatureClass = pFeaWorkspace.OpenFeatureClass(fileName);
IFieldsEdit fldsE = pFeatureClass.Fields as IFieldsEdit;
IField fld = new FieldClass();
IFieldEdit2 fldE = fld as IFieldEdit2;
fldE.Type_2 = esriFieldType.esriFieldTypeString;
fldE.Length_2 = 30;
fldE.Name_2 = "fildname";
pFeatureClass.AddField(fld);
(3)面积的计算
IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);
IFeature pFeature = pFeatureCursor.NextFeature();
IDataset dataset = (IDataset)pFeatureClass;
IWorkspace workspace = dataset.Workspace;
IWorkspaceEdit workspaceEdit = (IWorkspaceEdit)workspace;
workspaceEdit.StartEditing(true);
workspaceEdit.StartEditOperation();
while (pFeature != null)
{
if (pFeature.Shape.GeometryType == esriGeometryType.esriGeometryPolygon)
{
IArea pArea = pFeature.Shape as IArea;
IFields pFields = pFeature.Fields;
IClass pClass = pFeatureClass as IClass;
int fieldIndex = pFields.FindField("fildname");
string area = pArea.Area.ToString();
pFeature.set_Value(fieldIndex, area);
//这句话很重要,如果不添加的话,字段的数据保存不了。
pFeature.Store();
}
pFeature = pFeatureCursor.NextFeature();
}
workspaceEdit.StopEditOperation();
workspaceEdit.StopEditing(true);
(4)GP工具的调用
//注意,这里引用的Geoprocessor,别引用错了
using ESRI.ArcGIS.Geoprocessor;
Geoprocessor GP = new Geoprocessor();
//将数据融合,减少小斑块
ESRI.ArcGIS.DataManagementTools.Dissolve Dissolve = new ESRI.ArcGIS.DataManagementTools.Dissolve();
Dissolve.in_features = BeforeImageClassResShp;
Dissolve.dissolve_field = "Class_Name";
Dissolve.out_feature_class = BeforeImageClassResShpDissolove;
GP.OverwriteOutput = true;
GP.Execute(Dissolve, null);
(5)IDL代码的集成
//首先在程序中,引用ENVI IDL的COM_IDL_connectLib.dll。
//这个dll必须是在系统中注册成功过的,注册方法是以管理员身份运行cmd-->regsvr32 D:\..\COM_IDL_connectLib.dll
//代码中有两个ExecuteString,第一个是编译pro文件,第二个是运行刚才编译过的文件名,这里是带参数的pro文件,文件名为classimage.pro。
string enviProgramFile = Application.StartupPath + @"\classimage.pro";
COM_IDL_connectLib.COM_IDL_connect oComIDL = new COM_IDL_connect();
oComIDL.CreateObject(0, 0, 0);
oComIDL.ExecuteString(@".compile '" + enviProgramFile + "'");
oComIDL.ExecuteString("classimage,'" + BeforeImage + "','" + BeforeROI + "','" + BeforeImageClassRes + "'");
oComIDL.DestroyObject();
上一篇: MATLAB绘图之plot3
下一篇: ArcGIS Engine 空间查询