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