FAQ
ArcObjects での3D ポイントを格納するフィーチャクラスの作成方法

ナレッジ番号:5303 | 登録日:2023/07/26 | 更新日:2023/12/28

概要

3D ポイントを格納するフィーチャクラスを作成する場合、Shape フィールドのジオメトリ定義を格納している GeometryDef オブジェクトに以下の属性値を設定することが必要です。

  • IGeometryDefEdit::GeometryType
  • IGeometryDefEdit::HasZ
  • IGeometryDef::SpatialReference  プロパティから取得した SpatialReference オブジェクトに対して ISpatialReference::SetZDomain で Z ドメインを設定

サンプル コード

GeometryDef オブジェクトの設定例

if (fields.Field(j).Type==ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeGeometry)
{
    pGeoDef = fields.Field(j).GeometryDef;
    pGeoDef.GeometryType_2 = ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint;
    pGeoDef.HasZ_2 = True;
    spatialReference = pGeoDef.SpatialReference;
    spatialReference.SetZDomain(0, 1000);
}
 If fields.Field(j).Type = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeGeometry Then
       pGeoDef = fields.Field(j).GeometryDef
       pGeoDef.GeometryType_2 = ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint
       pGeoDef.HasZ_2 = True
       spatialReference = pGeoDef.SpatialReference
       spatialReference.SetZDomain(0, 1000)
 End If

3D ポイント用フィーチャクラスを作成

以下のサンプルコードは ArcObjects SDK for the Microsoft .NET Framework に含まれるスニペット 「フィーチャクラスを作成する」を元に、3D ポイントのフィーチャクラスに対応するように変更を加えたものです。それぞれの引数には以下をご指定ください。

  • 第 1 引数はフィーチャクラスを格納するワークスペース
  • 第 2 引数はフィーチャクラスを格納するフィーチャ データセット
  • 第 3 引数はフィーチャクラスの名称
  • 第 4 引数はフィーチャクラスに含める Fiedls。指定しない場合は関数内で指定される
  • 第 5 引数は クラス ID。指定しない場合は関数内で指定される
  • 第 6 引数は クラス エクステンション
  • 第 7 引数は コンフィギュレーション キーワード
