通常用于在地理处理(Geoprocessing, GP)工具中执行字段映射(field mapping)的操作。这些工具可能包括 Spatial Join(空间连接)和 FeatureClassToFeatureClass(导出)等,其中 field_mapping 参数常常用于指定字段的映射关系。
IGPFieldMapping 允许你控制哪些字段从输入数据集映射到输出数据集,以及它们如何映射。这对于需要选择性地导出或转换字段的复杂地理处理任务来说是非常有用的。
一、基本使用
IArray array = new ArrayClass();
//这里类型转换是因为后续需要该类型的参数
IGPUtilities3 GPUtil = new GPUtilitiesClass();
IDETable table1 = (IDETable).GPUtil.MakeDataElement(@"C:\Users\baci\Documents\ArcGIS\Default.gdb\Export_Output", null, null);
array.Add(table1);
IGPFieldMapping gPFieldMapping = new GPFieldMappingClass();
//初始化所有的字段映射
//假设table1有10个字段,这里就会有8字段的映射(没有OBJECTID、Shape字段)
gPFieldMapping.Initialize(array, null);
//todo 新增字段映射、修改字段映射、删除字段映射
FeatureClassToFeatureClass featureClassToFeatureClass = null;
featureClassToFeatureClass.field_mapping = gPFieldMapping ;
//todo 执行gp工具
1. 新增字段映射
//新增字段映射
{
IGPFieldMap gpFieldMap = new GPFieldMapClass();
IFieldEdit outputField = null;
IField inputField = null;
outputField = new FieldClass();
outputField.Name_2 = "SJXZQDM";
outputField.Type_2 = esriFieldType.esriFieldTypeString;
outputField.Length_2 = 50;
//找到对应的字段映射
var fieldmap_index = gPFieldMapping.FindFieldMap("XZQDM");
IGPFieldMap gPFieldMap1 = gPFieldMapping.GetFieldMap(fieldmap_index);
//找到具体表的字段
//这里由于只有1个表这里会是0,相当于array里的索引
var fieldIndex = gPFieldMap1.FindInputField(table1, "XZQDM");
//也可以从table1中直接获取
inputField = gPFieldMap1.GetField(fieldIndex);
//设置output字段
trackid.OutputField = outputField;
//设置输入字段
//后面两个参数表示截取的部分
//ps: 原值:abcdefgh => 新值: cdefg
trackid.AddInputField(table1, inputField, 2, 6);
//添加
gPFieldMapping.AddFieldMap(trackid);
}
2. 修改字段映射
//新增字段映射
{
IFieldEdit outputField = null;
outputField = new FieldClass();
outputField.Name_2 = "SJXZQDM";
outputField.Type_2 = esriFieldType.esriFieldTypeString;
outputField.Length_2 = 50;
//找到对应的字段映射
var fieldmap_index = gPFieldMapping.FindFieldMap("XZQDM");
IGPFieldMap gPFieldMap1 = gPFieldMapping.GetFieldMap(fieldmap_index);
//修改output字段
gPFieldMap1.OutputField = outputField;
gPFieldMap1.SetTextPos(0, 0, outputField.Length);//0值与FindInputField()的返回值同义,表示具体表的索引
gPFieldMap1.MergeRule = esriGPFieldMapMergeRule.esriGPFieldMapMergeRuleCount;
gPFieldMap1.JoinDelimiter = "-";//esriGPFieldMapMergeRule.esriGPFieldMapMergeRuleJoin时生效
//替换
gPFieldMapping.ReplaceFieldMap(fieldmap_index, gPFieldMap1);
}
3. 删除字段映射
//删除全部
gPFieldMapping.RemoveAll();
//删除指定字段映射
var fieldmap_index = gPFieldMapping.FindFieldMap("XZQDM");
gPFieldMapping.RemoveFieldMap(fieldmap_index);
二、场景示例
1. 导出数据,修改字段为可空
for (int i = 0; i < gPFieldMapping.Count; i++)
{
var fieldMap = gPFieldMapping.GetFieldMap(i);
var outputField = fieldMap.OutputField as IFieldEdit;
outputField.IsNullable_2 = true;
fieldMap.OutputField = outputField;//必须重新赋值
gPFieldMapping.ReplaceFieldMap(i, fieldMap);
}