Bootstrap

ArcGIS Pro SDK (八)地理数据库 7 DDL

ArcGIS Pro SDK (八)地理数据库 7 DDL

环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0

1 创建表

// 创建一个PoleInspection表,包含以下字段
//  GlobalID
//  ObjectID
//  InspectionDate(日期)
//  InspectionResults(预定义的InspectionResults编码值域)
//  InspectionNotes(字符串)

// 这个静态辅助方法创建一个带有默认值的GlobalID字段的FieldDescription
FieldDescription globalIDFieldDescription = FieldDescription.CreateGlobalIDField();

// 这个静态辅助方法创建一个带有默认值的ObjectID字段的FieldDescription
FieldDescription objectIDFieldDescription = FieldDescription.CreateObjectIDField();

// 为InspectionDate字段创建一个FieldDescription
FieldDescription inspectionDateFieldDescription = new FieldDescription("InspectionDate", FieldType.Date)
{
    AliasName = "Inspection Date"
};

// 这个静态辅助方法为域字段创建一个FieldDescription(来自预定义的域)
FieldDescription inspectionResultsFieldDescription = FieldDescription.CreateDomainField("InspectionResults", new CodedValueDomainDescription(inspectionResultsDomain));
inspectionResultsFieldDescription.AliasName = "Inspection Results";

// 这个静态辅助方法为字符串字段创建一个FieldDescription
FieldDescription inspectionNotesFieldDescription = FieldDescription.CreateStringField("InspectionNotes", 512);
inspectionNotesFieldDescription.AliasName = "Inspection Notes";

// 汇总所有字段描述的列表
List<FieldDescription> fieldDescriptions = new List<FieldDescription>()
{ globalIDFieldDescription, objectIDFieldDescription, inspectionDateFieldDescription, inspectionResultsFieldDescription, inspectionNotesFieldDescription };

// 创建一个描述要创建表的TableDescription对象
TableDescription tableDescription = new TableDescription("PoleInspection", fieldDescriptions);

// 创建一个SchemaBuilder对象
SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 将PoleInspection表的创建添加到我们的DDL任务列表中
schemaBuilder.Create(tableDescription);

// 执行DDL
bool success = schemaBuilder.Build();

// 检查错误信息
if (!success)
{
    IReadOnlyList<string> errorMessages = schemaBuilder.ErrorMessages;
    //等等
}

2 创建要素类

// 创建一个Cities要素类,包含以下字段
//  GlobalID
//  ObjectID
//  Name(字符串)
//  Population(整数)

// 这个静态辅助方法创建一个带有默认值的GlobalID字段的FieldDescription
FieldDescription globalIDFieldDescription = FieldDescription.CreateGlobalIDField();

// 这个静态辅助方法创建一个带有默认值的ObjectID字段的FieldDescription
FieldDescription objectIDFieldDescription = FieldDescription.CreateObjectIDField();

// 这个静态辅助方法为字符串字段创建一个FieldDescription
FieldDescription nameFieldDescription = FieldDescription.CreateStringField("Name", 255);

// 这个静态辅助方法为整数字段创建一个FieldDescription
FieldDescription populationFieldDescription = FieldDescription.CreateIntegerField("Population");

// 汇总所有字段描述的列表
List<FieldDescription> fieldDescriptions = new List<FieldDescription>()
{ globalIDFieldDescription, objectIDFieldDescription, nameFieldDescription, populationFieldDescription };

// 创建一个ShapeDescription对象
ShapeDescription shapeDescription = new ShapeDescription(GeometryType.Point, spatialReference);

// 或者,ShapeDescription可以从另一个要素类创建。在这种情况下,新的要素类将继承现有类的形状属性
ShapeDescription alternativeShapeDescription = new ShapeDescription(existingFeatureClass.GetDefinition());

// 创建一个描述要创建要素类的FeatureClassDescription对象
FeatureClassDescription featureClassDescription = 
    new FeatureClassDescription("Cities", fieldDescriptions, shapeDescription);

// 创建一个SchemaBuilder对象
SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 将Cities要素类的创建添加到我们的DDL任务列表中
schemaBuilder.Create(featureClassDescription);

// 执行DDL
bool success = schemaBuilder.Build();

// 检查错误信息
if (!success)
{
    IReadOnlyList<string> errorMessages = schemaBuilder.ErrorMessages;
    //等等
}

