ArcEngine Domain 总结

基础知识

属性域基础知识
属性域工具箱

ArcEngine操作

常用接口

IDomain、ICodedValueDomain、ICodedValueDomain2、IRangeDomain
Domain类图

创建编码域(coded value domains)

//将Workspace对象转换到IworkspaceDomains接口
IWorkspaceDomains workspaceDomains = (IWorkspaceDomains)workspace;
// 创建编码域
ICodedValueDomain codedValueDomain = new CodedValueDomainClass();
// 添加编码
codedValueDomain.AddCode("RES", "Residential");
codedValueDomain.AddCode("COM", "Commercial");
codedValueDomain.AddCode("IND", "Industrial");
codedValueDomain.AddCode("BLD", "Building");
// 移除编码
codedValueDomain.DeleteCode("BLD"); // The "Building" code is removed.
// 将ICodedValueDomain对象转换到IDomain对象上,设置通用属性
IDomain domain = (IDomain)codedValueDomain;
domain.Name = "Building Types";
domain.FieldType = esriFieldType.esriFieldTypeString;
domain.SplitPolicy = esriSplitPolicyType.esriSPTDuplicate;
domain.MergePolicy = esriMergePolicyType.esriMPTDefaultValue;
// 添加Domain到工作空间中
workspaceDomains.AddDomain(domain);

创建范围域(range domains)

// 将Workspace对象转换到IworkspaceDomains接口
IWorkspaceDomains workspaceDomains = (IWorkspaceDomains)workspace;
// 创建范围域
IRangeDomain rangeDomain = new RangeDomainClass();
rangeDomain.MinValue = 0;//设置最小值
rangeDomain.MaxValue = 255;//设置最大值
//将IRangeDomain对象转换到IDomain对象上,设置通用属性
IDomain domain = (IDomain)rangeDomain;
domain.Name = "EightBitUnsignedInt";//设置Domain名称
domain.FieldType = esriFieldType.esriFieldTypeInteger;//设置Domain的字段类型
domain.SplitPolicy = esriSplitPolicyType.esriSPTDuplicate;//设置Domain的分割策略
domain.MergePolicy = esriMergePolicyType.esriMPTAreaWeighted;//设置Domain的合并策略
//添加Domain到工作空间中
workspaceDomains.AddDomain(domain);

打开值域

IWorkspaceDomains workspaceDomains = (IWorkspaceDomains)workspace;
IDomain requestedDomain = workspaceDomains.get_DomainByName(domainName);

删除值域

IWorkspaceDomains workspaceDomains = (IWorkspaceDomains)workspace;
workspaceDomains.DeleteDomain(domainName);

修改值域

//修改Domain的属性
......代码略
//修改完,调用AlterDmoain方法保存修改
IWorkspaceDomains2.AlterDomain(pDomain);

在字段上应用值域

// For example: domainName = "Material".
// fieldName = "CP_MATERIAL".
public void AssignDomainToField(IFeatureClass featureClass, String domainName,String fieldName)
{
    // Cast the feature class to IDataset to get a reference to the workspace.
    IDataset dataset = (IDataset)featureClass;
    // Get the workspace and cast it to the IWorkspaceDomains interface and get the requested domain.
    IWorkspace workspace = dataset.Workspace;
    IWorkspaceDomains workspaceDomains = (IWorkspaceDomains)workspace;
    IDomain domain = workspaceDomains.get_DomainByName(domainName);
    // Get the field to assign the domain to.
    IFields fields = featureClass.Fields;
    int fieldIndex = featureClass.FindField(fieldName);
    IField field = fields.get_Field(fieldIndex);
    // Check that the field and domain have the same field type.
    if (field.Type == domain.FieldType)    
	{
        // Cast the feature class to the ISchemaLock and IClassSchemaEdit interfaces.
        ISchemaLock schemaLock = (ISchemaLock)featureClass;
        IClassSchemaEdit classSchemaEdit = (IClassSchemaEdit)featureClass;
        // Attempt to get an exclusive schema lock.        
		try        
		{
            // Lock the class and alter the domain.
            schemaLock.ChangeSchemaLock(esriSchemaLock.esriExclusiveSchemaLock);
            classSchemaEdit.AlterDomain(fieldName, domain);
            Console.WriteLine("The domain was successfully assigned.");        
		}
        catch (Exception exc)        
		{
            // Handle the exception in a way appropriate for the application.
            Console.WriteLine(exc.Message);        
		}
        finally
        {
            // Set the schema lock to be a shared lock.
            schemaLock.ChangeSchemaLock(esriSchemaLock.esriSharedSchemaLock);
        }
	}
    else
    {
        Console.WriteLine("The field and the domain have different field types: " + 
            "Field = {0}, Domain = {1}", field.Type, domain.FieldType);    
	}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值