在国土空间规划中,用地用海的名称和代码是一一对应的,手动修改用地代码后,还需要相应的修改名称,纯纯的重复工作,因此做了这个工具。
之前用Arcpy做过同样的功能的工具,参看这个:
ArcGisPro脚本工具【4】——国空用地代码名称互转
右键点击地图中的要素图层,点击【用地名称和代码互转】按钮,打开工具框,选择转换前和转换后字段、转换模式,点击运行即可。
运行结果如下图:
创建一个ProWindow工具框,这部分不细说了,参看之前的文章:
【ArcGIS Pro二次开发】(13):ProWindow的用法
将当前选择的要素图层加入参数框:
// 获取当前选择的要素图层
FeatureLayer initlayer = MapView.Active.GetSelectedLayers().FirstOrDefault() as FeatureLayer;
// combox_fc框中添加当前选择的要素图层
combox_fc.Items.Add(initlayer);
combox_fc.SelectedIndex = 0;
将当前选择要素图层的所有字段添加到combox中
// 清空combox_field
cb.Items.Clear();
await QueuedTask.Run(async () =>
{
// 获取所选图层的所有字段
var fields = initlayer.GetFieldDescriptions();
foreach (var field in fields)
{
await QueuedTask.Run(() =>
{
// 在UI线程上执行添加item的操作
Application.Current.Dispatcher.Invoke(() =>
{
// 将所有字段名添加到combox_field中
cb.Items.Add(field.Name);
});
});
}
});
转换模式框里加入2种转换模式,并将其中1种设为默认:
// combox_model框中添加2种转换模式,默认【代码转名称】
combox_model.Items.Add("代码转名称");
combox_model.Items.Add("名称转代码");
combox_model.SelectedIndex = 0;
准备1个【代码转名称】的字典:
Dictionary dict = new Dictionary()
{
{ "01", "耕地"},{ "0101", "水田"},{ "0102", "水浇地"},{ "0103", "旱地"},{ "02", "园地"},{ "0201", "果园"},{ "0202", "茶园"},{ "0203", "橡胶园"},{ "0204", "其他园地"},{ "03", "林地"},{ "0301", "乔木林地"},{ "0302", "竹林地"},{ "0303", "灌木林地"},{ "0304", "其他林地"},{ "04", "草地"},{ "0401", "天然牧草地"},{ "0402", "人工牧草地"},{ "0403", "其他草地"},{ "05", "湿地"},{ "0501", "森林沼泽"},{ "0502", "灌丛沼泽"},{ "0503", "沼泽草地"},{ "0504", "其他沼泽地"},{ "0505", "沿海滩涂"},{ "0506", "内陆滩涂"},{ "0507", "红树林地"},{ "06", "农业设施建设用地"},{ "0601", "乡村道路用地"},{ "060101", "村道用地"},{ "060102", "村庄内部道路用地"},{ "0602", "种植设施建设用地"},{ "0603", "畜禽养殖设施建设用地"},{ "0604", "水产养殖设施建设用地"},{ "07", "居住用地"},{ "0701", "城镇住宅用地"},{ "070101", "一类城镇住宅用地"},{ "070102", "二类城镇住宅用地"},{ "070103", "三类城镇住宅用地"},{ "0702", "城镇社区服务设施用地"},{ "0703", "农村宅基地"},{ "070301", "一类农村宅基地"},{ "070302", "二类农村宅基地"},{ "0704", "农村社区服务设施用地"},{ "08", "公共管理与公共服务用地"},{ "0801", "机关团体用地"},{ "0802", "科研用地"},{ "0803", "文化用地"},{ "080301", "图书与展览用地"},{ "080302", "文化活动用地"},{ "0804", "教育用地"},{ "080401", "高等教育用地"},{ "080402", "中等职业教育用地"},{ "080403", "中小学用地"},{ "080404", "幼儿园用地"},{ "080405", "其他教育用地"},{ "0805", "体育用地"},{ "080501", "体育场馆用地"},{ "080502", "体育训练用地"},{ "0806", "医疗卫生用地"},{ "080601", "医院用地"},{ "080602", "基层医疗卫生设施用地"},{ "080603", "公共卫生用地"},{ "0807", "社会福利用地"},{ "080701", "老年人社会福利用地"},{ "080702", "儿童社会福利用地"},{ "080703", "残疾人社会福利用地"},{ "080704", "其他社会福利用地"},{ "09", "商业服务业用地"},{ "0901", "商业用地"},{ "090101", "零售商业用地"},{ "090102", "批发市场用地"},{ "090103", "餐饮用地"},{ "090104", "旅馆用地"},{ "090105", "公用设施营业网点用地"},{ "0902", "商务金融用地"},{ "0903", "娱乐康体用地"},{ "090301", "娱乐用地"},{ "090302", "康体用地"},{ "0904", "其他商业服务业用地"},{ "10", "工矿用地"},{ "1001", "工业用地"},{ "100101", "一类工业用地"},{ "100102", "二类工业用地"},{ "100103", "三类工业用地"},{ "1002", "采矿用地"},{ "1003", "盐田"},{ "11", "仓储用地"},{ "1101", "物流仓储用地"},{ "110101", "一类物流仓储用地"},{ "110102", "二类物流仓储用地"},{ "110103", "三类物流仓储用地"},{ "1102", "储备库用地"},{ "12", "交通运输用地"},{ "1201", "铁路用地"},{ "1202", "公路用地"},{ "1203", "机场用地"},{ "1204", "港口码头用地"},{ "1205", "管道运输用地"},{ "1206", "城市轨道交通用地"},{ "1207", "城镇道路用地"},{ "1208", "交通场站用地"},{ "120801", "对外交通场站用地"},{ "120802", "公共交通场站用地"},{ "120803", "社会停车场用地"},{ "1209", "其他交通设施用地"},{ "13", "公用设施用地"},{ "1301", "供水用地"},{ "1302", "排水用地"},{ "1303", "供电用地"},{ "1304", "供燃气用地"},{ "1305", "供热用地"},{ "1306", "通信用地"},{ "1307", "邮政用地"},{ "1308", "广播电视设施用地"},{ "1309", "环卫用地"},{ "1310", "消防用地"},{ "1311", "干渠"},{ "1312", "水工设施用地"},{ "1313", "其他公用设施用地"},{ "14", "绿地与开敞空间用地"},{ "1401", "公园绿地"},{ "1402", "防护绿地"},{ "1403", "广场用地"},{ "15", "特殊用地"},{ "1501", "军事设施用地"},{ "1502", "使领馆用地"},{ "1503", "宗教用地"},{ "1504", "文物古迹用地"},{ "1505", "监教场所用地"},{ "1506", "殡葬用地"},{ "1507", "其他特殊用地"},{ "16", "留白用地"},{ "17", "陆地水域"},{ "1701", "河流水面"},{ "1702", "湖泊水面"},{ "1703", "水库水面"},{ "1704", "坑塘水面"},{ "1705", "沟渠"},{ "1706", "冰川及常年积雪"},{ "18", "渔业用海"},{ "1801", "渔业基础设施用海"},{ "1802", "增养殖用海"},{ "1803", "捕捞海域"},{ "19", "工矿通信用海"},{ "1901", "工业用海"},{ "1902", "盐田用海"},{ "1903", "固体矿产用海"},{ "1904", "油气用海"},{ "1905", "可再生能源用海"},{ "1906", "海底电缆管道用海"},{ "20", "交通运输用海"},{ "2001", "港口用海"},{ "2002", "航运用海"},{ "2003", "路桥隧道用海"},{ "21", "游憩用海"},{ "2101", "风景旅游用海"},{ "2102", "体休闲娱乐用海"},{ "22", "特殊用海"},{ "2201", "军事用海"},{ "2202", "其他特殊用海"},{ "23", "其他土地"},{ "2301", "空闲地"},{ "2302", "田坎"},{ "2303", "田间道"},{ "2304", "盐碱地"},{ "2305", "沙地"},{ "2306", "裸土地"},{ "2307", "裸岩石砾地"},{ "24", "其他海域"}
};
通过倒置字典的key和value,获取【名称转代码】的字典:
Dictionary dict_2 = dict.ToDictionary(x => x.Value, x => x.Key);
根据转换模式来确定要选择的字典:
Dictionary dic_tr = new Dictionary();
if (combox_model.Text == "代码转名称")
{
dic_tr = dict;
}
else if (combox_model.Text == "名称转代码")
{
dic_tr = dict_2;
}
// 获取转换前字段名
string fd_key = combox_field_DM.Text;
// 获取转换后字段名
string fd_value = combox_field_MC.Text;
await QueuedTask.Run(() =>
{
using (Table table = initlayer.GetTable())
{
// 创建EditOperation
EditOperation editOperation = new EditOperation();
editOperation.Callback(context =>
{
using (RowCursor rowCursor = table.Search(null, false))
{
TableDefinition tableDefinition = table.GetDefinition();
while (rowCursor.MoveNext())
{
using (Row row = rowCursor.Current)
{
context.Invalidate(row);
// 获取key
var key = row[fd_key];
if (dic_tr.ContainsKey(key.ToString()))
{
// 赋值value
row[fd_value] = dic_tr[key.ToString()];
}
// 保存【不知道为什么,这个store的保存不起作用】
row.Store();
context.Invalidate(row);
}
}
}
}, table);
try
{
// 执行EditOperation
bool modificationResult = editOperation.Execute();
if (!modificationResult) message = editOperation.ErrorMessage;
}
catch (GeodatabaseException exObj)
{
message = exObj.Message;
}
}
});
if (!string.IsNullOrEmpty(message))
MessageBox.Show(message);
// 保存编辑【在工程层面保存编辑】
await Project.Current.SaveEditsAsync();
// 关闭窗口
this.Close();
// 提示框:结束
MessageBox.Show("转换结束!");
在上面的代码中,通过rowCursor.MoveNext()对表进行逐行执行,如果key值在字典中,就进行一对一的属性映射,再逐行保存【row.Store()】。
这里出现了一个问题,row.Store()的保存似乎并没有生效,运行后,表里的内容虽然改了,但还是处于未保存的状态,所以我在最后加了Project.Current.SaveEditsAsync(),在工程层面进行了编辑的保存。有大神知道是什么原因的话,希望能请教一下。
功能执行完毕后,关闭窗口,并弹出提示框。
以上就是核心代码,部分内容没细说,可以参看我之前的系列文章。工程文件也放出了,可以直接查看。
最后,放上工程文件的链接:
YDYHtrangerhttps://pan.baidu.com/s/1epVWK1BroG04wOPbszAEdA?pwd=2y0d
PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。