3 删除表

// 创建一个TableDescription对象
TableDescription tableDescription = new TableDescription(table.GetDefinition());

// 创建一个SchemaBuilder对象
SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 将表的删除添加到我们的DDL任务列表中
schemaBuilder.Delete(tableDescription);

// 执行DDL
bool success = schemaBuilder.Build();

4 删除要素类

// 创建一个FeatureClassDescription对象
FeatureClassDescription featureClassDescription = new FeatureClassDescription(featureClass.GetDefinition());

// 创建一个SchemaBuilder对象
SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 将要素类的删除添加到我们的DDL任务列表中
schemaBuilder.Delete(featureClassDescription);

// 执行DDL
bool success = schemaBuilder.Build();

5 打开内存地理数据库

// 连接到默认的内存地理数据库(如果存在),否则抛出异常
MemoryConnectionProperties memoryConnectionProperties = new MemoryConnectionProperties();

// 或者,连接到名为'InterimMemoryGeodatabase'的内存地理数据库
// MemoryConnectionProperties memoryConnectionProperties = new MemoryConnectionProperties("InterimMemoryGeodatabase");

// 打开内存地理数据库
using (Geodatabase geodatabase = new Geodatabase(memoryConnectionProperties))
{
    // 使用内存地理数据库
}

6 创建内存地理数据库

// 创建连接默认内存地理数据库的内存连接属性
MemoryConnectionProperties memoryConnectionProperties = new MemoryConnectionProperties();

// 或者创建连接名为'InterimMemoryGeodatabase'的内存地理数据库的内存连接属性
// MemoryConnectionProperties memoryConnectionProperties = new MemoryConnectionProperties("InterimMemoryGeodatabase");

// 创建并使用内存地理数据库
using (Geodatabase geodatabase = SchemaBuilder.CreateGeodatabase(memoryConnectionProperties))
{
    // 在这里创建额外的模式
}

7 删除内存地理数据库

// 创建连接默认内存地理数据库的内存连接属性
MemoryConnectionProperties memoryConnectionProperties = new MemoryConnectionProperties();

// 删除内存地理数据库
SchemaBuilder.DeleteGeodatabase(memoryConnectionProperties);

8 创建文件地理数据库

// 创建FileGeodatabaseConnectionPath,指定要创建的文件地理数据库名称
FileGeodatabaseConnectionPath fileGeodatabaseConnectionPath = 
    new FileGeodatabaseConnectionPath(new Uri(@"C:\Path-To-File-Geodatabase\YourName.gdb"));

// 创建并使用文件地理数据库
using (Geodatabase geodatabase = 
       SchemaBuilder.CreateGeodatabase(fileGeodatabaseConnectionPath))
{
    // 在这里创建额外的模式
}

9 删除文件地理数据库

// 创建FileGeodatabaseConnectionPath,指定要删除的文件地理数据库名称
FileGeodatabaseConnectionPath fileGeodatabaseConnectionPath = new FileGeodatabaseConnectionPath(new Uri(@"C:\Path-To-File-Geodatabase\YourName.gdb"));

// 删除文件地理数据库
SchemaBuilder.DeleteGeodatabase(fileGeodatabaseConnectionPath);

10 创建移动地理数据库

// 创建MobileGeodatabaseConnectionPath,指定要创建的移动地理数据库名称
MobileGeodatabaseConnectionPath mobileGeodatabaseConnectionPath = 
    new MobileGeodatabaseConnectionPath(new Uri(@"C:\Path-To-Mobile-Geodatabase\YourName.geodatabase"));

// 创建并使用移动地理数据库
using (Geodatabase geodatabase = SchemaBuilder.CreateGeodatabase(mobileGeodatabaseConnectionPath))
{
    // 在这里创建额外的模式
}

11 删除移动地理数据库

// 创建MobileGeodatabaseConnectionPath,指定要删除的移动地理数据库名称
MobileGeodatabaseConnectionPath mobileGeodatabaseConnectionPath = 
    new MobileGeodatabaseConnectionPath(new Uri(@"C:\Path-To-Mobile-Geodatabase\YourName.geodatabase"));

// 删除移动地理数据库
SchemaBuilder.DeleteGeodatabase(mobileGeodatabaseConnectionPath);

12 创建范围域

