【ArcGIS Pro二次开发】(44):属性结构描述表【Excel】转空库(批量)

随着县级国土空间总体规划数据库规范的下发,建立标准空库是一项马上就要着手的工作。国空的数据库体量很大,单是要素类就有100多个,不是以前村规数据库能比的,手动建库是不可能的,工具自动建库就是一个很合理的选择。

数据库标准里有每个要素类和表格的【属性结构描述表】,里面规定了要素类、表的名称、别名、字段等属性,只要提取出来就可以用来建库。

以上图为基础,需要将其提取出来,转成Excel格式,这部分工作可以网上搜一下PDF转其它格式数据的方法。

但是这张表还缺少一个属性,就是要素类的类型【点、线、面】,甚至没法知道他是要素类还是表。

当然规范里还有一张表可以查到要素对应的类型,但再多做一张表感觉没必要,特别是如果你只想转几个要素,特意再做表有点浪费时间。所以我在整理出来的【属性结构描述表】里加了一点文字 ,如下图:

为了减少输入参数,工具所需的参数基本都是从Excel表格中读取,因此对Excel表格的规范性要求比较严格,上图中已经一一标示出来。文章后面放出的工程文件也包含了一个Excel模板,可以自行查看。


一、要实现的功能

如上图所示,点击【属性结构描述表转空库】按钮,在弹出的工具框中,选择你修改好的Excel表格,以及放数据库的文件夹位置,再选择正确的坐标系,然后点击执行即可。

生成结果如下:

考虑到工具的通用性,这里没有对数据的结构进行整理,比如和要素数据集的关系等。如果专门针对某一类型的数据库,后期可以试试做一整套的模块。


二、实现流程

工具的核心功能是对Excel文件内容的读取,这在我之前的文章基本都说过了,这里其实就是对所需功能的应用。

首先,读取Excel文件的文件名,作为输出的数据库名:

