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

文章介绍了如何利用工具自动化构建县级国土空间数据库,通过读取PDF规范中的属性结构描述表转换为Excel格式,添加要素类型信息,然后使用工具读取Excel内容创建要素类和表格。工具通过读取Excel文件创建GDB数据库,遍历工作表创建要素或表,并添加字段。提供了一个简化的工作流程和工程文件链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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


三、工程文件分享

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

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

补充:示例Excel文件:

县级国土空间规划数据库_中心城区.xlsxicon-default.png?t=N7T8https://pan.baidu.com/s/1PEncEZToNKkXrtDBNZ2bXw?pwd=3gft

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

规划GIS会

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

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

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

打赏作者

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

抵扣说明:

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

余额充值