【AO笔记】关于创建IFeatureClass中的参考系设置

创建一个要素类是很简单的,只需要获取一枚IFeatureWorkspace或者一个IFeatureDataset,然后调用其CreateFeatureClass即可。

这个方法定义如下:

public IFeatureClass CreateFeatureClass (
    string Name,
    IFields Fields,
    UID CLSID,
    UID EXTCLSID,
    esriFeatureType FeatureType,
    string ShapeFieldName,
    string ConfigKeyword
);

第二个参数很关键,叫字段集合。

有关这个参数怎么写的问题,网上代码相当多了。

我们知道在ArcGIS中创建要素类的时候,会有两个必须存在的系统字段:OBJECTID、SHAPE;

在AO/AE编程中,必须自己创建这两个字段(字段名可以自己定义,但是相关的属性必须设置好,此处为了好看将全大写的SHAPE改为Shape),否则不能创建要素类。

问题来了,我们在ArcGIS中创建要素类的时候,是可以不选空间参考的,但是AO/AE不行,必须对IGeometryDefEdit.SpatialReference进行赋值:

/// <summary><br />/// 创建Shape字段的代码,以及为Shape字段添加几何定义<br />/// </summary><br /><br />IGeometryDef geometryDef = new GeometryDefClass();
IGeometryDefEdit geometryDefEdit = geometryDef as IGeometryDefEdit;
geometryDefEdit.GeometryType_2 = esrigeomtryType;
geometryDefEdit.HasZ_2 = true;
geometryDefEdit.SpatialReference_2 = // 必须在此设置参考;

IField geometryField = new FieldClass();
IFieldEdit geometryFieldEdit = (IFieldEdit)geometryField;
geometryFieldEdit.Name_2 = "Shape";
geometryFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
geometryFieldEdit.GeometryDef_2 = geometryDef;
fieldsEdit.AddField(geometryField);

否则创建要素类就会报错,VS调试模式中,报错信息提示:缺少空间参考。

于是,我查找了ISpatialReference的定义:

为了完成不加参考系的小目标,我找到了这个类:UnknownCoordinateSystem : ISpatialReference

如果想在创建要素类的时候不设置任何参考系,即Unknown参考系,那就可以用这个类,而不是赋值为null。

即:

ISpatialReference unknownCS = new UnknownCoordinateSystemClass();

// ... 其他代码

geometryDefEdit.SpatialReference_2 = unkownCS;

即可。

——未完待续,待测试。

ao