// 提取Excel文件名【即数据库名】
string name_excel = excel_path[(excel_path.LastIndexOf(@"\") + 1)..excel_path.LastIndexOf(@".")];
// 创建一个空的GDB数据库
Arcpy.CreateFileGDB(gdb_path, name_excel);

打开Excel表格,获取所有的工作表【sheet】,然后针对每个工作表进行处理,一个工作表创建一个要素类或表格:

// 建立 Excel 应用程序对象
Application excelApp = new Application();
// 打开 Excel 文件
Workbook workbook = excelApp.Workbooks.Open(excel_path);
// 获取所有工作表
var worksheets = workbook.Worksheets;
// 针对每个工作表进行处理
foreach (Worksheet worksheet in worksheets)
{// TODO
}

读取到单个sheet后,就可以读取表名,通过解析表名,来获取要素名、要素别名。

这里需要判断要生成的是要素类还是表,主要就是通过我们是否新添加的文字来判断。

最后就可以创建要素类或是表了:

// 获取表名
Range range = worksheet.Range["A1"];
string name_table = range.Value.ToString();
// 解析表名,获取要素名、要素别名
string name_feature = name_table[(name_table.LastIndexOf(@"属性表名:") + 5)..name_table.LastIndexOf(@")")];
string name_alias = name_table[(name_table.LastIndexOf(" ") + 1)..name_table.LastIndexOf(@"属性结构")];
// 根据表名中是否包含要素类型来判断要创建的是要素还是表
if (name_table.EndsWith("】"))           //  要素类的情况
{string fc_type = name_table[(name_table.LastIndexOf("【") + 1)..name_table.LastIndexOf("】")];string fc_type_final = GetFeatureClassType(fc_type);// 创建空要素Arcpy.CreateFeatureclass(gdb_path + @"\" + name_excel + @".gdb", name_feature, fc_type_final, spatial_reference, name_alias);
}
else    //  表的情况
{// 创建表Arcpy.CreateTable(gdb_path + @"\" + name_excel + @".gdb", name_feature, name_alias);
}

要素类或表创建好后,下一步就是添加字段。

这里需要先获取sheet表格的有效行数,不然在空行里执行的话,是肯定要出错的:

// 获取总行数
int row_count = worksheet.UsedRange.Rows.Count;

然后逐行创建字段,字段属性能过读取单元格的文字即可:

// 创建字段
for (int i = 3; i < row_count; i++)
{// 获取字段属性string mc = worksheet.Cells[i, 2].Value.ToString();               // 字段别名string dm = worksheet.Cells[i, 3].Value.ToString();              // 字段名string field_type = GetFeildType(worksheet.Cells[i, 4].Value.ToString());          // 字段类型int lenth = int.Parse(worksheet.Cells[i, 5].Value.ToString());              // 字段升序// 创建字段Arcpy.AddField(gdb_path + @"\" + name_excel + @".gdb\" + name_feature, dm, field_type, mc, lenth);
}

最后关闭Excel文件和应用程序对象:

workbook.Close(false);
excelApp.Quit();

以上便实现了工具的主要功能。


三、工程文件分享

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

CreatEmptyGDBhttps://pan.baidu.com/s/1ndH76yrTq2IoXUZXwZMaNw?pwd=uj08PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/3209.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript数据存储方式

内置对象 js内部提供的对象&#xff0c;包含各种属性和方法给开发者调用 document.write() console.log() Math Math对象是js提供的一个 “数学”对象&#xff0c;提供了一系列做数学运算的方法 max找最大值Math.max(3,8,5,4) 返回8min找最小值Math.min(3,8,5,4) 返回4ab…

nginx部署本地项目如何让异地公网访问?服务器端口映射配置!

接触过IIS或apache的小伙伴们&#xff0c;对nginx是比较容易理解的&#xff0c;nginx有点类似&#xff0c;又有所差异&#xff0c;在选择使用时根据自己本地应用场景来部署使用即可。通过一些对比可能会更加清楚了解&#xff1a; 1.nginx是轻量级&#xff0c;比apache占用更少…

【Matlab】神经网络遗传算法函数极值寻优——非线性函数求极值

目前关于神经网络遗传算法函数极值寻优——非线性函数求极值的博客资源已经不少了&#xff0c;我看了下来源&#xff0c;最初的应该是来自于Matlab中文论坛&#xff0c;论坛出版的《MATLAB神经网络30个案例分析》第4章就是《神经网络遗传算法函数极值寻优——非线性函数极值寻优…

深入理解浏览器的缓存机制之协商缓存与强缓存

目录 什么是浏览器缓存 浏览器缓存的分类 &#x1f397;️ 强缓存 &#x1f397;️ 协商缓存 &#x1f449;&#x1f3fb; 缓存请求流程 &#x1f449;&#x1f3fb; 为什么要有Etag &#x1f449;&#x1f3fb; 缓存优先级 &#x1f449;&#x1f3fb; 启发式缓存 &a…

DBeaver连接mysql时报错com.mysql.cj.jdbc.Driver的解决方法【修改驱动下载的maven地址和重新下载驱动】

文章目录 说明解决方法1、打开DBeaver点击窗口-->窗口-->首选项-->链接-->点击驱动-->Maven-->添加2、删除已有的驱动3、重新创建mysql链接 说明 网上下载了最新版本的DBeaver软件&#xff0c;但是链接mysql的时候驱动下载失败&#xff0c;所以就报下面错误…

【计算机视觉】DINO

paper&#xff1a;Emerging Properties in Self-Supervised Vision Transformers 源码&#xff1a;https://github.com/facebookresearch/dino 20230627周二目前只把第一部分看完了。 论文导读&#xff1a;DINO -自监督视觉Transformers - deephub的文章 - 知乎 综述类型&a…

LangChain:LLM应用程序开发(上)——Models、Prompt、Parsers、Memory、Chains

文章目录 一、Models、Prompt、Parsers1.1 环境配置&#xff08;导入openai&#xff09;1.2 辅助函数&#xff08;Chat API : OpenAI&#xff09;1.3 使用OpenAI API进行文本翻译1.4使用LangChain进行文本翻译1.5 使用LangChain解析LLM的JSON输出1.5.1 LangChain输出为string格…

16.RocketMQ之消费重试以及原理

highlight: arduino-light 1.4 消费重试 对于顺序消息,当消费者消费消息失败后,消费者会在本地自动不断进行消息重试,每次间隔时间为 1 秒,重试最大值是 Integer.MAX_VALUE。 对于无序消息(普通、定时、延时、事务消息)当消费者消费消息失败时可以通过设置返回状态达到重试的目…

面向初学者的卷积神经网络

卷积神经网络在机器学习中非常重要。如果你想做计算机视觉或图像识别任务&#xff0c;你根本离不开它们。但是很难理解它们是如何工作的。 在这篇文章中&#xff0c;我们将讨论卷积神经网络背后的机制、它的优点和应用领域。 什么是神经网络&#xff1f; 首先&#xff0c;让…

【Docker】什么是Docker,它用来干什么

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

网安等保 | 主机安全之KylinOS银河麒麟服务器配置优化与安全加固基线文档脚本分享...

欢迎关注「全栈工程师修炼指南」公众号 点击 &#x1f447; 下方卡片 即可关注我哟! 设为「星标⭐」每天带你 基础入门 到 进阶实践 再到 放弃学习&#xff01; “ 花开堪折直须折&#xff0c;莫待无花空折枝。 ” 作者主页&#xff1a;[ https://www.weiyigeek.top ] 博客&…

如何使用uni-app开发微信小程序

web前端-基于uniapp的微信小程序项目 起步uni-app简介开发工具下载 HBuilderX安装 HBuilderX安装 scss/sass 编译快捷键方案切换修改编辑器的基本设置新建uni-app项目把项目运行到微信开发者工具 scss语法学习安装相关插件和配置基础格式选择器的嵌套父选择器后面添加内容 &…