在GDB及文件夹下建立FeatureClass的区别及遇到的问题总结
1)打开工作空间:
文件夹下:
IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass();
IFeatureWorkspace pFWS = (IFeatureWorkspace)pWSF.OpenFromFile(folder, 0);
GDB:
IWorkspaceFactory pWSF = new AccessWorkspaceFactoryClass();
IWorkspace workspace = pWSF.OpenFromFile(outfileNamePath, 0);
2) 建立字段
文件夹下独立的shapefile文件:
IFields pFields = new FieldsClass();
IFieldsEdit pFieldsEdit;
pFieldsEdit = (IFieldsEdit)pFields;
IField pField = new FieldClass();
IFieldEdit pFieldEdit = (IFieldEdit)pField;
pFieldEdit.Name_2 = "Shape";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
IGeometryDef pGeometryDef = new GeometryDefClass();
IGeometryDefEdit pGDefEdit = (IGeometryDefEdit)pGeometryDef;
pGDefEdit.HasZ_2 = true;
pGDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline;
pGDefEdit.SpatialReference_2 =SpatialReference;
pFieldEdit.GeometryDef_2 = pGeometryDef;
pFieldsEdit.AddField(pField);
无需单独建立oid字段,它会自动生成FID字段。
在GDB下:
IFields fields = new FieldsClass();
IFieldsEdit fieldsEdit = (IFieldsEdit)fields;
// Add an object ID field to the fields collection. This is mandatory for feature classes. 这是在GDB中是必须,否则会出现“这个集合中找不到此项目”的错误,还有另一种自动生成的方法,可以参考 IFeatureWorkspace.CreateFeatureClass Example
如下图所示:
IField oidField = new FieldClass();
IFieldEdit oidFieldEdit = (IFieldEdit)oidField;
oidFieldEdit.Name_2 = "OID";
oidFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;
fieldsEdit.AddField(oidField);
// Create a geometry definition (and spatial reference) for the feature class.
IGeometryDef geometryDef = new GeometryDefClass();
IGeometryDefEdit geometryDefEdit = (IGeometryDefEdit)geometryDef;
geometryDefEdit.GeometryType_2 = esriGeometryType.esriGeometryPolyline;
geometryDefEdit.HasZ_2 = true;//使得Z值生效,这个字段设为true时,在shapefile文件中没有什么问题,但是,在GDB中会导致
//出现这个集合中找不到此项目和The Z domain on the spatial reference is not set or invalid两个错误,解决办法加上红色语句
geometryDefEdit.HasM_2 = false;
geometryDefEdit.SpatialReference_2 = SpatialReference; ;
geometryDefEdit.SpatialReference.SetZDomain(-1000, 60000);//(设定 Z domain)
// Add a geometry field to the fields collection. This is where the geometry definition is applied.
IField geometryField = new FieldClass();
IFieldEdit geometryFieldEdit = (IFieldEdit)geometryField;
geometryFieldEdit.Name_2 = "Shape";
geometryFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
geometryFieldEdit.GeometryDef_2 = geometryDef;
fieldsEdit.AddField(geometryField);
// Create a text field called "Name" for the fields collection.
IField nameField = new FieldClass();
IFieldEdit nameFieldEdit = (IFieldEdit)nameField;
nameFieldEdit.Name_2 = "Name";
nameFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;
nameFieldEdit.Length_2 = 20;
fieldsEdit.AddField(nameField);
其他如基本一致。