// 创建一个范围描述,最小值 = 0,最大值 = 1000
RangeDomainDescription rangeDomainDescriptionMinMax = new RangeDomainDescription("RangeDomain_0_1000",
                                                                                 FieldType.Integer, 0, 1000)
{ Description = "Domain value ranges from 0 to 1000" };

SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 创建范围域
schemaBuilder.Create(rangeDomainDescriptionMinMax);
schemaBuilder.Build();

13 创建编码值域

// 创建一个用于水管的编码值域描述
CodedValueDomainDescription codedValueDomainDescription = new CodedValueDomainDescription(
    "WaterPipeTypes", 
    FieldType.String,
    new SortedList<object, string> 
    {
        { "Copper", "C_1" },
        { "Steel", "S_2" } 
    })
{
    SplitPolicy = SplitPolicy.Duplicate,
    MergePolicy = MergePolicy.DefaultValue
};

SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 创建编码值域
CodedValueDomainToken codedValueDomainToken = schemaBuilder.Create(codedValueDomainDescription);
schemaBuilder.Build();

14 创建要素数据集

// 创建名为'Parcel_Information'的要素数据集

SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 创建名为'Parcel Information'的要素数据集
FeatureDatasetDescription featureDatasetDescription = 
    new FeatureDatasetDescription("Parcel_Information", SpatialReferences.WGS84);
schemaBuilder.Create(featureDatasetDescription);

// 构建状态
bool buildStatus = schemaBuilder.Build();

// 构建错误
if (!buildStatus)
{
    IReadOnlyList<string> errors = schemaBuilder.ErrorMessages;
}

15 删除要素数据集

// 删除名为'Parcel_Information'的要素数据集

FeatureDatasetDefinition featureDatasetDefinition = geodatabase.GetDefinition<FeatureDatasetDefinition>("Parcel_Information");
FeatureDatasetDescription featureDatasetDescription = 
    new FeatureDatasetDescription(featureDatasetDefinition);

SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 删除名为'Parcel_Information'的现有要素数据集
schemaBuilder.Delete(featureDatasetDescription);
schemaBuilder.Build();

16 重命名要素数据集

// 将一个要素数据集从 'Parcel_Information' 重命名为 'Parcel_Information_With_Tax_Jurisdiction'

string originalDatasetName = "Parcel_Information";
string datasetRenameAs = "Parcel_Information_With_Tax_Jurisdiction";

FeatureDatasetDefinition originalDatasetDefinition = 
    geodatabase.GetDefinition<FeatureDatasetDefinition>(originalDatasetName);
FeatureDatasetDescription originalFeatureDatasetDescription = 
    new FeatureDatasetDescription(originalDatasetDefinition);

SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 将现有的要素数据集 'Parcel_Information' 重命名为 'Parcel_Information_With_Tax_Jurisdiction'
schemaBuilder.Rename(originalFeatureDatasetDescription, datasetRenameAs);
schemaBuilder.Build();

17 在一次操作中创建具有要素类的要素数据集

// 在一次操作中创建一个名为 'Parcel_Information' 的要素数据集和一个名为 'Parcels' 的要素类

string featureDatasetName = "Parcel_Information";
string featureClassName = "Parcels";

SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 创建一个要素数据集令牌
FeatureDatasetDescription featureDatasetDescription = new FeatureDatasetDescription(featureDatasetName, SpatialReferences.WGS84);
FeatureDatasetToken featureDatasetToken = schemaBuilder.Create(featureDatasetDescription);

// 创建一个要素类描述
FeatureClassDescription featureClassDescription = new FeatureClassDescription(
    featureClassName,
    new List<FieldDescription>()
    {
        new FieldDescription("Id", FieldType.Integer),
        new FieldDescription("Address", FieldType.String)
    },
    new ShapeDescription(GeometryType.Point, SpatialReferences.WGS84));

// 在要素数据集中创建一个要素类
FeatureClassToken featureClassToken = schemaBuilder.Create(new FeatureDatasetDescription(featureDatasetToken), featureClassDescription);

// 构建状态
bool buildStatus = schemaBuilder.Build();

// 构建错误
if (!buildStatus)
{
    IReadOnlyList<string> errors = schemaBuilder.ErrorMessages;
}

18 在现有要素数据集中创建要素类

