ArcEngine字段属性域的操作

首先来了解一下什么是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", "");
        }
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值