首先来了解一下什么是ArcGIS中的属性域。假设现在要在文件地理数据库中新建一个道路要素类,其属性字段如下图所示:
其中,Name
表示道路名称,Width
表示道路宽度,Type
表示道路类型。按照一般常识,道路的宽度肯定是在一定范围内的,不太可能出现宽度为1000米的道路。同样的,道路的类别也是有限的,无非就是国道、省道、县道等等。因此在对道路要素进行编辑时,我们需要对其中的部分字段做出一定约束,使这些字段编辑后的值是合法的,这时候就需要用到属性域。选择文件地理数据库,单击右键选择属性,弹出如下界面:
我们先建立一个范围属性域,名称为道路宽度
,该属性域的最小值为5,最大值为30,字段类型与Width
字段对应,为长整型,如下图所示:
接着建立一个编码属性域,如下图所示:名称为道路类别
,字段类型与Type
字段对应,为文本类型,同时定义4个编码值:01-国道
、02-省道
、03-县道
、04-乡道
,点击确定,属性域就建好了。
接下来就是将字段与属性域关联起来,如下图所示:选择Width
字段,将其属性域设置为道路宽度
,选择Type
字段,将其属性域设置为道路类别
,点击确定即可。
现在我们可以开始编辑要素类了,绘制一条线段,编辑其属性,如下图所示:Type字段下出现下拉框,选择一个类型即可。
你可能会发现,我把Width字段的值设置成了100,但我们刚刚设置的道路宽度属性域只允许宽度在5-30之间。这里需要注意:范围属性域不会影响你编辑字段值,它是在检查要素的阶段才会提示你字段值错误。如下图所示:选中这条要素,在编辑条中选择验证要素:
点击后如下图所示:
以上就是在ArcGIS中建立属性域的一般步骤。在ArcEngine中,我们也可以实现属性域的相关操作,其代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Output;
using ESRI.ArcGIS.SystemUI;
namespace WindowsFormsApplication1
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
private void btnAddDomain_Click(object sender, EventArgs e)
{
IWorkspaceFactory pWorkspaceFactory = new FileGDBWorkspaceFactory();
IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(@"E:\Users\dsf\Desktop\data.gdb", 0);
IWorkspaceDomains pWorkspaceDomains = pWorkspace as IWorkspaceDomains;
// 范围属性域
IRangeDomain pRangeDomain = new RangeDomain() as IRangeDomain;
pRangeDomain.MinValue = 5;
pRangeDomain.MaxValue = 30;
// 添加属性域
IDomain pDomain = pRangeDomain as IDomain;
pDomain.Name = "道路宽度";
pDomain.Description = "该属性域用于约束道路宽度";
pDomain.FieldType = esriFieldType.esriFieldTypeInteger;
pDomain.MergePolicy = esriMergePolicyType.esriMPTDefaultValue;
pDomain.SplitPolicy = esriSplitPolicyType.esriSPTDefaultValue;
pWorkspaceDomains.AddDomain(pDomain);
// 编码属性域
ICodedValueDomain pCodedValueDomain = new CodedValueDomain() as ICodedValueDomain;
pCodedValueDomain.AddCode("01", "国道");
pCodedValueDomain.AddCode("02", "省道");
pCodedValueDomain.AddCode("03", "县道");
pCodedValueDomain.AddCode("04", "乡道");
// 添加属性域
pDomain = pCodedValueDomain as IDomain;
pDomain.Name = "道路类别";
pDomain.Description = "该属性域用于约束道路类别";
pDomain.FieldType = esriFieldType.esriFieldTypeString;
pDomain.MergePolicy = esriMergePolicyType.esriMPTDefaultValue;
pDomain.SplitPolicy = esriSplitPolicyType.esriSPTDefaultValue;
pWorkspaceDomains.AddDomain(pDomain);
// 空间参考
ISpatialReferenceFactory pSpatialReferenceFactory = new SpatialReferenceEnvironment();
ISpatialReference pSpatialReference = pSpatialReferenceFactory.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
IGeometryDef pGeometryDef = new GeometryDef();
IGeometryDefEdit pGeometryDefEdit = pGeometryDef as IGeometryDefEdit;
pGeometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline;
pGeometryDefEdit.HasM_2 = false;
pGeometryDefEdit.HasZ_2 = false;
pGeometryDefEdit.SpatialReference_2 = pSpatialReference;
// 字段集合
IFields pFields = new Fields();
IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;
// Shape
IField pField = new Field();
IFieldEdit pFieldEdit = pField as IFieldEdit;
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
pFieldEdit.GeometryDef_2 = pGeometryDef;
pFieldEdit.AliasName_2 = "Shape";
pFieldEdit.Name_2 = "Shape";
pFieldEdit.IsNullable_2 = false;
pFieldEdit.Required_2 = true;
pFieldsEdit.AddField(pField);
// Width
pField = new Field();
pFieldEdit = pField as IFieldEdit;
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger;
pFieldEdit.AliasName_2 = "Width";
pFieldEdit.Name_2 = "Width";
pFieldEdit.IsNullable_2 = true;
pFieldEdit.Domain_2 = pWorkspaceDomains.get_DomainByName("道路宽度");
pFieldsEdit.AddField(pField);
// Type
pField = new Field();
pFieldEdit = pField as IFieldEdit;
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
pFieldEdit.AliasName_2 = "Type";
pFieldEdit.Name_2 = "Type";
pFieldEdit.Length_2 = 5;
pFieldEdit.IsNullable_2 = true;
pFieldEdit.Domain_2 = pWorkspaceDomains.get_DomainByName("道路类别");
pFieldsEdit.AddField(pField);
// 创建要素类
IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
IFeatureClass pFeatureClass = pFeatureWorkspace.CreateFeatureClass("道路", pFields, null, null, esriFeatureType.esriFTSimple, "Shape", "");
}
}
}