在国土空间规划中,用地用海的名称和代码是一一对应的,手动修改用地代码后,还需要相应的修改名称,纯纯的重复工作,因此做了这个工具。

之前用Arcpy做过同样的功能的工具,参看这个:

ArcGisPro脚本工具【4】——国空用地代码名称互转


一、要实现的功能

右键点击地图中的要素图层,点击【用地名称和代码互转】按钮,打开工具框,选择转换前和转换后字段、转换模式,点击运行即可。

运行结果如下图:


二、实现流程

1、创建ProWindow工具框并设置参数框的内容

创建一个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_fieldcb.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;

2、准备2个字典,分别对应2种转换模式

准备1个【代码转名称】的字典:

            Dictionary<string, string> dict = new Dictionary<string, string>(){{ "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<string, string> dict_2 = dict.ToDictionary(x => x.Value, x => x.Key);

根据转换模式来确定要选择的字典:

            Dictionary<string, string> dic_tr = new Dictionary<string, string>();if (combox_model.Text == "代码转名称"){dic_tr = dict;}else if (combox_model.Text == "名称转代码"){dic_tr = dict_2;}

3、根据转换模式,对转换后的字段进行属性映射

            // 获取转换前字段名string fd_key = combox_field_DM.Text;// 获取转换后字段名string fd_value = combox_field_MC.Text;await QueuedTask.Run(() =>{using (Table table = initlayer.GetTable()){// 创建EditOperationEditOperation 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);// 获取keyvar key = row[fd_key];if (dic_tr.ContainsKey(key.ToString())){// 赋值valuerow[fd_value] = dic_tr[key.ToString()];}// 保存【不知道为什么,这个store的保存不起作用】row.Store();context.Invalidate(row);}}}}, table);try{// 执行EditOperationbool 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文件直接安装。

【ArcGIS Pro二次开发】(15):用地用海名称和代码互转相关推荐

  1. 【ArcGIS Pro二次开发】系列学习笔记,持续更新,记得收藏

    一.前言 这个系列是本人的一个学习笔记. 作为一个ArcGIS Pro二次开发的初学者,最困扰的就是无从入手.网上关于ArcGIS Pro二次开发的中文资料极少,官方文档对于我这样的英文苦手又太不友好 ...

  2. 【ArcGIS Pro二次开发】(6):工程(Project)的基本操作

    在ArcGIS Pro中我们对工程的基本操作一般包括打开.新建.保存等.下面演示在二次开发中如何用代码进行以上操作. 新建一个项目,命名为[ProjectManager],添加8个按钮,命名为[Cre ...

  3. 【ArcGIS Pro二次开发】(7):地图(Map)的基本操作

    地图是ArcGIS Pro中的基础起点,也是大多数工程的基础.主要用于显示表示空间数据的图层. 一.地图(Map)的基本操作示例 1.获取当前地图 var map = MapView.Active.M ...

  4. ArcGIS Pro二次开发环境配置及项目创建示例

    一.软件版本 ArcGIS Pro 2.8 Visual Studio 2019 二.组件 ArcGIS Pro 2.8 SDK for .NET: proapp-sdk-templates.vsix ...

  5. 【ArcGIS Pro二次开发】(14):使用字典(Dictionary)创建表格(Table)

    在规划工作中,经常需要输入表格数据,如[用地用海分类表]. 之前的经验是做一个Excel表格,通过导入Excel,转换成数据库表格(Tabel). 但这样有一点不好的地方,Excel表格作为输入数据, ...

  6. 【ArcGIS Pro二次开发】(5):UI管理_自定义控件的位置

    新增的自定义控件一般放在默认的[加载项]选项卡下,但是根据需求,我们可能需要将控件放在新的自定义选项卡下,在自定义选项卡添加系统自带的控件,将自定义的按钮等控件放在右键菜单栏里以方便使用,等等. 下面 ...

  7. 【ArcGIS Pro二次开发】(8):图层(Layer)的基本操作

    在ArcGIS中,图层(Layer)是地理数据的集合.可以在 ArcGIS Pro中将很多不同类型的数据表示为图层. 图层通常包含矢量(要素)或栅格数据. 图层的类型取决于您拥有的数据类型.其基础结构 ...

  8. 【ArcGIS Pro二次开发】(26):数据筛选器

    在使用[OpenItemDialog]打开数据时,其中一个重要的属性[Filter],可用于筛选要打开的数据.示例代码如下: // 打开文件对话框OpenItemDialog dlg = new Op ...

  9. 【ArcGIS Pro二次开发】(17):打开GDB、SHP、CAD等各种数据

    一.打开GDB数据库 // 输入一个数据库路径string gdbPath = @"C:\Users\Administrator\Documents\ArcGIS\Projects\Test ...

最新文章

  1. 《Effective C++》第8章 定制new和delete-读书笔记
  2. “比特币耶稣”:看好比特币现金,比特币大势已去
  3. MongoDB 4.2 正式发布,支持分布式事务!
  4. 一小时学会Ansible自动化运维
  5. 电路基础知识 -- 三态
  6. SCVMM 2012 R2运维管理十三之:将资源添加到VMM库
  7. 20165320 第九周学习总结
  8. ODPS2.0重装上阵,优化提升SQL语言表达能力
  9. python之路 -- 并发编程之进程
  10. 安卓bin固件文件编辑器_摄像头恶意固件制作指南
  11. docker 启动 redis cluster,使用出现CLUSTERDOWN Hash slot not served(redis cluster重新分配slot)
  12. Linux 用户的手边工具:Guide to Linux
  13. QQ连连看外挂源代码
  14. Win10 如何关闭烦人的任务栏广告,驱动人生广告,2345广告
  15. android dlna uri,android DLNA投屏
  16. sys fs的原理和使用
  17. :style动态设置背景图片
  18. 面试心得与总结---BAT、网易、蘑菇街等
  19. 房子要室内设计了,先从讲装修的施工工艺开始!
  20. influxdb基础(五)——数据的备份与恢复(influxd backup/influxd restore)

热门文章

  1. 到底什么是索引???
  2. java -- 解决InputStream不可重复读的问题
  3. UI设计师=美工?不同是人眼里UI设计师~
  4. Android自动伸展动画,Android:展开/折叠动画
  5. 睡眠质量不好怎么改善,这些助眠好物让你失眠快速入睡
  6. 其实,我几乎很少看书!
  7. 实战ATTCK攻击链路--靶场Writeup(三)
  8. 我的世界1.14java原版命令_我的世界1.14.4第一个预览版发布 添加了debugreport命令...
  9. 关于中医把脉的一点想法
  10. ipados 蓝牙 android,iPadOS13.4对于无线或蓝牙鼠标的兼容性… - Apple 社区