好久沒有碰過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