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

news2024/9/20 20:41:22

随着县级国土空间总体规划数据库规范的下发,建立标准空库是一项马上就要着手的工作。国空的数据库体量很大,单是要素类就有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.coloradmin.cn/o/691088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

短视频seo矩阵系统源码开发思路

短视频SEO矩阵系统源码开发&#xff0c;需要遵循一下步骤&#xff1a; 1. 确定需求和功能&#xff1a;明确系统的主要目标和需要实现的功能&#xff0c;包括关键词研究、短视频制作、外链建设、数据分析、账号设置优化等方面。 2. 设计系统架构&#xff1a;根据需求和功能确定…

2023第二届中国汽车碳中和国际峰会 嘉宾更新

The 2nd China Automotive Carbon Neutral Summit 2023 2023第二届中国汽车碳中和国际峰会 嘉宾更新 Event Background会议背景 As the world increasingly recognizes the devastating impact of climate change, governments, organizations, and individuals are taking a…

如何安装微信小程序开发工具

1、点击进入微信开发者工具&#xff08;稳定版 Stable Build&#xff09;下载地址&#xff0c;选择Win64的版本下载。 2、运行exe程序&#xff0c;可能会出现微软商城安全提醒&#xff0c;不用理睬&#xff0c;直接点运行。 3、点击“下一步”。 4、点击“我接受”。 5、选择安…

vant-weapp源码解析(一)

想每天做点新东西&#xff0c;因此有此记录 这是进入的第一个页面&#xff0c;里面有引入list&#xff0c;page。 config.js:这是路径配置文件 page.js&#xff0c;外层配置文件 options,就算引入这个page.js页面所传递的数据 点击进入导航&#xff0c;看第一个按钮组件 button…

秋招二本4年Java经验,五面字节(定薪45K)

前段时间刚面试上岸&#xff0c;先后面试了各大小公司&#xff0c;拿了一些 offer&#xff0c;有阿里&#xff0c;滴滴&#xff0c;快手&#xff0c;达达&#xff0c;得物等公司。面试的公司大部分都能过&#xff0c;所以这里给大家分享下自己的经验&#xff0c;也给自己做个归…

学习Vue3——生命周期

简单来说就是一个组件从创建到销毁的过程称为生命周期 Vue 2 生命周期钩子函数Vue 3 生命周期钩子函数含义beforeCreatesetup在实例初始化之后、数据观测 (data observer) 和 event/watcher 事件配置之前被调用createdsetup在实例创建完成后被立即调用。在这一步&#xff0c;实…

手机信号老是卡,问题可能出在这四个原因上!

换手机的速度肯定是赶不上换卡的速度&#xff0c;当手机使用了一定的年限之后&#xff0c;不少小伙伴发现信号网速是越来越差&#xff0c;如果是到“五杀暴走” 的关键时刻&#xff0c;突然的卡顿能让你的心降到冰点&#xff01; 这都是小编和小伙伴们在交流心得的时候得到的一…

uniapp打包app后,微信授权登录

官方文档&#xff1a;App端OAuth(登录鉴权)模块 关键配置项说明&#xff1a; 1、appid 微信开放平台申请应用的AppID值。 2、appSecret&#xff08;HBuilderX3.4.18 不再提供此参数的可视化配置&#xff09; 微信开放平台申请应用的AppSecret值。 找到manifest.json文件&am…

VR全景编辑器v1.0版本上线,为企业提供沉浸式全景可视化服务。

随着物联网技术的迅速发展&#xff0c;可视化技术在物联网中起到越来越重要的作用&#xff0c;当康科技经过不懈努力&#xff0c;研发了自己的一款基于物联网VR全景可视化的编辑器&#xff0c;为企业助力可视化服务。 部分源代码&#xff1a;&#xff1a; // 基础图标图库 ex…

几千万记录,数据库表结构如何平滑变更?

