天天看点

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:希望给大家带来帮助,如果有什么不明白的,可以留言询问,我看到了会第一时间回复)

继续阅读