// 在现有名为 'Parcels_Information' 的要素数据集中创建一个名为 'Tax_Jurisdiction' 的要素类
string featureDatasetName = "Parcels_Information";
string featureClassName = "Tax_Jurisdiction";

// 创建一个要素类描述
FeatureClassDescription featureClassDescription = new FeatureClassDescription(
    featureClassName,
    new List<FieldDescription>()
    {
        new FieldDescription("Tax_Id", FieldType.Integer),
        new FieldDescription("Address", FieldType.String)
    },
    new ShapeDescription(GeometryType.Point, SpatialReferences.WGS84));

FeatureDatasetDefinition featureDatasetDefinition = geodatabase.GetDefinition<FeatureDatasetDefinition>(featureDatasetName);

SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 使用FeatureDatasetDefinition在FeatureDataset中创建一个FeatureClass
schemaBuilder.Create(new FeatureDatasetDescription(featureDatasetDefinition), featureClassDescription);

// 构建状态
bool buildStatus = schemaBuilder.Build();

// 构建错误
if (!buildStatus)
{
    IReadOnlyList<string> errors = schemaBuilder.ErrorMessages;
}

19 将要素类添加到要素数据集

// 将一个名为 'Tax_Jurisdiction' 的要素类添加到一个名为 'Parcels_Information' 的要素数据集中

string featureDatasetName = "Parcels_Information";
string featureClassNameToAdd = "Tax_Jurisdiction";

FeatureDatasetDefinition featureDatasetDefinition = geodatabase.GetDefinition<FeatureDatasetDefinition>(featureDatasetName);
FeatureDatasetDescription featureDatasetDescription = new FeatureDatasetDescription(featureDatasetDefinition);

FeatureClassDefinition featureClassDefinition = geodatabase.GetDefinition<FeatureClassDefinition>(featureClassNameToAdd);
FeatureClassDescription featureClassDescription = new FeatureClassDescription(featureClassDefinition);

SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 将 'Tax_Jurisdiction' 要素类添加到 'Parcels_Information' 要素数据集中
schemaBuilder.AddFeatureClass(featureDatasetDescription, featureClassDescription);
bool addStatus = schemaBuilder.Build();

if (!addStatus)
{
    IReadOnlyList<string> errors = schemaBuilder.ErrorMessages;
}

20 重命名表

// 将一个表从 'Original_Table' 重命名为 'Renamed_Table'

string tableToBeRenamed = "Original_Table";
string tableRenameAs = "Renamed_Table";

TableDefinition tableDefinition = geodatabase.GetDefinition<TableDefinition>(tableToBeRenamed);

SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 表重命名
schemaBuilder.Rename(new TableDescription(tableDefinition), tableRenameAs);
schemaBuilder.Build();

21 向要素类添加字段

// 向 'Parcels' 要素类添加以下字段
// 全局 ID
// Parcel_ID
// Tax_Code
// Parcel_Address

// 要添加字段的要素类
string featureClassName = "Parcels";

FeatureClassDefinition originalFeatureClassDefinition = geodatabase.GetDefinition<FeatureClassDefinition>(featureClassName);
FeatureClassDescription originalFeatureClassDescription = new 
    FeatureClassDescription(originalFeatureClassDefinition);

// 向 'Parcels' 要素类添加的四个新字段
FieldDescription globalIdField = FieldDescription.CreateGlobalIDField();
FieldDescription parcelIdDescription = new FieldDescription("Parcel_ID", FieldType.GUID);
FieldDescription taxCodeDescription = FieldDescription.CreateIntegerField("Tax_Code");
FieldDescription addressDescription = FieldDescription.CreateStringField("Parcel_Address", 150);

List<FieldDescription> fieldsToAdd = new List<FieldDescription> 
{ 
    globalIdField, parcelIdDescription,
    taxCodeDescription, addressDescription 
};

// 将新字段添加到新的 FieldDescription 列表中
List<FieldDescription> modifiedFieldDescriptions = new List<FieldDescription>(originalFeatureClassDescription.FieldDescriptions);
modifiedFieldDescriptions.AddRange(fieldsToAdd);

// 带有附加字段的新 FeatureClassDescription
FeatureClassDescription modifiedFeatureClassDescription = new FeatureClassDescription(
    originalFeatureClassDescription.Name,
    modifiedFieldDescriptions, 
    originalFeatureClassDescription.ShapeDescription);

SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 用新添加的字段更新 'Parcels' 要素类
schemaBuilder.Modify(modifiedFeatureClassDescription);
bool modifyStatus = schemaBuilder.Build();

if (!modifyStatus)
{
    IReadOnlyList<string> errors = schemaBuilder.ErrorMessages;
}

22 添加使用域的字段

// 添加一个名为“PipeType”的字段,该字段使用编码值域到“Pipes”要素类

// 要添加字段的要素类
string featureClassName = "Pipes";

SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 创建一个水管的编码值域描述
CodedValueDomainDescription pipeDomainDescription = new CodedValueDomainDescription(
    "WaterPipeTypes", FieldType.String,
    new SortedList<object, string> {
        { "Copper", "C_1" },
        { "Steel", "S_2" }
    })
{
    SplitPolicy = SplitPolicy.Duplicate,
    MergePolicy = MergePolicy.DefaultValue
};

// 创建一个编码值域令牌
CodedValueDomainToken codedValueDomainToken = schemaBuilder.Create(pipeDomainDescription);

// 从域令牌创建一个新的描述
CodedValueDomainDescription codedValueDomainDescription = new CodedValueDomainDescription(codedValueDomainToken);

// 使用域描述创建一个名为“PipeType”的字段
FieldDescription domainFieldDescription = new FieldDescription("PipeType", FieldType.String)
{ DomainDescription = codedValueDomainDescription };

//检索“Pipes”要素类的现有信息
FeatureClassDefinition originalFeatureClassDefinition = geodatabase.GetDefinition<FeatureClassDefinition>(featureClassName);
FeatureClassDescription originalFeatureClassDescription = 
    new FeatureClassDescription(originalFeatureClassDefinition);

// 将域字段添加到现有字段中
List<FieldDescription> modifiedFieldDescriptions = new List<FieldDescription>(originalFeatureClassDescription.FieldDescriptions) { domainFieldDescription };

// 创建一个带有更新字段的“Pipes”要素类的新描述
FeatureClassDescription featureClassDescription = 
    new FeatureClassDescription(originalFeatureClassDescription.Name, modifiedFieldDescriptions,
                                originalFeatureClassDescription.ShapeDescription);

// 使用域字段更新“Pipes”要素类
schemaBuilder.Modify(featureClassDescription);

// 构建状态
bool buildStatus = schemaBuilder.Build();

// 构建错误
if (!buildStatus)
{
    IReadOnlyList<string> errors = schemaBuilder.ErrorMessages;
}

23 从表中删除字段

// 从“Parcels”表中删除所有字段,保留以下字段
// Tax_Code
// Parcel_Address

// 要删除字段的表
string tableName = "Parcels";

TableDefinition tableDefinition = geodatabase.GetDefinition<TableDefinition>(tableName);
IReadOnlyList<Field> fields = tableDefinition.GetFields();

// 从“Parcels”表中获取现有字段
Field taxCodeField = fields.First(f => f.Name.Equals("Tax_Code"));
Field parcelAddressField = fields.First(f => f.Name.Equals("Parcel_Address"));

FieldDescription taxFieldDescription = new FieldDescription(taxCodeField);
FieldDescription parcelAddressFieldDescription = new FieldDescription(parcelAddressField);

// 修改后的表中要保留的字段
List<FieldDescription> fieldsToBeRetained = new List<FieldDescription>()
{
    taxFieldDescription, parcelAddressFieldDescription
};

// 包含“Tax_Code”和“Parcel_Address”字段的“Parcels”表的新描述
TableDescription modifiedTableDescription = new TableDescription(tableName, fieldsToBeRetained);

SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 删除除“Tax_Code”和“Parcel_Address”字段外的所有字段
schemaBuilder.Modify(modifiedTableDescription);
schemaBuilder.Build();

24 创建注记要素类

// 创建一个名为“Cities”的注记要素类
// 包含以下用户定义字段
// Name 
// GlobalID

// 注记要素类名称
string annotationFeatureClassName = "CitiesAnnotation";

// 为注记要素类创建用户定义的属性字段 
FieldDescription globalIDFieldDescription = FieldDescription.CreateGlobalIDField();
FieldDescription nameFieldDescription = FieldDescription.CreateStringField("Name", 255);

// 创建所有字段描述的列表
List<FieldDescription> fieldDescriptions = new List<FieldDescription> { globalIDFieldDescription, nameFieldDescription };

