【ArcGIS Pro二次开发】(14):使用字典(Dictionary)创建表格(Table)
创始人
2025-05-31 10:25:21
0

在规划工作中,经常需要输入表格数据,如【用地用海分类表】。

之前的经验是做一个Excel表格,通过导入Excel,转换成数据库表格(Tabel)。

但这样有一点不好的地方,Excel表格作为输入数据,在制作成插件或工具之后,必须一起使用,容易发生丢失或路径变化等问题。

于是这有了这个想法,把表格内容以Dictionary形式内置,再通过Dictionary转化成Table。


一、要实现的功能

如上图所示,点击【创建表格】创建一个空表格,再点击【添加新行】插入用地用海的代码和名称。其实2步可以合成1步,这样做只是为了更好的演示。


二、实现流程

1、创建空表格

创建空表格的代码我直接抄的官方文档,看着步骤多,但是运行起来是很快的。基本都是固定套路,直接上代码。(官方代码的质量比百度来的稳定得多)

            // 获取默认数据库var gdb = Project.Current.DefaultGeodatabasePath;// 异步执行,创建Tableawait QueuedTask.Run(() =>{// 创建GeodatabaseGeodatabase geodatabase = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(gdb)));// 创建字段列表List fieldDescriptions = new List(){new FieldDescription("用地代码", FieldType.String),new FieldDescription("用地名称", FieldType.String),};// 创建TableDescription对象TableDescription tableDescription = new TableDescription("用地用海表", fieldDescriptions);// 创建SchemaBuilder对象SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);// 将表格的创建添加到DDL任务列表中schemaBuilder.Create(tableDescription);// 执行DDLschemaBuilder.Build();});

脚本开头要添加一行using,如下:

using ArcGIS.Core.Data.DDL;

2、将字典键值添加到空表格中

首先,准备一个字典。可以手工输入,因为我已经有Excel表格,转换了一下打印出来就可以了。

            // 【代码转名称】映射表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", "其他海域"}};

创建编辑器,打开刚创建好的空表格,按字典dict的键值给表赋值,再更新保存,代码如下:

            // 打开编辑EditOperation editOperation = new EditOperation();await QueuedTask.Run(() =>{using (Geodatabase geodatabase = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(gdb))))using (Table table = geodatabase.OpenDataset("用地用海表")){editOperation.Callback(context =>{TableDefinition tableDefinition = table.GetDefinition();// 按字典dict的键值给表赋值foreach (string key in dict.Keys){using (RowBuffer rowBuffer = table.CreateRowBuffer()){string value = dict[key];// 赋值rowBuffer["用地代码"] = key;rowBuffer["用地名称"] = value;using (Row row = table.CreateRow(rowBuffer)){// 更新context.Invalidate(row);}}}}, table);try{// 执行editOperation.Execute();}

以上就是核心代码部分,完整代码请查看文章末尾放出的工程文件。

PS:和python相比,c#的代码真是又臭又长,上面这些功能,python要实现的话,代码量一半都不要。不过速度上感觉确实比python快。


三、工程文件分享

 最后,放上工程文件的链接:

TableSnippethttps://pan.baidu.com/s/1o1lgHo2Nvw241XjsY7Yl3A?pwd=rfpj

PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...