【ArcGIS Pro二次开发】(30):数据定义语言DDL详解

news2024/11/18 12:33:18

在之前的文章【ArcGIS Pro二次开发】(19):创建要素类(FeatureClass)中有涉及DDL的知识点,随着深入的学习,在这里做一个小总结。


一、DDL基本概念

ArcGIS Pro二次开发中的DDL API是一种【数据定义语言】,主要是用于创建、删除、编辑地理数据库以及地理数据库的部件(item),如要素类(FeatureClass)、表(Table)等。

1、Description类

DDL中有一个很重要的类:Description类,即描述类。主要用于指定要创建、修改或删除的数据库存对象。例如,【TableDescription】用来描述一个表。【TableDescription】有多个属性,其中一个属性【FieldDescriptin】则是用来描述字段的构成。

下面是一个【FieldDescriptin】的基本结构,其中【"InspectionDate"】是字段名, 【FieldType.Date】是字段类型,通俗的说,这两个属性相当于字段的主属性,是必须要有的属性,而后面属性列表中的【AliasName】是别名,相当于非必要属性,如果不定义的话,会采用默认值:

FieldDescription inspectionDateFieldDescription = new FieldDescription("InspectionDate", FieldType.Date)
{
  AliasName = "Inspection Date"
};

2、SchemaBuilder对象

SchemaBuilder对象(方案构建器?好难翻译),是在地理数据库内部构建的一个对象,用于DDL操作。可以将DDL操作加入SchemaBuilder对象中,按照一定的逻辑顺序执行操作。

例如:先创建SchemaBuilder对象:

SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

再将表的创建添加到我们的DDL任务列表中:

schemaBuilder.Create(tableDescription);

注意这里可以添加多个任务到任务列表中。

然后,通过调用 Build方法来执行这组DDL操作。结果可以返回一个bool值,显示是否执行成功。

bool success = schemaBuilder.Build();

以下是官方文档中记录的SchemaBuilder对象的所有成员和方法:


二、要素类(FeatureClass)、表(Table)的操作

1、创建FeatureClass、Table

以创建Table首先,创建一系列字段描述对象【FieldDescriptin】。

一个【FieldDescriptin】描述一个字段,一个FeatureClass或Table通常有多个字段,所以我们需要的是多个【FieldDescriptin】的列表。

创建字段可以从头创建,也可以基于已有字段,示例如下:

// 从头创建一个字段描述
FieldDescription inspectionDateFieldDescription = new FieldDescription("InspectionDate", FieldType.Date)
{
  AliasName = "Inspection Date"
};

// 从已有的字段创建一个域字段描述
FieldDescription inspectionResultsFieldDescription = FieldDescription.CreateDomainField("InspectionResults", new CodedValueDomainDescription(inspectionResultsDomain));
inspectionResultsFieldDescription.AliasName = "Inspection Results";

创建所需的字段描述对象集后,下一步是创建一个定义表本身的表描述对象【TableDescription】。

【TableDescription】用于传递给【SchemaBuilder.Create】,通过【SchemaBuilder.Create】实现创建表的功能。

具体流程如下:

// 收集所有字段描述的列表
List<FieldDescription> fieldDescriptions = new List<FieldDescription>() 
  { globalIDFieldDescription, objectIDFieldDescription, inspectionDateFieldDescription, inspectionResultsFieldDescription, inspectionNotesFieldDescription };

// 创建一个【tableDescription】对象来描述要创建的表
TableDescription tableDescription = new TableDescription("PoleInspection", fieldDescriptions);

// 创建一个【SchemaBuilder】对象
SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 将创建任务添加到DDL任务列表中
schemaBuilder.Create(tableDescription);

// 执行DDL
bool success = schemaBuilder.Build();

需要注意的是,上面的流程并没有添加ObjectID字段,执行结果,会自动添加ObjectID字段。

创建FeatureClass遵循与创建Table大致相同的原则。不过需要注意的是,你需要额外创建一个 【ShapeDescription】对象来定义shape字段。

【ShapeDescription】对象可以从一组特性创建,也可以使用现有要素类的【FeatureClassDefinition】创建。在这种情况下,新要素类将继承现有类的相同形状特性。

// 创建一个【ShapeDescription】对象
ShapeDescription shapeDescription = new ShapeDescription(GeometryType.Point, spatialReference);

// 或者,可以从另一个要素类创建【ShapeDescription】
ShapeDescription alternativeShapeDescription = new ShapeDescription(existingFeatureClass.GetDefinition());

最后一步则是创建【FeatureClassDescription】,并使用上面描述的相同模式构建要素类。具体如下:

// 创建一个【FeatureClassDescription】对象来描述要创建的要素类
FeatureClassDescription featureClassDescription = new FeatureClassDescription("Cities", fieldDescriptions, shapeDescription);

// 创建一个【SchemaBuilder】对象
SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 将创建任务添加到DDL任务列表中
schemaBuilder.Create(featureClassDescription);

// 执行DDL
bool success = schemaBuilder.Build();

2、修改FeatureClass、Table

以给FeatureClass添加2个新字段为例。

首先,创建一个新的【FeatureClassDescription】。Name属性和【ShapeDescription】就用原有要素的,【FieldDescription】则是在继承原有的基础上,添加2个新字段,然后再替换掉原来的【FieldDescription】进行更新。具体代码如下:

// 要修改的要素
string featureClassName = "Parcels";

// 获取待修改要素的【FeatureClassDefinition】
FeatureClassDefinition originalFeatureClassDefinition = geodatabase.GetDefinition<FeatureClassDefinition>(featureClassName);
// 获取【FeatureClassDescription】
FeatureClassDescription originalFeatureClassDescription = new FeatureClassDescription(originalFeatureClassDefinition);

// 定义需要添加的2个字段
FieldDescription taxCodeDescription = FieldDescription.CreateIntegerField("Tax_Code");
FieldDescription addressDescription = FieldDescription.CreateStringField("Parcel_Address", 150);

// 将2个新字段添加到【FieldDescription】列表中
List<FieldDescription> modifiedFieldDescriptions = new List<FieldDescription>(originalFeatureClassDescription.FieldDescriptions);
modifiedFieldDescriptions.Add(taxCodeDescription);
modifiedFieldDescriptions.Add(addressDescription);

// 使用新添加的字段创建一个【FeatureClassDescription】
FeatureClassDescription modifiedFeatureClassDescription = new FeatureClassDescription(originalFeatureClassDescription.Name, modifiedFieldDescriptions, originalFeatureClassDescription.ShapeDescription);

SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 更新【Parcels】要素
schemaBuilder.Modify(modifiedFeatureClassDescription);
bool modifyStatus = schemaBuilder.Build();
// 如果出现错误,返回
if (!modifyStatus)
{
  IReadOnlyList<string> errors = schemaBuilder.ErrorMessages;
}

3、重命名FeatureClass、Table

重命名表格或要素类,请创建与要重命名的表格或要素类匹配的【Description】对象。然后在【SchemaBuilder】类上调用Rename方法,代码如下:

// 定义原Name和要重命名的Name
string tableToBeRenamed = "Original_Table";
string tableRenameAs = "Renamed_Table";
// 获取要重命名的表的【TableDefinition】
TableDefinition tableDefinition = geodatabase.GetDefinition<TableDefinition>(tableToBeRenamed);

SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 调用Rename方法即可重命名
schemaBuilder.Rename(new TableDescription(tableDefinition), tableRenameAs);
// 执行DDL
schemaBuilder.Build();

4、添加和删除字段

这里添加字段的方法和上面第2节使用的方法大致相同。

// 从现有表中获取【TableDescription】
TableDescription tableDescription = new TableDescription(parcelTableDefinition);

// 获取【FieldDescriptions】
List<FieldDescription> fieldDescriptions = new List<FieldDescription> (tableDescription.FieldDescriptions);

// 往【FieldDescriptions】中添加字段
fieldDescriptions.Add(FieldDescription.CreateIntegerField("FloodRiskScale"));

// 修改【TableDescription】
TableDescription modifiedTableDescription = new TableDescription(tableDescription.Name, fieldDescriptions);

// 更新【TableDescription】  
schemaBuilder.Modify(modifiedTableDescription);

// 执行DDL
schemaBuilder.Build();

删除字段方法如下:

// 从现有表中获取【TableDescription】
TableDescription tableDescription = new TableDescription(parcelTableDefinition);

// 定义要保留的字段
FieldDescription taxFieldToBeRetained = new FieldDescription(parcelTableDefinition.GetFields().First(f => f.Name.Equals("TaxCode")));
List<FieldDescription> fieldsToBeRetained = new List<FieldDescription> { taxFieldToBeRetained };

// 修改【TableDescription】
TableDescription modifiedTableDescription = new TableDescription(tableDescription.Name, fieldsToBeRetained);

// 更新【TableDescription】
schemaBuilder.Modify(modifiedTableDescription);

// 执行DDL
schemaBuilder.Build();

5、修改现有字段的属性

可以使用SchemaBuilder.Modify(TableDescription、String、FieldDescription)方法修改表或要素类中某些现有字段的字段属性,如名称、别名、长度和类型。

但是需要注意,有些固有字段是不能修改的,如ObjestID,Shape_Area等。

还有就是别名的最大长度为255个字符,地理数据库中不允许使用空字符串作为别名。

示例代码如下:

// 获取要修改的字段【Parcel_Address】
Field parcelAddress = featureClassDefinition.GetFields().FirstOrDefault(f => f.Name.Contains("Parcel_Address"));