// 创建一个ShapeDescription对象
ShapeDescription shapeDescription = new ShapeDescription(GeometryType.Polygon, spatialReference);

// 为Maplex引擎创建常规放置属性
CIMMaplexGeneralPlacementProperties generalPlacementProperties =
    new CIMMaplexGeneralPlacementProperties
{
    AllowBorderOverlap = true,
    PlacementQuality = MaplexQualityType.High,
    DrawUnplacedLabels = true,
    InvertedLabelTolerance = 1.0,
    RotateLabelWithDisplay = true,
    UnplacedLabelColor = new CIMRGBColor
    {
        R = 0,
        G = 255,
        B = 0,
        Alpha = 0.5f // 绿色
    }
};

// 为标准引擎创建常规放置属性

//CIMStandardGeneralPlacementProperties generalPlacementProperties =
//  new CIMStandardGeneralPlacementProperties
//  {
//    DrawUnplacedLabels = true,
//    InvertedLabelTolerance = 3.0,
//    RotateLabelWithDisplay = true,
//    UnplacedLabelColor = new CIMRGBColor
//    {
//      R = 255, G = 0, B = 0, Alpha = 0.5f // 红色
//    } 
//   };


// 创建注记标签类
// 绿色标签
CIMLabelClass greenLabelClass = new CIMLabelClass
{
    Name = "Green",
    ExpressionTitle = "Expression-Green",
    ExpressionEngine = LabelExpressionEngine.Arcade,
    Expression = "$feature.OBJECTID",
    ID = 1,
    Priority = 0,
    Visibility = true,
    TextSymbol = new CIMSymbolReference
    {
        Symbol = new CIMTextSymbol()
        {
            Angle = 45,
            FontType = FontType.Type1,
            FontFamilyName = "Tahoma",
            FontEffects = FontEffects.Normal,
            HaloSize = 2.0,

            Symbol = new CIMPolygonSymbol
            {
                SymbolLayers = new CIMSymbolLayer[]
                {
                    new CIMSolidFill
                    {
                        Color = CIMColor.CreateRGBColor(0, 255, 0)
                    }
                },
                UseRealWorldSymbolSizes = true
            }
        },
        MaxScale = 0,
        MinScale = 0,
        SymbolName = "TextSymbol-Green"
    },
    StandardLabelPlacementProperties = new CIMStandardLabelPlacementProperties
    {
        AllowOverlappingLabels = true,
        LineOffset = 1.0
    },
    MaplexLabelPlacementProperties = new CIMMaplexLabelPlacementProperties
    {
        AlignLabelToLineDirection = true,
        AvoidPolygonHoles = true
    }
};

// 蓝色标签
CIMLabelClass blueLabelClass = new CIMLabelClass
{
    Name = "Blue",
    ExpressionTitle = "Expression-Blue",
    ExpressionEngine = LabelExpressionEngine.Arcade,
    Expression = "$feature.OBJECTID",
    ID = 2,
    Priority = 0,
    Visibility = true,
    TextSymbol = new CIMSymbolReference
    {
        Symbol = new CIMTextSymbol()
        {
            Angle = 45,
            FontType = FontType.Type1,
            FontFamilyName = "Consolas",
            FontEffects = FontEffects.Normal,
            HaloSize = 2.0,

            Symbol = new CIMPolygonSymbol
            {
                SymbolLayers = new CIMSymbolLayer[]
                {
                    new CIMSolidFill
                    {
                        Color = CIMColor.CreateRGBColor(0, 0, 255)
                    }
                },
                UseRealWorldSymbolSizes = true
            }
        },
        MaxScale = 0,
        MinScale = 0,
        SymbolName = "TextSymbol-Blue"
    },
    StandardLabelPlacementProperties = new CIMStandardLabelPlacementProperties
    {
        AllowOverlappingLabels = true,
        LineOffset = 1.0
    },
    MaplexLabelPlacementProperties = new CIMMaplexLabelPlacementProperties
    {
        AlignLabelToLineDirection = true,
        AvoidPolygonHoles = true
    }
};

// 创建标签列表
List<CIMLabelClass> labelClasses = new List<CIMLabelClass> { greenLabelClass, blueLabelClass };

