欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ArcGIS Engine 小结

程序员文章站 2022-07-14 10:00:22
...

好久没有碰过ArcGIS Engine的东西了,最近有些事情需要用到,所以又重新熟悉了一下,不得不说我有一个不好的习惯,那就是不喜欢做总结。以前写了那么多的AE代码和程序,都没有保留下来,真是可惜,现在要用的时候,又得重新熟悉、重新找资料、重新调bug,真是浪费了很多的时间和精力。
好了,废话不多说,现在就AE中的一些情况,做一下简单总结吧。貌似现在AE用的人也少了,大家开始用新的技术了,我们也要与时俱进。

我使用的是VS2012+AE10.2。

1、在安装完AE之后,一般情况下会在VS平台中自动生成一个选项卡,然后自动添加上AE的相关控件。但是我从网上下载的这个AE安装包可能存在问题,安装完成后并没有自动添加,而且还少了很多的*.dll的库。于是我就自己添加了,添加的方法和平常添加别的插件的方法一样,名称就是AE的各种control控件,如下图所示。但是添加过之后,你会发现选项卡中的控件跟盗版似的,连个图标都没有。没有关系,这可能是AE安装导致的问题,不过这些不影响使用,添加到窗体上,效果是一样的。
ArcGIS Engine 小结ArcGIS Engine 小结
2、控件的问题解决了之后,那就是开始编程了,在此之前需要做以下步骤:
(1)在窗体中添加License控件,也就是那个Esri LicenseControl控件,将其拖到窗口上就可以了。
(2)在程序的入口处,添加依据绑定许可的代码,这样程序运行起来就不会报一些权限的错误。如果说你在输入这句话的时候报错,说明你的程序中没有引入ESRI.ArcGIS.Version.dll,我的AE装的有问题,所以找别人要了这个10.2版本的dll,引用进去就可以了。如果你的程序中会使用到ArcGIS的一些扩展功能,你需要在添加的LicenseControl控件的属性中,把这些扩展功能勾选打开,不然在使用时也会报错,如下图所示。

ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);

ArcGIS Engine 小结
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();