// 更新字段的别名和长度
FieldDescription newParcelFieldDescription = new FieldDescription(parcelAddress) 
{
  AliasName = "Physical Property Address",
  Length = 250
};

// 设置默认的字段值
newParcelFieldDescription.SetDefaultValue("123 Main St");

schemaBuilder.Modify(new TableDescription(featureClassDefinition), parcelAddress.Name, newParcelFieldDescription);
schemaBuilder.Build();

6、删除FeatureClass、Table

要删除FeatureClass、Table只需要使用【SchemaBuilder.Delete】方法即可,其它的步骤和上面都差不多。

// 获取【tableDescription】
TableDescription tableDescription = new TableDescription(table.GetDefinition());

// 创建【SchemaBuilder】对象
SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 调用【Delete】方法
schemaBuilder.Delete(tableDescription);

// // 执行DDL
bool success = schemaBuilder.Build();

三、文件地理数据库(GDB)的操作

1、创建和删除文件地理数据库

创建和删除文件地理数据库遵循的模式与其他DDL操作略有不同。可以调用【SchemaBuilder】类上的【CreateGeodatabase】和【DeleteGeodatabase】方法来创建和删除文件地理数据库。

这两个方法都以【FileGeodatabaseConnectionPath】作为参数,即文件路径。

需要注意的是,如果文件地理数据库正在使用中,则无法将其删除。所有对文件地理数据库的执行工作都必须在删除前完成。

// 创建【SchemaBuilder】对象
SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 调用【CreateGeodatabase】方法创建数据库
schemaBuilder.CreateGeodatabase(GeodatabasePath);

// 执行DDL
bool success = schemaBuilder.Build();

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

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

相关文章

【Web服务器集群】Web基础与HTTP协议

文章目录 一、Web基础1.域名概述1.1域名的概念1.2域名解析1.3域名空间结构 2.域名注册3.网页的概念4.HTML概述4.1HTML概念4.2HTML文档的结构 5.网页基本标签6.Web概述7.静态网页与动态网页7.1静态网页7.2动态网页7.3动态网页语言 二、HTTP协议1.概念2.HTTP协议的版本3.HTTP方法…

pytest+requests+Python3.7+yaml+Allure+Jenkins+docker实现接口自动化

目录 接口自动化测试框架&#xff08;用例自动生成&#xff09; 项目说明 技术栈 环境部署 框架流程图与目录结构图及相关说明 1、框架流程图如下 2、代码目录结构图如下 关联详解 函数助手详解 代码设计与功能说明 1、定义运行配置文件 runConfig.yml 2、接口配置…

构建系统安全防线!Genmai安全漏洞检测框架全面解析

01 Genmai是什么&#xff1f; Genmai是由openkylin社区SecurityGovernance SIG为了挖掘、检测、验证麒麟产品的安全漏洞而主导开发的一款开源主机漏洞扫描、网络漏洞扫描以及基线扫描的安全扫描框架。其致力于能在短时间内对主流的操作系统进行安全检测&#xff0c;并确保准确…

Unity3D :使用 UXML 实例作为模板

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 使用 UXML 实例作为模板 您可以将现有 UXML 文档实例化为 UXML 文档中的模板作为模板实例&#xff0c;类似于预制件 在 Unity 中工作。 使用 UXML 文档作为模板 要将项目中的现有…

「API 接口获取方法」

在创建一个应用程序的过程中&#xff0c;获取数据是非常关键的一步。而通过API接口获取数据通常是最好的方式之一。那么&#xff0c;如何通过关键字获取API接口呢&#xff1f;以下是一些步骤&#xff1a; 1.确定你需要获取的数据类型 首先&#xff0c;你需要确定你需要获取的…

深入浅出 SQL Server CDC 数据同步

简介 SQL Server 是一款老牌关系型数据库,自 1988 年由 Microsoft、Sybase 和 Ashton-Tate 三家公司共同推出&#xff0c;不断迭代更新至今&#xff0c;拥有相当广泛的用户群体。 如今&#xff0c;我们提到 SQL Server 通常指 Microsoft SQL Server 2000 之后的版本。 SQL S…

软件测试的7个级别,做到3级已经超越80%测试人!

有人说&#xff1a;软件测试就是最low的点点点工作。 有人说&#xff1a;测试工作职位薪水到一定程度只能原地踏步无法提升 也有人说&#xff1a;测试行业相对于开发来说技术性很低&#xff0c;容易被取代。 这其实是对测试行业最大的误解。测试可深可浅&#xff0c;可窄可广…

linux嵌入式学习

https://www.runoob.com/linux/linux-comm-ls.html https://www.bilibili.com/video/BV1w4411B7a4?p19&spm_id_frompageDriver&vd_sourcee7d12c9f66ab8294c87125a95510dac9 1 eMMC eMMC&#xff08;embedded MultiMediaCard&#xff09;是一种集成电路&#xff0c;用…