// 创建注记要素类描述对象以描述要创建的要素类
AnnotationFeatureClassDescription annotationFeatureClassDescription =
    new AnnotationFeatureClassDescription(annotationFeatureClassName, fieldDescriptions, shapeDescription,
                                          generalPlacementProperties, labelClasses)
{
    IsAutoCreate = true,
    IsSymbolIDRequired = false,
    IsUpdatedOnShapeChange = true
};

// 创建一个SchemaBuilder对象
SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 将创建Cities注记要素类的操作添加到DDL任务列表中
schemaBuilder.Create(annotationFeatureClassDescription);

// 执行DDL
bool success = schemaBuilder.Build();

// 检查错误消息
if (!success)
{
    IReadOnlyList<string> errorMessages = schemaBuilder.ErrorMessages;
    //等。
}

25 创建关联要素的注记要素类

// 在供水网络中创建水管和阀门之间的关联注记要素类
// 包含以下用户定义字段
// PipeName 
// GlobalID

// 注记要素类名称
string annotationFeatureClassName = "WaterPipeAnnotation";

// 为注记要素类创建用户定义的属性字段
FieldDescription pipeGlobalID = FieldDescription.CreateGlobalIDField();
FieldDescription nameFieldDescription = FieldDescription.CreateStringField("Name", 255);

// 创建所有字段描述的列表
List<FieldDescription> fieldDescriptions = new List<FieldDescription> { pipeGlobalID, nameFieldDescription };

// 创建一个ShapeDescription对象
ShapeDescription shapeDescription = new ShapeDescription(GeometryType.Polygon, spatialReference);

// 为Maplex引擎创建常规放置属性
CIMMaplexGeneralPlacementProperties generalPlacementProperties = new CIMMaplexGeneralPlacementProperties
{
    AllowBorderOverlap = true,
    PlacementQuality = MaplexQualityType.High,
    DrawUnplacedLabels = true,
    InvertedLabelTolerance = 1.0,
    RotateLabelWithDisplay = true,
    UnplacedLabelColor = new CIMRGBColor
    {
        R = 255,
        G = 0,
        B = 0,
        Alpha = 0.5f
    }
};

// 创建注记标签类
// 绿色标签
CIMLabelClass greenLabelClass = new CIMLabelClass
{
    Name = "Green",
    ExpressionTitle = "Expression-Green",
    ExpressionEngine = LabelExpressionEngine.Arcade,
    Expression = "$feature.OBJECTID",
    ID = 1,
    Priority = 0,
    Visibility = true,
    TextSymbol = new CIMSymbolReference
    {
        Symbol = new CIMTextSymbol()
        {
            Angle = 45,
            FontType = FontType.Type1,
            FontFamilyName = "Tahoma",
            FontEffects = FontEffects.Normal,
            HaloSize = 2.0,

            Symbol = new CIMPolygonSymbol
            {
                SymbolLayers = new CIMSymbolLayer[]
                {
                    new CIMSolidFill
                    {
                        Color = CIMColor.CreateRGBColor(0, 255, 0)
                    }
                },
                UseRealWorldSymbolSizes = true
            }
        },
        MaxScale = 0,
        MinScale = 0,
        SymbolName = "TextSymbol-Green"
    },
    StandardLabelPlacementProperties = new CIMStandardLabelPlacementProperties
    {
        AllowOverlappingLabels = true,
        LineOffset = 1.0
    },
    MaplexLabelPlacementProperties = new CIMMaplexLabelPlacementProperties
    {
        AlignLabelToLineDirection = true,
        AvoidPolygonHoles = true
    }
};

// 蓝色标签
CIMLabelClass blueLabelClass = new CIMLabelClass
{
    Name = "Blue",
    ExpressionTitle = "Expression-Blue",
    ExpressionEngine = LabelExpressionEngine.Arcade,
    Expression = "$feature.OBJECTID",
    ID = 2,
    Priority = 0,
    Visibility = true,
    TextSymbol = new CIMSymbolReference
    {
        Symbol = new CIMTextSymbol()
        {
            Angle = 45,
            FontType = FontType.Type1,
            FontFamilyName = "Consolas",
            FontEffects = FontEffects.Normal,
            HaloSize = 2.0,

            Symbol = new CIMPolygonSymbol
            {
                SymbolLayers = new CIMSymbolLayer[]
                {
                    new CIMSolidFill
                    {
                        Color = CIMColor.CreateRGBColor(0, 0, 255)
                    }
                },
                UseRealWorldSymbolSizes = true
            }
        },
        MaxScale = 0,
        MinScale = 0,
        SymbolName = "TextSymbol-Blue"
    },
    StandardLabelPlacementProperties = new CIMStandardLabelPlacementProperties
    {
        AllowOverlappingLabels = true,
        LineOffset = 1.0
    },
    MaplexLabelPlacementProperties = new CIMMaplexLabelPlacementProperties
    {
        AlignLabelToLineDirection = true,
        AvoidPolygonHoles = true
    }
};

