在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]
拿到对应的值
标签