天天看點

ArcGIS Engine追加功能

最近又研究了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:希望給大家帶來幫助,如果有什麼不明白的,可以留言詢問,我看到了會第一時間回複)

繼續閱讀