【ArcGIS Engine】IGPFieldMapping 字段映射

通常用于在地理处理(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);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值