您的位置:首页 > 其它

ArcGIS Engine追加功能

2015-10-30 16:24 246 查看
最近又研究了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:希望给大家带来帮助,如果有什么不明白的,可以留言询问,我看到了会第一时间回复)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: