arcEngine修改字段标注

2023-12-20 17:05:17

修改字段标注

在arcEngine中,有时候需要修改图层要素的标注值,而且每个字段值对应了要修改的内容,如字段值”1“替换成”A“,字段值”2“替换成”B“等,这就需要在替换的图层中,遍历每个要素,查到每个要素的原有标签值是多少,然后再根据标签值修改。

 private void 标签_Click(object sender, EventArgs e)
        {
           
            IFeatureLayer featureLayer = (IFeatureLayer)this.axMapControl1.Map.get_Layer(0);
            // 获取要修改的标注字段的FeatureClass
            IFeatureClass featureClass = featureLayer.FeatureClass;
            //开始编辑
            IFeatureCursor featureCursor = featureClass.Update(null, false);
            IFeature feature = featureCursor.NextFeature();
            while (feature != null)
            {
                // 获取标注字段的索引
                int fieldIndex = feature.Fields.FindField("EXPNO");
                // 拿到原来标注内容
                 object filename =  feature.get_Value(fieldIndex);
                 string value = MyTable.MyMappings.KeyValuePairs[filename];
                //修改标注
                feature.set_Value(fieldIndex, value);
                featureCursor.UpdateFeature(feature);

                feature = featureCursor.NextFeature();
            }
            // 刷新地图以显示新的标注
            IActiveView activeView = (IActiveView)this.axMapControl1.Map;
            activeView.Refresh();
        }

这里新建一个按钮,点击这个按钮,即可实现标签的替换,可以看到,通过object filename = feature.get_Value(fieldIndex);拿到原来标签的内容后,调用了一个string value = MyTable.MyMappings.KeyValuePairs[filename];拿到新的值,那么这个MyTable.MyMappings.KeyValuePairs是哪来的呢?

实际上,这是在一个新的文件里建立了一个字典,字典里面编辑了原有标签和新标签的对应关系,至于为什么是要新建一个独立的文件,是因为后期好维护,要修改字典的话只需要在这个文件里进行编辑就行,不涉及其它逻辑代码,加上任意问价都可以引入调用。

//引入系统的字典类
using System.Collections.Generic;
//自己新建一个命名空间  MyTable
namespace MyTable
{
    public static class MyMappings
    {
        public static readonly Dictionary<object, string> KeyValuePairs = new Dictionary<object, string>
{
    { "傻猫", "cat" },
    { "狗狗", "dog" },
    { "人类", "person" },
};
    }
}

新建完这个字典类后,在想要引入的地方头部只需要引入系统命名空间似的,引入自己定义的命名空间 using MyTable;就可以在这个地方使用这个字典了。

当然,如果这个字典表非常长,内容很多,且存储在excel中,如何将它编辑成一个字典文件呢?显然手工的方式是很慢的,我们可以通过python自动生成一个.cs文件,这个文件就是我们的这个字典文件,然后在C#中引入就可以,比如:这是一个excel的表,记录了旧标签对应的新标签:

在这里插入图片描述

为了演示,我这里excel只编辑了几条内容,那么如何通过脚本,生成一个.cs文件呢?

可以借助python:

import pandas as pd

# 读取 Excel 文件
excel_path = './file/table.xlsx'  # 替换为你的 Excel 文件路径
df = pd.read_excel(excel_path)

# 生成 C# 字典的字符串
cs_dict_str = 'public static readonly Dictionary<object, string> KeyValuePairs = new Dictionary<object, string>\n{\n'
for _, row in df.iterrows():
    key = row.iloc[0]   # 假设键在第一列
    value = row.iloc[1] # 假设值在第二列
    cs_dict_str += f'    {{ "{key}", "{value}" }},\n'
cs_dict_str += '};'

# 生成完整的 C# 类文件内容
cs_class_content = f'''using System.Collections.Generic;

namespace MyTable
{{
    public static class MyMappings
    {{
        {cs_dict_str}
    }}
}}
'''

# 将生成的内容写入 .cs 文件
with open('MyMappings.cs', 'w', encoding='utf-8') as file:
    file.write(cs_class_content)

执行完这个脚本,就可以生成一个文件:

using System.Collections.Generic;

namespace MyTable
{
    public static class MyMappings
    {
        public static readonly Dictionary<object, string> KeyValuePairs = new Dictionary<object, string>
{
    { "傻猫", "cat" },
    { "狗狗", "dog" },
    { "人类", "person" },
};
    }
}

将这个文件放在arcengine项目里面:

在这里插入图片描述

然后在vs中将这个文件引入:

在这里插入图片描述

然后就可以看到,项目管理器中已经有了这个文件

在这里插入图片描述

那么,在代码开发中,就可以回到最初的步骤,在想要使用的地方的头部,引入这个命名空间,然后在代码中调用MyTable.MyMappings.KeyValuePairs[filename]拿到对应的值

标签

文章来源:https://blog.csdn.net/wenyeqv/article/details/135107259
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。