public ESRI.ArcGIS.Geodatabase.IFeatureClass CreateFeatureClass(ESRI.ArcGIS.Geodatabase.IWorkspace2 workspace, ESRI.ArcGIS.Geodatabase.IFeatureDataset featureDataset, System.String featureClassName, ESRI.ArcGIS.Geodatabase.IFields fields, ESRI.ArcGIS.esriSystem.UID CLSID, ESRI.ArcGIS.esriSystem.UID CLSEXT, System.String strConfigKeyword)
{
  if (featureClassName == "") return null; // 名前は渡されませんでした。 

  ESRI.ArcGIS.Geodatabase.IFeatureClass featureClass;
  ESRI.ArcGIS.Geodatabase.IFeatureWorkspace featureWorkspace = (ESRI.ArcGIS.Geodatabase.IFeatureWorkspace)workspace; // 明示的なキャスト

  if (workspace.get_NameExists(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTFeatureClass, featureClassName)) // その名前のフィーチャクラスは既に存在します。 
  {
    featureClass = featureWorkspace.OpenFeatureClass(featureClassName);
    return featureClass;
  }

  // ClassID の値が割り当てられていない場合は割り当てます。
  if (CLSID == null)
  {
    CLSID = new ESRI.ArcGIS.esriSystem.UIDClass();
    CLSID.Value = "esriGeoDatabase.Feature";
  }

  ESRI.ArcGIS.Geodatabase.IObjectClassDescription objectClassDescription = new ESRI.ArcGIS.Geodatabase.FeatureClassDescriptionClass();

  // フィールド コレクションが渡されていない場合、独自のものを与えます。
  if (fields == null)
  {
    // 要求されたフィールドのメソッドを使用して、フィールド(fields)を作成します。
    fields = objectClassDescription.RequiredFields;
    ESRI.ArcGIS.Geodatabase.IFieldsEdit fieldsEdit = (ESRI.ArcGIS.Geodatabase.IFieldsEdit)fields; // 明示的なキャスト
    ESRI.ArcGIS.Geodatabase.IField field = new ESRI.ArcGIS.Geodatabase.FieldClass();

    // ユーザによって定義されたテキスト フィールドを作成します。
    ESRI.ArcGIS.Geodatabase.IFieldEdit fieldEdit = (ESRI.ArcGIS.Geodatabase.IFieldEdit)field; // 明示的なキャスト

    // フィールド プロパティを設定します。
    fieldEdit.Name_2 = "SampleField";
    fieldEdit.Type_2 = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeString;
    fieldEdit.IsNullable_2 = true;
    fieldEdit.AliasName_2 = "Sample Field Column";
    fieldEdit.DefaultValue_2 = "test";
    fieldEdit.Editable_2 = true;
    fieldEdit.Length_2 = 100;

    // フィールド コレクションにフィールドを追加します。
    fieldsEdit.AddField(field);
    fields = (ESRI.ArcGIS.Geodatabase.IFields)fieldsEdit; // 明示的なキャスト
  }

  System.String strShapeField = "";

  ESRI.ArcGIS.Geodatabase.IGeometryDefEdit pGeoDef;
  ESRI.ArcGIS.Geometry.ISpatialReference spatialReference;


  // Shape フィールドの場所を特定します。
  for (int j = 0; j < fields.FieldCount; j++)
  {
    if (fields.get_Field(j).Type == ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeGeometry)
    {
      strShapeField = fields.get_Field(j).Name;
                pGeoDef = (ESRI.ArcGIS.Geodatabase.IGeometryDefEdit)fields.get_Field(j).GeometryDef;
                pGeoDef.GeometryType_2 = ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint;

                spatialReference = pGeoDef.SpatialReference;
                pGeoDef.HasZ_2 = true;
                spatialReference.SetZDomain(0, 1000);
    }
  }

  // IFieldCheckerを使用してバリデートされた(有効な)フィールド コレクションを作成します。
  ESRI.ArcGIS.Geodatabase.IFieldChecker fieldChecker = new ESRI.ArcGIS.Geodatabase.FieldCheckerClass();
  ESRI.ArcGIS.Geodatabase.IEnumFieldError enumFieldError = null;
  ESRI.ArcGIS.Geodatabase.IFields validatedFields = null;
  fieldChecker.ValidateWorkspace = (ESRI.ArcGIS.Geodatabase.IWorkspace)workspace;
  fieldChecker.Validate(fields, out enumFieldError, out validatedFields);

  // enumFieldError列挙子は、バリデーションの間にどのフィールドが変更されたか 
  // バリデーションの間にどのフィールドが変更されたか、この時点で検査されます。


  // 最後に、フィーチャクラスを作成し、返します。
  if (featureDataset == null)// もし、フィーチャクラスが渡されない場合、ワークスペース レベルに作成します。
  {
      featureClass = featureWorkspace.CreateFeatureClass(featureClassName, validatedFields, CLSID, CLSEXT, ESRI.ArcGIS.Geodatabase.esriFeatureType.esriFTSimple, strShapeField, strConfigKeyword);
  }
  else
          {
      featureClass = featureDataset.CreateFeatureClass(featureClassName, validatedFields, CLSID, CLSEXT, ESRI.ArcGIS.Geodatabase.esriFeatureType.esriFTSimple, strShapeField, strConfigKeyword);
  }
  return featureClass;
}
   Public Function CreateFeatureClass(ByVal workspace As ESRI.ArcGIS.Geodatabase.IWorkspace2, ByVal featureDataset As ESRI.ArcGIS.Geodatabase.IFeatureDataset, ByVal featureClassName As System.String, ByVal fields As ESRI.ArcGIS.Geodatabase.IFields, ByVal CLSID As ESRI.ArcGIS.esriSystem.UID, ByVal CLSEXT As ESRI.ArcGIS.esriSystem.UID, ByVal strConfigKeyword As System.String) As ESRI.ArcGIS.Geodatabase.IFeatureClass

        If featureClassName = "" Then
            Return Nothing ' 名前は渡されませんでした。
        End If

        Dim featureClass As ESRI.ArcGIS.Geodatabase.IFeatureClass
        Dim featureWorkspace As ESRI.ArcGIS.Geodatabase.IFeatureWorkspace = CType(workspace, ESRI.ArcGIS.Geodatabase.IFeatureWorkspace) ' 明示的なキャスト

        If workspace.NameExists(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTFeatureClass, featureClassName) Then
            featureClass = featureWorkspace.OpenFeatureClass(featureClassName) ' その名前のフィーチャクラスは既に存在します。
            Return featureClass
        End If

        ' ClassID の値が割り当てられていない場合は割り当てます。
        If CLSID Is Nothing Then
            CLSID = New ESRI.ArcGIS.esriSystem.UIDClass
            CLSID.Value = "esriGeoDatabase.Feature"
        End If

        Dim objectClassDescription As ESRI.ArcGIS.Geodatabase.IObjectClassDescription = New ESRI.ArcGIS.Geodatabase.FeatureClassDescriptionClass

        ' フィールド コレクションが渡されていない場合、独自のものを与えます。
        If fields Is Nothing Then
            ' 要求されたフィールドのメソッドを使用して、フィールド(fields)を作成します。
            fields = objectClassDescription.RequiredFields
            Dim fieldsEdit As ESRI.ArcGIS.Geodatabase.IFieldsEdit = CType(fields, ESRI.ArcGIS.Geodatabase.IFieldsEdit) ' 明示的なキャスト
            Dim field As ESRI.ArcGIS.Geodatabase.IField = New ESRI.ArcGIS.Geodatabase.FieldClass

            ' ユーザによって定義されたテキスト フィールドを作成します。
            Dim fieldEdit As ESRI.ArcGIS.Geodatabase.IFieldEdit = CType(field, ESRI.ArcGIS.Geodatabase.IFieldEdit) ' 明示的なキャスト

            ' フィールド プロパティを設定します。
            fieldEdit.Name_2 = "SampleField"
            fieldEdit.Type_2 = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeString
            fieldEdit.IsNullable_2 = True
            fieldEdit.AliasName_2 = "Sample Field Column"
            fieldEdit.DefaultValue_2 = "test"
            fieldEdit.Editable_2 = True
            fieldEdit.Length_2 = 100

            ' フィールド コレクションにフィールドを追加します。
            fieldsEdit.AddField(field)
            fields = CType(fieldsEdit, ESRI.ArcGIS.Geodatabase.IFields) ' 明示的なキャスト

        End If

        Dim strShapeField As System.String = ""
        Dim pGeoDef As ESRI.ArcGIS.Geodatabase.IGeometryDefEdit
        Dim spatialReference As ESRI.ArcGIS.Geometry.ISpatialReference

        'Shape フィールドの場所を特定します。
        Dim j As System.Int32
        For j = 0 To fields.FieldCount - 1
            If fields.Field(j).Type = ESRI.ArcGIS.Geodatabase.esriFieldType.esriFieldTypeGeometry Then
                strShapeField = fields.Field(j).Name
                pGeoDef = fields.Field(j).GeometryDef
                pGeoDef.GeometryType_2 = ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint

                spatialReference = pGeoDef.SpatialReference
                pGeoDef.HasZ_2 = True
                spatialReference.SetZDomain(0, 1000)

            End If
        Next j

        ' IFieldChecker を使用してバリデートされた(有効な)フィールド コレクションを作成します。
        Dim fieldChecker As ESRI.ArcGIS.Geodatabase.IFieldChecker = New ESRI.ArcGIS.Geodatabase.FieldCheckerClass()
        Dim enumFieldError As ESRI.ArcGIS.Geodatabase.IEnumFieldError = Nothing
        Dim validatedFields As ESRI.ArcGIS.Geodatabase.IFields = Nothing
        fieldChecker.ValidateWorkspace = CType(workspace, ESRI.ArcGIS.Geodatabase.IWorkspace)
        fieldChecker.Validate(fields, enumFieldError, validatedFields)

        ' enumFieldError列挙子は、バリデーションの間にどのフィールドが変更されたか 
        ' 決定するために、この時点で検査されます。


        ' 最後に、フィーチャクラスを作成し、返します。
        If featureDataset Is Nothing Then
            ' もし、フィーチャクラスが渡されない場合、ワークスペース レベルに作成します。
            featureClass = featureWorkspace.CreateFeatureClass(featureClassName, validatedFields, CLSID, CLSEXT, ESRI.ArcGIS.Geodatabase.esriFeatureType.esriFTSimple, strShapeField, strConfigKeyword)
        Else
            featureClass = featureDataset.CreateFeatureClass(featureClassName, validatedFields, CLSID, CLSEXT, ESRI.ArcGIS.Geodatabase.esriFeatureType.esriFTSimple, strShapeField, strConfigKeyword)
        End If

        Return featureClass

    End Function

メタデータ

種類

製品