地理数据库中创建表和对象类

本文详细介绍了如何在ArcGIS Engine中创建表和对象类,包括两者的区别及在地理数据库中的作用。文章重点讲解了使用CreateTable方法创建表的过程,包括参数设置、名称验证和字段创建等内容。

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

现在在做一项目,需要用到ArcGIS Engine开发。之前没有接触过,所以想把这个学习的过程记录下来,供以后参考。

在创建Geodatabase的基础上,要向地理数据库中添加数据,本篇文章是介绍在数据库中创建表和对象类的方法。

table和object class虽然在geodatabase中经常交换使用,但两者还是有差别的。object class是一种特殊类型的表,在geodatabase中已经被注册了,也就是geodatabase系统表已经对他进行引用。table不像object class一样具有geodatabse属性,比如,他们没有 aliases, subtypes 或者domains assigned to their fields。

当在ArcCatalog中创建一个table,默认的创建了一个object class,但是CreateTable的类标识符(CLSID)参数是用于创建不被geodatabase注册的table。空值表示创建未注册的table,而不是通过一个有效的唯一标识符(UID)实例创建。

在讨论geodatabase时,table一般是指object class。

在geodatabases中创建table或object class是通过CreateTable的方法。table和object class只能存在workspace中,而不能包含在要素数据集feature datasets中。CreateTable方法如下:

<span style="font-size:14px;">public ITable CreateTable (
    string Name,
    IFields Fields,
    UID CLSID,
    UID EXTCLSID,
    string ConfigKeyword
);</span>

由上述代码可知,新表的属性是通过CreateTable方法的Name、Fields、CLSID、EXTCLSID和ConfigKeyword等参数进行设置的。

Name参数

在geodatabase中是通过object class的名称对其进行识别的。在调用CreateTable之前需要确定object class的名称是唯一的。可以通过 IWorkspace2.NameExists 属性进行判断,但只对geodatabase数据有用。不同的数据源有不同的名称限制,使用IFieldChecker.TableName验证名称是否适合特定的workspace。但该方法不检查是否有相同的名称存在,只是判断是否含有无效字符等。

调用IFeatureWorkspace.CreateTable方法试图创建一个具有无效field name的object class时将出现错误。 IFieldChecker接口提供对fields集合的特定数据源的验证。The IFieldChecker.Validate方法把fields集合作为一个输入参数,返回field错误枚举,以验证后的fields集合作为输出参数。在调用Validate方法前, ValidateWorkspace 属性必须先设置到创建fields的workspace。

字段名称不能出现以下四种情况:

1、字段名与数据源名称相同,如table

2、字段名与之前定义的字段名重复

3、字段名称含有无效字符

4、字段名称长度超出数据源规定字段名称的最大长度

Fields参数

每个object class都有fields集合,字段集合组成了类的结构。未注册的表必须至少有一个field。而object class需要objectID字段。IFields, IField, and IFieldEdit接口能够用于创建和设置feature class的fields,IObjectClassDescription 接口的 RequiredFields属性能够获取预定义要求的fields。对于object classes, RequiredFields返回仅包含objectID 字段的field集合。

CLSID和EXTCLSID参数

可选的CLSID和EXTCLSID参数允许调用应用程序指定GUIDS给对象类的实例和类扩展行为。使用提供对象类定制行为的扩展类的接口IObjectClassDescription, InstanceCLSID 和 ClassExtensionCLSID 属性可以指定对象类的COM类的CLSID。CLSID有效值是esriGeoDatabase.Object或者任何扩展esriGeoDatabase.Object的非空间对象。 ObjectClassDescription 类从他的 InstanceCLSID 属性返回  esriGeodatabase.Object 的GUID。如果没有CLSID通过,则生成的table不能作为一个object class被创建,并且不能在geodatabase中注册,并且ObjectClassID值为-1。aliases、subtypes等的CLSID允许table利用geodatabase的属性。

如果一个扩展被分配给object class只需要EXTCLSID参数。多数情况下,该参数为空值。使用ObjectClassDescription 类的ClassExtensionCLSID属性相当于传递一个空值。类的扩展允许object class执行如自定义验证和事件处理等任务。ObjectClassID值为-1的未注册的tables不能有类的扩展。

Configuration keyword

可选的configurationKeyword属性允许程序控制在底层RDBMS或file geodatabase中表的物理布局。例如,在Oracle database情况下,配置关键字可以控制表创建的表空间等属性。ArcSDE实例的congfigurationKeywords通过ArcSDE的数据管理员设置。用IWorkspaceConfiguration接口获取workspace支持的可用keywords列表。file geodatabase的configuration keywords是被定义的。在大多数情况下,应该使用默认的keyword。

创建示例代码:

 private IObjectClass CreateObjectClasswithFields(IWorkspace workspace, string className)
        {
            IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
            IWorkspace2 workspace2 = workspace as IWorkspace2;//显式转换不能用于iworkspace2
            //判断类的名称是否已经存在,如果存在,则返回
            if(workspace2!=null)
            {
                if (workspace2.get_NameExists(esriDatasetType.esriDTTable, className))
                {
                    ITable exsitingTable = featureWorkspace.OpenTable(className);
                    return (IObjectClass)exsitingTable;
                }
            }
            //验证类的名称是否符合workspace
            IFieldChecker fieldChecker = new FieldCheckerClass();
            string validatedclassName = null;
            fieldChecker.ValidateWorkspace = workspace;
            int tableNameErrorType = fieldChecker.ValidateTableName(className,out validatedclassName);
            //创建object class的description,并且得到需要的fields
            IObjectClassDescription obclDescription = new ObjectClassDescriptionClass();
            IFields fields = obclDescription.RequiredFields;
            IFieldsEdit fieldsEdit = (IFieldsEdit)fields;
            //添加field名
            IField field = new FieldClass();
            IFieldEdit fieldEdit = (IFieldEdit)field;
            fieldEdit.Name_2 = "NAME";
            fieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
            fieldsEdit.set_Field(0, field);
            //验证field
            IEnumFieldError enumFieldError = null;
            IFields validatedFields = null;
            fieldChecker.Validate(fields, out enumFieldError, out validatedFields);
            //创建并返回object class
            ITable pTable = featureWorkspace.CreateTable(validatedclassName, validatedFields, obclDescription.InstanceCLSID, null, "");
            return (IObjectClass)pTable;
        }





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值