FAQ
ArcObjects でのフィーチャクラスの新規作成

ナレッジ番号:5534 | 登録日:2023/07/27 | 更新日:2024/11/21

概要

既存のワークスペースに対して新規にフィーチャクラスを作成する方法を示します。フィーチャクラスは、IFeatureWorkspace::CreateFeatureClass メソッドを使用します。CreateFeatureClass メソッドの引数には、以下の引数を指定します。

  • 第1引数:フィーチャクラス名
  • 第2引数:フィールドのコレクション(Fields オブジェクト)
  • 第3引数:CLSID(ジオデータベースの振る舞いを指定)
  • 第4引数:EXTCLSID(カスタムな振る舞いを実装する場合に使用)
  • 第5引数:フィーチャ タイプ
  • 第6引数:ジオメトリのフィールド名
  • 第7引数:ArcSDE コンフィグレーション キーワード

ジオデータベースのフィーチャクラスを新規作成する場合、CreateFeatrueClass メソッドの第3引数に null (Nothing) をセットすると、自動的に適切なオブジェクトがセットされます。シェープファイルの場合も null (Nothing) を指定します。

フィーチャクラスの作成には、フィールドの定義が必要です。フィールドは、Field クラスを使用します。個々に作成した Field オブジェクトをフィールドのコレクションである Fields オブジェクトにセットします。

フィールドには特殊なフィールドがあります。

OBJECTID フィールド

レコードがユニークであることを保証するためのフィールドです。Field オブジェクトを作成する際、IFieldEdit::FieldType プロパティに esriFieldType.esriFieldTypeOID 定数を指定します。

SHAPE フィールド

ジオメトリ オブジェクトを格納するためのフィールドです。Field オブジェクトを作成する際、IFieldEdit::FieldType プロパティに esriFieldType.esriFieldTypeGeometry 定数を指定します。また、IFieldEdit::GeometryDef プロパティに GeometryDef オブジェクトを指定します。GeometryDef オブジェクトでは、ジオメトリの種類、空間参照、空間インデックスのグリッド サイズを指定します。

サンプル コード

フィーチャクラスの新規作成

既存のワークスペースに対してフィーチャクラスを新規作成する方法です。ここでは、空間参照が不明なポイントのフィーチャクラスを作成しています。既存ワークスペースへのアクセス方法、空間参照オブジェクトの作成方法については関連情報をご参照ください。

//フィールド コレクション
IFields pFields = new FieldsClass();
IFieldsEdit pFieldsEdit = (IFieldsEdit)pFields;

//フィールド
IField pField = new FieldClass();
IFieldEdit pFieldEdit = (IFieldEdit)pField;

//OBJECTID フィールド
//ジオデータベースのフィーチャクラスを作成する場合は必須、シェープファイルの場合は不要
pFieldEdit = new FieldClass();
pFieldEdit.Name_2 = "OBJECTID";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID;
pFieldsEdit.AddField(pFieldEdit);

//SHAPE フィールド
IGeometryDef pGeometryDef = new GeometryDefClass();
IGeometryDefEdit pGeometryDefEdit = (IGeometryDefEdit)pGeometryDef;
pGeometryDefEdit.GeometryType_2 = ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint;   //ジオメトリ(ポイント)

//座標系の設定
Type t = Type.GetTypeFromProgID("esriGeometry.SpatialReferenceEnvironment");
System.Object obj = Activator.CreateInstance(t);
ISpatialReferenceFactory pSRFactory = (ISpatialReferenceFactory)obj;
IProjectedCoordinateSystem pProjectedCoordinateSystem = pSRFactory.CreateProjectedCoordinateSystem((int)esriSRProjCS4Type.esriSRProjCS_JGD2000_Japan_Zone_9); //平面直角座標系 第 9 系 (JGD2000)
ISpatialReference pSpatialReference = pProjectedCoordinateSystem;
ISpatialReferenceResolution pSpatialReferenceResolution = (ISpatialReferenceResolution)pSpatialReference;
pSpatialReferenceResolution.ConstructFromHorizon();
ISpatialReferenceTolerance pSpatialReferenceTolerance = (ISpatialReferenceTolerance)pSpatialReference;
pSpatialReferenceTolerance.SetDefaultXYTolerance();
pGeometryDefEdit.SpatialReference_2 = pSpatialReference;

pGeometryDefEdit.GridCount_2 = 1;                          //空間インデックス数
pGeometryDefEdit.set_GridSize(0, 0);                       //空間インデックス サイズ
pGeometryDefEdit.HasZ_2 = true;                            //Z 値の格納を有効化
pGeometryDefEdit.HasM_2 = true;                            //M 値の格納を有効化

pFieldEdit = new FieldClass();
pFieldEdit.Name_2 = "SHAPE";
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
pFieldEdit.GeometryDef_2 = pGeometryDef;
pFieldsEdit.AddField(pFieldEdit);


