先来了解一下什么是ArcGIS中的子类型字段。新建一个要素类,名称为道路,其字段如下图所示:其中Type
为长整型字段,用以标识道路的类别。
现在我们选择该要素类,单击右键,弹出界面后选择子类型选项卡,如下图所示:子类型字段选择Type
,然后添加国道
、省道
、县道
、乡道
这四个字类型,点击确定即可。
下面开始编辑该要素类,可以发现图层列表和编辑框内已经将该要素类分为四类,如下图所示:
其实在设置好子类型字段后,你也可以给子类型字段设置属性域,可参考如下代码:
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 btnAddSubtypes_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;
IFeatureWorkspace pFeatureWorkspace = pWorkspace as IFeatureWorkspace;
// 编码属性域
ICodedValueDomain pCodedValueDomain = new CodedValueDomain() as ICodedValueDomain;
pCodedValueDomain.AddCode("01", "1001");
pCodedValueDomain.AddCode("02", "1002");
pCodedValueDomain.AddCode("03", "1003");
pCodedValueDomain.AddCode("04", "1004");
// 添加属性域
IDomain pDomain = pCodedValueDomain as IDomain;
pDomain.Name = "道路代码";
pDomain.Description = "该属性域用于约束道路代码";
pDomain.FieldType = esriFieldType.esriFieldTypeString;
pDomain.MergePolicy = esriMergePolicyType.esriMPTDefaultValue;
pDomain.SplitPolicy = esriSplitPolicyType.esriSPTDefaultValue;
pWorkspaceDomains.AddDomain(pDomain);
// 创建字段子类型
IFeatureClass pFeatureClass = pFeatureWorkspace.OpenFeatureClass("道路");
ISubtypes pSubtypes = pFeatureClass as ISubtypes;
pSubtypes.SubtypeFieldName = "Type";
pSubtypes.AddSubtype(1, "国道");
pSubtypes.AddSubtype(2, "省道");
pSubtypes.AddSubtype(3, "县道");
pSubtypes.AddSubtype(4, "乡道");
pSubtypes.DefaultSubtypeCode = 1;
// 子类型设置属性域
pSubtypes.set_Domain(1, "Code", pWorkspaceDomains.get_DomainByName("道路代码"));
pSubtypes.set_Domain(2, "Code", pWorkspaceDomains.get_DomainByName("道路代码"));
pSubtypes.set_Domain(3, "Code", pWorkspaceDomains.get_DomainByName("道路代码"));
pSubtypes.set_Domain(4, "Code", pWorkspaceDomains.get_DomainByName("道路代码"));
}
}
}