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

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

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

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

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


一、要实现的功能

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


二、实现流程

1、创建空表格

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

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

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

using ArcGIS.Core.Data.DDL;

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

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

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

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

            // 打开编辑
            EditOperation editOperation = new EditOperation();
            await QueuedTask.Run(() =>
            {
                using (Geodatabase geodatabase = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(gdb))))
                using (Table table = geodatabase.OpenDataset<Table>("用地用海表"))
                {
                    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文件直接安装。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ArcGIS Pro二次开发是指使用ArcGIS Pro软件进行自定义功能开发的过程。对于初学者而言,开始二次开发可能感到无从入手,因为中文资料较少,官方文档对于英文不熟悉的人来说可能不太友好。 要开始ArcGIS Pro二次开发,你可以按照以下步骤进行操作: 1. 首先,以管理员身份运行Visual Studio 2019。如果没有安装Visual Studio 2019,你需要先下载并安装它。 2. 在Visual Studio中,右键项目名称,选择"添加",然后选择"新建项"。 3. 在"新建项"下拉菜单中,选择"ArcGIS",然后选择"ArcGIS Pro Add-ins",再选择"ArcGIS Pro按钮",最后点击"添加"。 4. 接下来,配置新项目。在Visual Studio中,点击"文件",选择"新建",然后选择"项目"。 5. 在"新建项目"对话框中,选择"C#"作为语言,选择"Windows"作为平台,然后选择"ArcGIS Pro SDK"。在项目类型中选择"ArcGIS Pro模块加载项",然后点击"下一步"。 6. 设置新项目的配置,然后点击"创建"。等待项目创建完成。 通过以上步骤,你就可以开始进行ArcGIS Pro二次开发了。你可以根据你的需求,使用C#编程语言进行开发,并且利用ArcGIS Pro SDK提供的功能来扩展ArcGIS Pro软件的功能。 希望这些步骤能够帮助你入门ArcGIS Pro二次开发。如果你遇到了其他问题或需要更多详细的指导,请随时提问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【ArcGIS Pro二次开发】系列学习笔记,持续更新,记得收藏](https://blog.csdn.net/xcc34452366/article/details/129223703)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [ArcGIS Pro二次开发环境配置及项目创建示例](https://blog.csdn.net/wsywsy00/article/details/128550006)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

规划GIS会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值