ArcGIS Engine追加功能
2015-10-30 16:24
246 查看
最近又研究了ArcGIS中的一个追加功能,如果你的ArcMap是中文版的话,可以通过“toolbox—>数据管理工具—>常规—>追加”这几步找到他,如果你是英文,那…那你就去翻译一下吧(ps:图有点长就没截)!
这个功能逻辑倒是不复杂,困难的地方主要是参数的设置,尤其是字段映射那一块,我靠着反复的在ArcMap中尝试与对接口的了解(其实是瞎蒙),竟然解决了映射问题!
这其中主要使用的接口有IGPFieldMapping、IDETable、IGPFieldMap;其中IGPFieldMapping、IGPFieldMap这两个接口比较重要,而且比较神奇;既然是字段映射,所以字段之间必须有一个对应关系,IGPFieldMapping有一个对应的CoClass共有类GPFieldMappingClass,可以直接new出来,但是这个接口必须进行初始化操作,还是来看代码吧,实在不好解释!
这里的mInpusFeatureclass是我们用来映射的数据源要素类,得到映射字段,还有一个mTargetFeatureclass是被映射要素类。
这里的代码我们需要注意的是不同的数据源的路径不相同,不过最小都需要定位到具体的FeatureClass,这里的fieldmapping初始化过后就会自动的剔除一些不能被映射的字段,如OBJECTID与SHAPE字段等(但是我不懂为什么shape.len与shape.area竟然没有被排除),之后我们需要进一步处理这个字段映射对象,将我们设置的映射字段加入进去,
最后使用GP工具中的Append工具执行操作!
总结
这个功能总体来说并不困难,困难的是ESRI的帮助文档基本没说啥有用的,基本靠自己连蒙带猜将接口里面的方法怎么用给猜测出来,不过做出来还是有点成就感的!(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:希望给大家带来帮助,如果有什么不明白的,可以留言询问,我看到了会第一时间回复)
相关文章推荐
- http://www.shippingcity.com/
- shell 脚本完成对日志文件的提取之grep 学习
- 浏览器兼容性问题
- java serializable深入了解
- OpenGL学习笔记——纹理贴图
- 在 sql查询中如何将两个字段显示在一个字段
- java this
- RPC框架取得专利
- Django运行方式及处理流程总结
- Java的clone方法 prototype
- LINUX 常用命令
- MongoDB 3.0 导入命令
- [转]ORACLE 中ROWNUM用法总结!
- V$SGA_RESIZE_OPS.STATUS = ERROR, and MMAN / auto-tuning stops.
- LeetCode 191: Number of 1 Bits
- 提升JavaScript递归效率:Memoization技术详解
- LeetCode(122) Best Time to Buy and Sell Stock II
- 如何快速把多个excel表合并成一个excel表
- Python按行读文件
- Android 开发实用方法大全