// 创建标签列表
List<CIMLabelClass> labelClasses = new List<CIMLabelClass> { greenLabelClass, blueLabelClass };


// 创建关联要素描述
// 关联要素类名称
string linkedFeatureClassName = "WaterPipe";

// 为水管创建字段
FieldDescription waterPipeGlobalID = FieldDescription.CreateGlobalIDField();
FieldDescription pipeName = FieldDescription.CreateStringField("PipeName", 255);

// 创建水管字段描述的列表
List<FieldDescription> pipeFieldDescriptions = new List<FieldDescription> { waterPipeGlobalID, pipeName };

// 创建关联要素类描述
FeatureClassDescription linkedFeatureClassDescription = new FeatureClassDescription(linkedFeatureClassName, pipeFieldDescriptions,
                                                                                    new ShapeDescription(GeometryType.Polyline, spatialReference));

// 创建一个SchemaBuilder对象
SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 将创建关联要素类的操作添加到DDL任务列表中
FeatureClassToken linkedFeatureClassToken = schemaBuilder.Create(linkedFeatureClassDescription);

// 创建一个注记要素类描述对象以描述要创建的要素类
AnnotationFeatureClassDescription annotationFeatureClassDescription =
    new AnnotationFeatureClassDescription(annotationFeatureClassName, fieldDescriptions, shapeDescription,
                                          generalPlacementProperties, labelClasses, new FeatureClassDescription(linkedFeatureClassToken))
{
    IsAutoCreate = true,
    IsSymbolIDRequired = false,
    IsUpdatedOnShapeChange = true
};

// 将创建注记要素类的操作添加到DDL任务列表中
schemaBuilder.Create(annotationFeatureClassDescription);

// 执行DDL
bool success = schemaBuilder.Build();

// 检查错误消息
if (!success)
{
    IReadOnlyList<string> errorMessages = schemaBuilder.ErrorMessages;
    //等。
}

26 在要素数据集内创建注记要素类

// 在Places要素数据集中使用现有注记要素类创建Cities注记要素类

// 要素数据集名称
string featureDatasetName = "Places";

// 注记要素类名称
string annotationFeatureClassName = "CitiesAnnotation";

// 创建一个SchemaBuilder对象
SchemaBuilder schemaBuilder = new SchemaBuilder(geodatabase);

// 打开现有的注记要素类
using (AnnotationFeatureClass existingAnnotationFeatureClass = geodatabase.OpenDataset<AnnotationFeatureClass>("ExistingAnnotationFeatureClass"))
{

    // 创建要素数据集描述
    FeatureDatasetDescription featureDatasetDescription = 
        new FeatureDatasetDescription(featureDatasetName, existingAnnotationFeatureClass.GetDefinition().GetSpatialReference());

    // 将创建Places数据集的操作添加到DDL任务中
    FeatureDatasetToken featureDatasetToken = schemaBuilder.Create(featureDatasetDescription);

    // 使用现有注记要素类创建注记要素类描述
    AnnotationFeatureClassDescription annotationFeatureClassDescription = new AnnotationFeatureClassDescription(annotationFeatureClassName, existingAnnotationFeatureClass.GetDefinition())
    {
        IsAutoCreate = true,
        IsSymbolIDRequired = false,
        IsUpdatedOnShapeChange = true
    };

    // 将创建Cities注记要素类的操作添加到Places要素数据集中
    schemaBuilder.Create(new FeatureDatasetDescription(featureDatasetToken), annotationFeatureClassDescription);

    // 执行DDL
    bool success = schemaBuilder.Build();

    // 检查错误消息
    if (!success)
    {
        IReadOnlyList<string> errorMessages = schemaBuilder.ErrorMessages;
        //等。
    }
}
;