//その他のフィールド
pFieldEdit = new FieldClass();
pFieldEdit.Name_2 = "ROADNAME";                             //フィールド名
pFieldEdit.AliasName_2 = "道路名";                           //フィールド エイリアス名
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString;      //フィールドのタイプ(文字型)
pFieldEdit.Length_2 = 16;                                   //フィールド長
pFieldEdit.IsNullable_2 = true;                             //NULL 値を許可
pFieldsEdit.AddField(pFieldEdit);

//既存ワークスペースを取得
String path = @"C:\ArcMap\testFGDB.gdb";
Type factoryType = System.Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory");
IWorkspaceFactory pWorkspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);
IWorkspace pWorkspace = pWorkspaceFactory.OpenFromFile(path, 0);

//既存ワークスペースへのアクセス
IFeatureWorkspace pFeatureWorkspace = (IFeatureWorkspace)pWorkspace;     

//フィーチャクラスの新規作成
IFeatureClass pFeatureClass = pFeatureWorkspace.CreateFeatureClass("道路", pFields, null, null, esriFeatureType.esriFTSimple, "SHAPE", "");
'フィールド コレクション
Dim pFields = New FieldsClass()
Dim pFieldsEdit As IFieldsEdit = pFields

'フィールド
Dim pField = New FieldClass()
Dim pFieldEdit As IFieldEdit = pField

'OID フィールド
'ジオデータベースのフィーチャクラスを作成する場合は必須、シェープファイルの場合は不要
pFieldEdit = New FieldClass()
pFieldEdit.Name_2 = "OBJECTID"
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeOID
pFieldsEdit.AddField(pFieldEdit)


'座標系の設定
Dim t As System.Type = System.Type.GetTypeFromProgID("esriGeometry.SpatialReferenceEnvironment")
Dim pSpatialReferemceFactory As ISpatialReferenceFactory = CType(Activator.CreateInstance(t), ISpatialReferenceFactory)
Dim pProjectedCoordinateSystem As IProjectedCoordinateSystem = pSpatialReferemceFactory.CreateProjectedCoordinateSystem(CInt(esriSRProjCS4Type.esriSRProjCS_JGD2000_Japan_Zone_9))  '平面直角座標系 第 9 系 (JGD2000)
Dim pSpatialReference As ISpatialReference = pProjectedCoordinateSystem
Dim pSpatialReferenceResolution As ISpatialReferenceResolution = pSpatialReference
pSpatialReferenceResolution.ConstructFromHorizon()
Dim pSpatialReferenceTolerance As ISpatialReferenceTolerance = pSpatialReference
pSpatialReferenceTolerance.SetDefaultXYTolerance()

'SHAPE フィールド
Dim pGeomeryDef As IGeometryDef = New GeometryDefClass()
Dim pGeometryDefEdit As IGeometryDefEdit = pGeomeryDef
pGeometryDefEdit.GeometryType_2 = ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint   'ジオメトリ(ポイント)
pGeometryDefEdit.SpatialReference_2 = pSpatialReference
pGeometryDefEdit.GridCount_2 = 1                              '空間インデックス数
pGeometryDefEdit.GridSize_2(0) = 0                            '空間インデックス サイズ
pGeometryDefEdit.HasZ_2 = True                                'Z 値の格納を有効化
pGeometryDefEdit.HasM_2 = True                                'M 値の格納を有効化

pFieldEdit = New FieldClass()
pFieldEdit.Name_2 = "SHAPE"
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry
pFieldEdit.GeometryDef_2 = pGeomeryDef
pFieldsEdit.AddField(pFieldEdit)

'その他のフィールド
pFieldEdit = New FieldClass()
pFieldEdit.Name_2 = "ROADNAME"                                'フィールド名
pFieldEdit.AliasName_2 = "道路名"                              'フィールド エイリアス名
pFieldEdit.Type_2 = esriFieldType.esriFieldTypeString         'フィールドのタイプ(文字型)
pFieldEdit.Length_2 = 16                                      'フィールド長
pFieldEdit.IsNullable_2 = True                                'NULL 値を許可
pFieldsEdit.AddField(pFieldEdit)

'既存ワークスペースを取得
Dim path As String = "C:\ArcMap\testFGDB.gdb"
Dim factoryType As System.Type = System.Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory")
Dim pWorkspaceFactory As IWorkspaceFactory = CType(Activator.CreateInstance(factoryType), IWorkspaceFactory)
Dim pWorkspace As IWorkspace = pWorkspaceFactory.OpenFromFile(path, 0)

'既存ワークスペースへのアクセス
Dim pFeatureWorkspace As IFeatureWorkspace = CType(pWorkspace, IFeatureWorkspace) 'ワークスペースを取得

'フィーチャクラスの新規作成
Dim pFeatureClass As IFeatureClass = pFeatureWorkspace.CreateFeatureClass("道路", pFields, Nothing, Nothing, esriFeatureType.esriFTSimple, "SHAPE", "")

メタデータ

機能

種類

製品