【ArcGIS Pro二次开发】(63):批量更改字段别名

在我工作中遇到的大多数图斑,字段名称一般是英文,字段别名是中文,使用起来是比较方便的。

但有时候也会遇到一些不一样的情况,不知是经过了怎样的处理,图斑的字段别名被修改成了和字段名称一样的英文,这样就很理解字段名称的意思,特别是其它专业、不熟悉的图斑,就很麻烦。

这个工具目的就是要将字段别名恢复成中文。

当然也不可能凭空恢复,需要准备一个字段名称和字段别名的对照表。

所以这一般适用于一些规定格式的图斑,有规范明确规定字段名称和字段别名,对照表可以从规范里直接扒下来。


一、要实现的功能

如上图所示,在【字段处理】组---【字段综合】面板下,点击【更新字段别名(属性映射)】工具。

在弹出的工具框中,分别输入参数:

1、输入要修改字段别名的要素图层和独立表。

2、输入准备好的对照表,如下图所示:

生成结果如下:


二、实现流程

实现功能只需要3步。

第一步从Excel表中获取对照表,存成字典即可。

cs 复制代码
// 从Excel文件中获取Dictionary
public static Dictionary<string, string> GetDictFromExcel(string excelPath, int col1 = 1, int col2 = 2)
{
    // 建立 Excel 应用程序对象
    Application excelApp = new Application();
    // 获取Excel文件名和表名
    List<string> files = DecomposeExcel(excelPath);
    string excel_name = files[0];
    string sheet_name = files[1];
    // 定义字典
    Dictionary<string, string> dict = new Dictionary<string, string>();
    // 打开 Excel 文件
    Workbook workbook = excelApp.Workbooks.Open(excel_name);
    // 获取工作表
    Worksheet worksheet = workbook.Worksheets[sheet_name];
    // 获取Excel表格中的数据
    for (int row = 1; row <= worksheet.UsedRange.Rows.Count; row++)
    {
        var key_va = worksheet.Cells[row, col1].Value;
        var value_va = worksheet.Cells[row, col2].Value;

        if (key_va is null || value_va is null)
        {
            continue;
        }
        string key = key_va.ToString();
        string value = value_va.ToString();

        // 如果是新值,则纳入dict
        if (!dict.ContainsKey(key))
        {
            dict.Add(key, value);
        }
    }
    //  保存并关闭 Excel 文件和应用程序对象
    workbook.Close(true);
    excelApp.Quit();
    // 返回dict
    return dict;
}

第二步获取要素图层或表中的所有字段。

cs 复制代码
// 从图层获取字段FieldDescription列表
public static List<FieldDescription> GetFieldsFromLayer(string fcPath)
{
    List<FieldDescription> fields = new List<FieldDescription>();

    // 根据图层名找到当前图层
    var map = MapView.Active.Map;
    var init_featurelayer = map.FindLayers(fcPath);
    var init_table = map.FindStandaloneTables(fcPath);

    // 判断当前选择的是要素图层还是独立表
    if (init_table.Count > 0)
    {
        // 是独立表的情况
        StandaloneTable init_layer = map.FindStandaloneTables(fcPath)[0];
        fields = init_layer.GetFieldDescriptions();
    }
    else if (init_featurelayer.Count > 0)
    {
        // 是要素图层的情况
        FeatureLayer init_layer = map.FindLayers(fcPath)[0] as FeatureLayer;
        fields = init_layer.GetFieldDescriptions();
    }
    return fields;
}

第三步按照对照表,对字段别名一一修改即可。

cs 复制代码
// 更改字段别名
foreach (var field in fields)
{
    string fieldName = field.Name;
    if (dic.ContainsKey(fieldName))
    {
        pw.AddProcessMessage(2, time_base, @$"更改字段别名:{fieldName}");
        // 更改字段
        Arcpy.AlterField(input_fc, fieldName, fieldName, dic[fieldName]);
    }
}

以上便实现了工具的主要功能。


三、工具文件分享

我把工具都集合成工具箱,不再单独放单个工具,可以到这里下载完整工具箱,会不断更新:

【ArcGIS Pro二次开发】:CC工具箱https://blog.csdn.net/xcc34452366/article/details/131506345PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。

相关推荐
神仙别闹1 小时前
基于C#和Sql Server 2008实现的(WinForm)订单生成系统
开发语言·c#
向宇it10 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
九鼎科技-Leo11 小时前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
Heaphaestus,RC12 小时前
【Unity3D】获取 GameObject 的完整层级结构
unity·c#
baivfhpwxf202312 小时前
C# 5000 转16进制 字节(激光器串口通讯生成指定格式命令)
开发语言·c#
直裾12 小时前
Scala全文单词统计
开发语言·c#·scala
GIS思维12 小时前
ArcGIS定义投影与投影的区别(数据和底图不套合的原因和解决办法)
arcgis·gis·地理信息·arcgis坐标系·动态投影
ZwaterZ14 小时前
vue el-table表格点击某行触发事件&&操作栏点击和row-click冲突问题
前端·vue.js·elementui·c#·vue
阮少年、15 小时前
ArcGIS Pro的arpx项目在ArcGIS Server中发布要素服务(FeatureServer)
arcgis·arcgis server·gis服务发布·要素服务
ZwaterZ16 小时前
el-table-column自动生成序号&&在序号前插入图标
前端·javascript·c#·vue