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();

注意:
(1)如果需要C#和IDL集成,也就是說在調用IDL的dll的時候,如果這個COM_idl_connect.dll註冊失敗的話,那麼就需要以管理員的身份去運行CMD程序,然後再使用regsvr32 COM_idl_connect.dll。但是當你用向日葵等遠程軟件的時候,是不能夠獲取到管理員權限的,即使你在遠程的電腦上使用管理員的身份打開CMD窗口,也是不會註冊成功的,必須關閉遠程軟件,讓被控制的電腦自己以管理員的身份去註冊。
(2)
在使用C#調用IDL時,IDL的代碼在前面必須加上這幾句話,不然運行不了。COMPILE_OPT idl2
ENVI,/RESTORE_BASE_SAVE_FILES
ENVI_BATCH_INIT

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章