回答知识星球水友“逆光下的微笑”提问。 问题域&#xff1a;数据量大、并发量高场景&#xff0c;如何在流量低峰期&#xff0c;平滑实施表结构变更&#xff1f; 画外音&#xff0c;一般来说&#xff0c;是指增加表的属性&#xff0c;因为&#xff1a;&#xff08;1&#xff09…

手把手教你,本地RabbitMQ服务搭建(windows)

本地RabbitMQ服务搭建&#xff08;windows&#xff09; 前言一、Erlang 环境准备1. 下载安装包2. 安装 二、RabbitMQ服务器安装1. 下载安装包2. 安装RabbitMQ server3. 启动RabbitMQ4. 启动状态检测5. 管理插件启用 三、登录管理界面 前言 前面已经对RabbitMQ介绍了很多内容&a…

Excel怎样对比两列数据的异同

很多用户在使用Excel的时候会碰到一种情况就是将两列数据进行对比&#xff0c;如果数据少则很好用肉眼去对比吗&#xff0c;但是数据一多则就麻烦咯&#xff0c;那么下面小编就来教教大家如何快速对比两列数据的异同。 一&#xff1a;适用于对比不同文字的异同&#xff1b; 首先…

提升测试开发工程师工作效率的法宝:ELK日志平台

目录 前言&#xff1a; 1.什么是ELK 2.如何构建ELK通道 3.使用ELK的思考 前言&#xff1a; ELK日志平台是一个非常有用的工具&#xff0c;可以大大提高测试开发工程师的工作效率。ELK是指Elasticsearch、Logstash和Kibana&#xff0c;这三个开源工具的结合构成了一个功能强…

利用阿里云物联网平台(IoT)实现WEB数据可视化

一年前在阿里物联网平台测试过一个项目&#xff0c;后来就搁置了&#xff0c;昨天有事需要用&#xff0c;发现出错了。 调整完后写一下使用思路&#xff0c;以便未来之需。 阿里云物联网&#xff08;IoT&#xff09;主页&#xff1a;https://iot.aliyun.com/ 阿里云物联网&…

JavaScript中数组高阶函数的使用

一.数组高阶函数---forEach 它可以用来遍历数组中的每个元素&#xff0c;并对每个元素执行指定的操作。forEach函数接受一个回调函数作为参数&#xff0c;该回调函数在遍历数组的每个元素时被调用。 forEach函数的基本语法 array.forEach(callback(currentValue, index, arr…

java操作influxdb时,出现HTTP status code: 401; Message: unauthorized access

使用java操作influxdb出现HTTP status code: 401; Message: unauthorized access 在这里插入图片描述之前创建客户端是这样的 然后关闭客户端连接 后来我尝试吧influxDB null去掉&#xff0c;每次都创建新的连接 然后就行了哦&#xff0c;咱也不知道为啥&#xff0c;反正就…

Web概述

1.1 程序开发架构 1.1.1C/S体系结构介绍 C/S是Client/Server的缩写&#xff0c;即客户端&#xff0f;服务器结构。在这种结构中&#xff0c;服务器 通常采用高性能的机或工作站&#xff0c;并采用大型数据库系统&#xff08;如Oracle或SQLServer)客户端 则需要安装专用的客户…

深入浅出设计模式 - 代理模式

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

qt中c++获取图片qml实时显示的方式1——继承QQuickPaintedItem

通过c opencv获取rtsp视频流&#xff0c;或者视频源&#xff0c;在qml上进行实时视频显示。 一、在QML中通过QQuickPaintedItem动态加载图片 在QML中&#xff0c;可以使用QQuickPaintedItem来创建自定义的可绘制项。通过继承QQuickPaintedItem类&#xff0c;我们可以在QML中动…

这些面试攻略给你2023测试面试带来最强力的支持

在boss和拉钩上投了有几十份简历&#xff0c;其中70%未读状态&#xff0c;30%已读&#xff0c;已读的一半回复要求发送附件简历&#xff0c;然后这周接到面试的有七、八家公司&#xff0c;所以&#xff0c;当前这个大环境真的难 这半个月来&#xff0c;每天安排三到四场面试&a…