最近又研究了ArcGIS中的一個追加功能,如果你的ArcMap是中文版的話,可以通過“toolbox—>資料管理工具—>正常—>追加”這幾步找到他,如果你是英文,那…那你就去翻譯一下吧(ps:圖有點長就沒截)!
這個功能邏輯倒是不複雜,困難的地方主要是參數的設定,尤其是字段映射那一塊,我靠着反複的在ArcMap中嘗試與對接口的了解(其實是瞎蒙),竟然解決了映射問題!
這其中主要使用的接口有IGPFieldMapping、IDETable、IGPFieldMap;其中IGPFieldMapping、IGPFieldMap這兩個接口比較重要,而且比較神奇;既然是字段映射,是以字段之間必須有一個對應關系,IGPFieldMapping有一個對應的CoClass共有類GPFieldMappingClass,可以直接new出來,但是這個接口必須進行初始化操作,還是來看代碼吧,實在不好解釋!
IGPFieldMapping fieldmapping = new GPFieldMappingClass();
IGPUtilities gputilities = new GPUtilitiesClass();
string path="";
if (((IDataset)this.mInpusFeatureclass).Workspace.Type == esriWorkspaceType.esriLocalDatabaseWorkspace)
{
path = this.strShapePath + "\\" + ((IDataset)this.mInpusFeatureclass).Name;
}
else if (((IDataset)this.mInpusFeatureclass).Workspace.Type == esriWorkspaceType.esriFileSystemWorkspace)
{
path = this.strShapePath + "\\" + ((IDataset)this.mInpusFeatureclass).Name;
}
else if (((IDataset)this.mInpusFeatureclass).Workspace.Type == esriWorkspaceType.esriRemoteDatabaseWorkspace)
{
path = this.strShapePath;
}
IDETable inputTableA = (IDETable)gputilities.MakeDataElement(path, null, null);
IArray inputtables = new ArrayClass();
inputtables.Add(inputTableA);
fieldmapping.Initialize(inputtables, null);
這裡的mInpusFeatureclass是我們用來映射的資料源要素類,得到映射字段,還有一個mTargetFeatureclass是被映射要素類。
這裡的代碼我們需要注意的是不同的資料源的路徑不相同,不過最小都需要定位到具體的FeatureClass,這裡的fieldmapping初始化過後就會自動的剔除一些不能被映射的字段,如OBJECTID與SHAPE字段等(但是我不懂為什麼shape.len與shape.area竟然沒有被排除),之後我們需要進一步處理這個字段映射對象,将我們設定的映射字段加入進去,
this.mTargetGPFieldMapping.RemoveAll();//首先需要清除裡面的字段映射
foreach (var item in pFieldMappingDic.Keys)//這個字典裡面存儲了自定義的映射字段
{
if (pFieldMappingDic[item.ToString()] == "<無>")
continue;//可以不設定字段映射
IGPFieldMap trackid = new GPFieldMapClass();
trackid.OutputField = GetFieldByName(this.mTargetFeatureclass, item.ToString());
trackid.MergeRule = esriGPFieldMapMergeRule.esriGPFieldMapMergeRuleLast;
int fieldmap_index = this.mInputGPFieldMapping.FindFieldMap(pFieldMappingDic[item.ToString()]);
IGPFieldMap stfid_fieldmap = this.mInputGPFieldMapping.GetFieldMap(fieldmap_index);
int field_index = stfid_fieldmap.FindInputField(this.mInputDETable, pFieldMappingDic[item.ToString()]);
IField inputField = stfid_fieldmap.GetField(field_index);
trackid.AddInputField(this.mInputDETable, inputField, -, -);
this.mTargetGPFieldMapping.AddFieldMap(trackid);//将IGPFieldMap添加到IGPFieldMapping中去,是以後者相當于前者的集合
}
最後使用GP工具中的Append工具執行操作!
總結
這個功能總體來說并不困難,困難的是ESRI的幫助文檔基本沒說啥有用的,基本靠自己連蒙帶猜将接口裡面的方法怎麼用給猜測出來,不過做出來還是有點成就感的!(ps:希望給大家帶來幫助,如果有什麼不明白的,可以留言詢問,我看到了會第一時間回複)