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, -1, -1);
          this.mTargetGPFieldMapping.AddFieldMap(trackid);//将IGPFieldMap添加到IGPFieldMapping中去,所以后者相当于前者的集合
      }

最后使用GP工具中的Append工具执行操作!


总结
这个功能总体来说并不困难,困难的是ESRI的帮助文档基本没说啥有用的,基本靠自己连蒙带猜将接口里面的方法怎么用给猜测出来,不过做出来还是有点成就感的!(ps:希望给大家带来帮助,如果有什么不明白的,可以留言询问,我看到了会第一时间回复)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值