vue2+wangeditor富文本域

vue2wangeditor富文本域 效果图安装依赖初始化简约模式自定义模式图片设置只允许 base64 方式支持图片服务器 更多配置项目依赖项目代码 效果图 安装依赖 npm i wangeditor/editor wangeditor/editor-for-vue初始化 <template><div class"editor-box">…

IIS 日志解析,增强 IIS 服务器安全性

企业严重依赖 Microsoft Internet 信息服务 &#xff08;IIS&#xff09; 服务器来托管其网页和 Web 应用程序&#xff0c;以及存储其文件。请务必妥善保护您的 IIS 服务器&#xff08;包括 Web 和 FTP&#xff09;。 什么是 IIS 日志 IIS 日志是 Microsoft IIS Web 服务器上…

柔顺机构学读书笔记1:悬臂梁变形

题目&#xff1a; 如图考虑悬臂梁&#xff0c;材料各向同性&#xff0c;即各个方向上的弹性模量和强度都相同。如果在x方向上作用一个可使最大应力等于屈服强度 S S S的力 F x F_x Fx​时&#xff0c; x x x轴方向的变形为多少&#xff0c;书上给出了答案&#xff1a; 我们来验…

网易有道财报:网易有道2023财年收入将强劲增长,亏损将减少?

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 预计2023年收入增长强劲&#xff0c;净亏损收窄 猛兽财经认为网易有道&#xff08;DAO&#xff09;今年是有能力实现更多的收入增长和减少亏损的。具体来说&#xff0c;我们预计网易有道的收入将在2023财年增长至少20%&am…

Semantic Kernel VS LangChain

每当向他人介绍 Semantic Kernel&#xff0c;会得到的第一个问题就是 Semantic Kernel 类似于 LangChain 吗&#xff1f;或者是 C# 版本的 LangChain 吗&#xff1f;因此我总结了这篇文章。 微软MVP实验室研究员 张善友 深圳友浩达 CTO & 首席架构师&#xff0c;微软最有价…

进程间通信-system V共享内存

文章目录 1. system V共享内存1.1 共享内存示意图 2. 共享内存函数2.1 shmget函数2.2 代码实现2.2.1 shmat2.2.2 shmdt 3. 信息量 1. system V共享内存 system V的意思是一套标准&#xff0c;共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间&#xff…

AI遇上建筑设计,是出圈还是翻车?

AIGC 落地&#xff0c;始于场景&#xff0c;终于价值。 去年以来出现了 AIGC 热潮&#xff0c;引发了 AIGC 及其应用话题的爆发性增长&#xff0c;不少人感慨强人工智能的时代已经离我们不那么遥远了。但是在热潮的另一面&#xff0c;我们看到真正能落地的场景依然是凤毛麟角&a…

【C语言】结构体指针

结构体指针 结构体基础知识注意对于成员的赋值 结构体指针指向结构体变量的指针结构体指针与结构体成员指针用结构体指针引用结构体成员 结构体 基础知识 初识结构体&#xff0c;可以先看这篇浅显易懂的文章结构体–基础篇 所谓结构体&#xff0c;是一组类型可以不同的相关变…

部署输配电线路火灾隐患排查治理

输电线路防山火在线监测装置 一、产品描述&#xff1a; 电力设施为了远离人们的生活区域选择部分扎根在森林里面&#xff0c;减少发生触电事故的发生。但是提到森林就不得不说其中一个山火问题&#xff0c;山火灾害对建设在森林的电力设施造成的损害不可预估&#xff0c;为保障…

CodeForces.1806A .平面移动.[简单][判断可达范围][找步数规律]

题目描述&#xff1a; 题目解读&#xff1a; 给定移动规则以及起始点&#xff0c;终点&#xff1b;分析终点是否可达&#xff0c;可达则输出最小步数。 解题思路&#xff1a; 首先要判定是否可达。画图可知&#xff0c;对于题目给定的移动规则&#xff0c;只能到达起始点(a,b…

Go 开发实践:手把手教你搭建一个登录功能

本文首发自「慕课网」 &#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"及“慕课网公众号”&#xff01; 作者&#xff1a;Codey|慕课网讲师 用 Go 语言搭建简易登录功能 如果你最近刚学习Go 语言基础特性&#xff0c;对 …

《深入理解BigDecimal:揭秘钱财计算的核心技术》

文章目录 《深入理解BigDecimal:揭秘钱财计算的核心技术》***\*一、BigDecimal概述\*******\*二、BigDecimal常用构造函数\****2.1、常用构造函数2.2、使用问题分析***\*三、BigDecimal常用方法详解\****3.1、常用方法3.2、BigDecimal大小比较***\*四、BigDecimal格式化\*****…