思路:获取空间参考——>打开几何编辑——>设置要素类类型(点、线、面)——>设置空间参考——>设置字段集合——>定义单个集合,并添加到字段集合中——>打开工作空间创建要素类
一. 创建点要素类
在工作空间中建立:
/// <summary>
/// 创建独立要素类
/// </summary>
/// <param name="workspace">目标工作空间</param>
/// <param name="featureClassName">目标数据集名称</param>
/// <param name="fieldsCollection">字段集合</param>
/// <param name="shapeFieldName">几何字段名</param>
/// <returns></returns>
public IFeatureClass CreateStandaloneFeatureClass(IWorkspace workspace, string featureClassName, IFields pFields, string shapeFieldName)
{
if (pFields == null)
{
ISpatialReference pSpatialReference = axMapControl1.ActiveView.FocusMap.SpatialReference;
IGeometryDefEdit pGeoDef = new GeometryDefClass();
IGeometryDefEdit pGeoDefEdit = pGeoDef as IGeometryDefEdit;
pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;//esriGeometryPolyline,esriGeometryPolygon
pGeoDefEdit.SpatialReference_2 = pSpatialReference;
//定义一个字段集合对象
pFields = new FieldsClass();
IFieldsEdit pFieldsEdit = (IFieldsEdit)pFields;
//定义单个的字段
IField pField = new FieldClass();
IFieldEdit pFieldEdit = (IFieldEdit)pField;
pFieldEdit.Name_2 = "SHAPE";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
pFieldEdit.GeometryDef_2 = pGeoDef;
pFieldsEdit.AddField(pField);
//定义单个的字段,并添加到字段集合中
pField = new FieldClass(); pFieldEdit = (IFieldEdit)pField;
pFieldEdit.Name_2 = "STCD";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
pFieldsEdit.AddField(pField);
//定义单个的字段,并添加到字段集合中
pField = new FieldClass(); pFieldEdit = (IFieldEdit)pField;
pFieldEdit.Name_2 = "SLM10";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
pFieldsEdit.AddField(pField);
//定义单个的字段,并添加到字段集合中
pField = new FieldClass(); pFieldEdit = (IFieldEdit)pField;
pFieldEdit.Name_2 = "SLM20";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
pFieldsEdit.AddField(pField);
//定义单个的字段,并添加到字段集合中
pField = new FieldClass(); pFieldEdit = (IFieldEdit)pField;
pFieldEdit.Name_2 = "SLM40";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
pFieldsEdit.AddField(pField);
}
IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
IFeatureClassDescription fcDesc = new FeatureClassDescriptionClass();
IObjectClassDescription ocDesc = (IObjectClassDescription)fcDesc;
// Use IFieldChecker to create a validated fields collection.
IFieldChecker fieldChecker = new FieldCheckerClass();
IEnumFieldError enumFieldError = null;
IFields validatedFields = null;
fieldChecker.ValidateWorkspace = workspace;
fieldChecker.Validate(pFields, out enumFieldError, out validatedFields);
// The enumFieldError enumerator can be inspected at this point to determine
// which fields were modified during validation.
IFeatureClass featureClass = featureWorkspace.CreateFeatureClass(featureClassName, validatedFields, ocDesc.InstanceCLSID, ocDesc.ClassExtensionCLSID, esriFeatureType.esriFTSimple, shapeFieldName, null);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "提示");
return null;
}
return featureClass;
}
上面代码看着有些累赘,将字段几何取出
二. 创建点要素类
- CreateStandaloneFeatureClass函数
/// <summary>
/// 创建独立要素类
/// </summary>
/// <param name="workspace">目标工作空间</param>
/// <param name="dicFields">属性结构</param>
/// <param name="featureClassName">目标数据集名称</param>
/// <param name="fieldsCollection">字段集合</param>
/// <param name="shapeFieldName">几何字段名</param>
/// <returns></returns>
public IFeatureClass CreateStandaloneFeatureClass(IWorkspace workspace, Dictionary<string, string> dicFields, string featureClassName, IFields pFields, string shapeFieldName)
{
IFeatureClass featureClass = null;
try
{
ISpatialReference pSpatialReference = axMapControl1.ActiveView.FocusMap.SpatialReference;
//IGeometryDef geometryDef = new GeometryDefClass();
IGeometryDefEdit pGeoDef = new GeometryDefClass();
IGeometryDefEdit pGeoDefEdit = pGeoDef as IGeometryDefEdit;
pGeoDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPoint;//创建点
pGeoDefEdit.SpatialReference_2 = pSpatialReference;//获取空间参考系
//创建要素类的字段集合
pFields = new FieldsClass();
IFieldsEdit pFieldsEdit = (IFieldsEdit)pFields;
if (dicFields != null && dicFields.Count == 0)
{
return null;
}
foreach (var item in dicFields)
{
pFieldsEdit.AddField(BuildField(item.Key, item.Value));
}
#region 添加Shape字段
//添加Shape字段
IField pField = new FieldClass();
IFieldEdit pFieldEdit = (IFieldEdit)pField;
pFieldEdit.Name_2 = "SHAPE";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
pFieldEdit.GeometryDef_2 = pGeoDef; //添加Shape字段
pFieldsEdit.AddField(pField);
;
#endregion
IFeatureWorkspace featureWorkspace = (IFeatureWorkspace)workspace;
IFeatureClassDescription fcDesc = new FeatureClassDescriptionClass();
IObjectClassDescription ocDesc = (IObjectClassDescription)fcDesc;
// Use IFieldChecker to create a validated fields collection.
IFieldChecker fieldChecker = new FieldCheckerClass();
IEnumFieldError enumFieldError = null;
IFields validatedFields = null;
fieldChecker.ValidateWorkspace = workspace;
fieldChecker.Validate(pFields, out enumFieldError, out validatedFields);
// The enumFieldError enumerator can be inspected at this point to determine
// which fields were modified during validation.
featureClass = featureWorkspace.CreateFeatureClass(featureClassName, validatedFields, ocDesc.InstanceCLSID, ocDesc.ClassExtensionCLSID, esriFeatureType.esriFTSimple, shapeFieldName, null);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString(), "提示");
return null;
}
return featureClass;
}
2.构建属性字段BuildField函数
/// <summary>
/// 创建属性结构
/// </summary>
/// <param name="fldname">属性结构名称</param>
/// <param name="fldtype">属性结构字段类型</param>
/// <returns></returns>
private static IField BuildField(string fldname, string fldtype)
{
//IFields fields = new FieldsClass();
IField oidField = new FieldClass();
IFieldEdit oidFieldEdit = (IFieldEdit)oidField;
oidFieldEdit.Name_2 = fldname;
switch (fldtype.ToString().ToLower())
{
case "objectid":
oidFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;
break;
case "longinteger":
oidFieldEdit.Type_2 = esriFieldType.esriFieldTypeInteger;
break;
case "shortinteger":
oidFieldEdit.Type_2 = esriFieldType.esriFieldTypeSmallInteger;
break;
case "text":
oidFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
oidFieldEdit.Length_2 = 50;
break;
case "double":
oidFieldEdit.Type_2 = esriFieldType.esriFieldTypeDouble;
break;
case "geometry":
oidFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
break;
}
return oidField;
}
- main:创建点要素类
//字段
Dictionary<string, string> dicFields = new Dictionary<string, string>();
dicFields.Add("ID", "objectid");
//创建要素类
string featureClassName = "Features";
string shapeFieldName = "SHAPE";
CreateStandaloneFeatureClass(pWs, dicFields, featureClassName, null, shapeFieldName);
三.在数据集中建立
/// <summary>
/// 在工作空间下创建图层
/// </summary>
/// <param name="featureClassName">图层名称</param>
/// <param name="dicFields">属性结构</param>
/// <param name="pfeaturedataset">数据集名称</param>
/// <param name="classExtensionUID">类型UID</param>
/// <param name="featureWorkspace">工作空间</param>
/// <param name="spatialRef">空间参考</param>
/// <param name="esrigeomtryType">几何类型</param>
/// <returns></returns>
public static IFeatureClass CreateFeatureClass(string featureClassName, Dictionary<string, string> dicFields, IFeatureDataset pfeaturedataset, UID classExtensionUID, IFeatureWorkspace featureWorkspace, esriGeometryType esrigeomtryType, ISpatialReference spatialRef)
{
IFeatureClass featureClass = null;
try
{
//创建要素类的字段集合
IFields fields = new FieldsClass();
IFieldsEdit fieldsEdit = (IFieldsEdit)fields;
if (dicFields != null && dicFields.Count == 0)
{
return null;
}
foreach (var item in dicFields)
{
fieldsEdit.AddField(BuildField(item.Key, item.Value));
}
#region 添加Shape字段
//添加Shape字段
IGeometryDef geometryDef = new GeometryDefClass();
IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
geometryDefEdit.GeometryType_2 = esrigeomtryType;
geometryDefEdit.SpatialReference_2 = spatialRef;
IField geometryField = new FieldClass();
IFieldEdit geometryFieldEdit = (IFieldEdit)geometryField;
geometryFieldEdit.Name_2 = "Shape";
geometryFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
geometryFieldEdit.GeometryDef_2 = geometryDef;
fieldsEdit.AddField(geometryField);
#endregion
//创建一个Validated Fields集合
IFieldChecker fieldChecker = new FieldCheckerClass();
IEnumFieldError enumFieldError = null;
IFields validatedFields = null;
fieldChecker.ValidateWorkspace = (IWorkspace)featureWorkspace;
fieldChecker.Validate(fields, out enumFieldError, out validatedFields);
featureClass = pfeaturedataset.CreateFeatureClass(featureClassName, validatedFields, null, classExtensionUID,
esriFeatureType.esriFTSimple, "Shape", "");
return featureClass;
}
catch (Exception ex)
{
}
return null;
}
四.克隆要素类
/// <summary>
/// 创建要素类,克隆模式
/// </summary>
/// <param name="featureClass_InputLine"></param>
/// <returns></returns>
private IFeatureClass CreateStandaFeatureClass(IFeatureClass featureClass_InputLine)
{
IGeometryDef pGeometryDef = new GeometryDef();
IGeometryDefEdit pGeometryDefEdit = pGeometryDef as IGeometryDefEdit;
if (featureClass_InputLine.ShapeType == esriGeometryType.esriGeometryPoint)
{
pGeometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryMultipoint;
pGeometryDefEdit.HasM_2 = false;
pGeometryDefEdit.HasZ_2 = false;
pGeometryDefEdit.SpatialReference_2 = spatialReference;
}
else if (featureClass_InputLine.ShapeType == esriGeometryType.esriGeometryPolyline)
{
pGeometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline;
pGeometryDefEdit.HasM_2 = false;
pGeometryDefEdit.HasZ_2 = false;
pGeometryDefEdit.SpatialReference_2 = spatialReference;
}
else
{
pGeometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolygon;
pGeometryDefEdit.HasM_2 = false;
pGeometryDefEdit.HasZ_2 = false;
pGeometryDefEdit.SpatialReference_2 = spatialReference;
}
// 字段集合
IFields pFields = new Fields();
IFieldsEdit pFieldsEdit = pFields as IFieldsEdit;
for (int i = 0; i < featureClass_InputLine.Fields.FieldCount; i++)
{
IField field = featureClass_InputLine.Fields.get_Field(i);
pFieldsEdit.AddField(field);
}
// 创建要素类 并将将要接边的要素导入
string EdgeSnapFeaturesName = "Features";
IFeatureClass pFeatureClass = pFtDataset.CreateFeatureClass(EdgeSnapFeaturesName, pFields, null, null, esriFeatureType.esriFTSimple, "Shape", "");
return pFeatureClass;
}