版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yh0503/article/details/79820526
基础知识
ArcEngine操作
常用接口
IDomain、ICodedValueDomain、ICodedValueDomain2、IRangeDomain
创建编码域(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);
}
}