GDAL C++ API 学习之路 (6) Dataset篇 代码示例 翻译 自学

GetNextFeature

virtual OGRFeature *GetNextFeatureOGRLayer **ppoBelongingLayer, double *pdfProgressPct, GDALProgressFunc pfnProgress, void *pProgressData)

从此数据集中获取下一个可用要素

参数:

  • ppoBelongingLayer -- 指向 OGRLayer* 变量的指针,用于接收对象所属的层或 NULL。尽管特征不是 NULL,但 *ppoBelongingLayer 的输出可能是 NULL。

  • pdfProgressPct -- 指向双精度变量的指针,用于接收进度百分比(在 [0,1] 范围内)或 NULL。返回时,如果无法确定进度,则指向值可能为负数。

  • pfnProgress -- 用于报告进度的进度回调(对于可能持续时间较长的 GetNextFeature() 调用)并提供取消可能性或 NULL。

  • pProgressData -- 提供给 pfnProgress 或 NULL 的用户数据

返回:  一个功能,如果没有其他功能可用,则为 NULL

GDALDataset* poDataset = (GDALDataset*)GDALOpenEx("your_dataset_file_path", GDAL_OF_VECTOR, NULL, NULL, NULL); 

// 定义变量存储获取的要素和进度
    OGRFeature* poFeature;
    OGRLayer* pBelongingLayer;
    double dfProgressPct;
    GDALProgressFunc pfnProgress = GDALTermProgress;
    void* pProgressData = NULL;

// 遍历数据集中的所有要素
    while ((poFeature = poDataset->GetNextFeature(&pBelongingLayer, &dfProgressPct, pfnProgress, pProgressData)) != NULL)
    {
        // 处理要素,例如获取属性值等操作

        // 释放要素
        OGRFeature::DestroyFeature(poFeature);
    }

    // 关闭数据集
    GDALClose(poDataset);

GetFeatures

Features GetFeatures()

在数据集图层中的要素上返回可迭代对象的函数

// 假设Features是一个包含特征图层和特征的容器类型的类型别名
using Features = std::vector<std::pair<OGRLayer*, OGRFeature*>>;

// 获取Features对象,其中包含了特征图层和特征的信息
Features features = poDS->GetFeatures();

for( auto&& oFeatureLayerPair: poDS->GetFeatures() )
{
      std::cout << "Feature of layer " <<
              oFeatureLayerPair.layer->GetName() << std::endl;
      oFeatureLayerPair.feature->DumpReadable();
}

TestCapability

virtual int TestCapabilityconst char*)

测试功能是否可用

可以将以下数据集功能名称之一传递到此方法中,并将返回 TRUE 或 FALSE 值,指示该功能是否可用于此对象。

  • ODsCCreateLayer:如果此数据源可以创建新图层,则为 True。

  • ODsCDeleteLayer:如果此数据源可以删除现有图层,则为 True。

  • ODsCCreateGeomFieldAfterCreateLayer:如果此数据源的层在创建层后支持 CreateGeomField(),则为 True。

  • ODsCCurve几何:如果此数据源支持曲线几何,则为 True。

  • ODsCTransactions:如果此数据源支持(高效)事务,则为 True。

  • ODsCEmulatedTransactions:如果此数据源支持通过仿真进行事务,则为 true。

  • ODsCRandomLayerRead:如果此数据源具有专用的 GetNextFeature() 实现,则为 True,可能以非顺序方式从层返回特征。

  • ODsCRandomLayerWrite:如果此数据源支持以非顺序方式在层上调用 CreateFeature(),则为 True。

参数:

pszCap -- 测试能力。

返回: 如果功能可用,则为 TRUE,否则为 FALSE

// 打开数据源
    GDALDataset* poDataset = (GDALDataset*)GDALOpenEx("your_dataset_file_path", GDAL_OF_VECTOR, NULL, NULL, NULL);

    // 测试数据源是否支持写入能力
    if (poDataset->TestCapability(ODsCCreateLayer) == TRUE)
    {
        std::cout << "Dataset supports creating layers." << std::endl;
    }
    else
    {
        std::cout << "Dataset does not support creating layers." << std::endl;
    }

    // 关闭数据源
    GDALClose(poDataset);

GetFieldDomainNames

virtual std::vector<std::string> GetFieldDomainNames(CSLConstList papszOptions = NULLPTR) const

返回数据集中存储的所有字段属性域的名称列表

参数:

papszOptions -- 确定应如何检索属性的特定于驱动程序的选项。传递默认行为的空点。

返回:  字段域名列表

    // 打开数据源
    GDALDataset* poDataset = (GDALDataset*)GDALOpenEx("your_dataset_file_path", GDAL_OF_VECTOR, NULL, NULL, NULL);

     // 获取所有字段属性域的名称列表
    std::vector<std::string> fieldDomainNames;
    fieldDomainNames = poDataset->GetFieldDomainNames();

    // 输出域名称列表
    std::cout << "Field Domains: ";
    for (const std::string& domainName : fieldDomainNames)
    {
        std::cout << domainName << ", ";
    }
    std::cout << std::endl;

    // 关闭数据源
    GDALClose(poDataset);

GetFieldDomain

virtual const OGRFieldDomain *GetFieldDomain(const std::string &name) const

从字段名称中获取字段域

// 打开数据集
    GDALAllRegister();
    GDALDataset* dataset = static_cast<GDALDataset*>(GDALOpen("path_to_your_dataset", GA_ReadOnly));

    // 获取指定字段的域信息
    std::string fieldName = "your_field_name"; // 替换为你想查询的字段名
    const OGRFieldDomain* fieldDomain = dataset->GetFieldDomain(fieldName);

    if (fieldDomain == nullptr)
    {
        // 如果字段没有定义域,返回空指针
        std::cout << "Field '" << fieldName << "' has no domain defined." << std::endl;
    }

AddFieldDomain

virtual bool AddFieldDomain(std::unique_ptr<OGRFieldDomain> &&domain, std::string &failureReason)

将字段属性域添加到数据集

参数:

  • domain -- 域定义。

  • failureReason -- 输出参数。如果发生错误,将包含错误消息。

返回:  在成功的情况下为TURE

    GDALDataset* dataset = static_cast<GDALDataset*>(GDALOpen("path_to_your_dataset", GA_Update));

    // 创建字段属性域对象
    std::unique_ptr<OGRFieldDomain> domain = std::make_unique<OGRFieldDomain>();

    // 设置字段属性域信息
    domain->SetName("your_domain_name"); // 替换为您要设置的域名称
    domain->SetType(OFTInteger); // 替换为您要设置的域类型,这里设置为整数类型
    domain->SetMin("1"); // 替换为您要设置的最小值
    domain->SetMax("10"); // 替换为您要设置的最大值

    // 添加字段属性域到数据集
    std::string failureReason;
    bool success = dataset->AddFieldDomain(std::move(domain), failureReason);

    if (success)
    {
        std::cout << "Field domain added successfully." << std::endl;
    }
    else
    {
        std::cout << "Failed to add field domain. Reason: " << failureReason << std::endl;
    }

DeleteFieldDomain

virtual bool DeleteFieldDomain(const std::string &name, std::string &failureReason)

从数据集中移除字段属性域

参数:

  • domain -- 域名。

  • failureReason -- 输出参数。如果发生错误,将包含错误消息。

返回:  在成功的情况下为TURE

    // 打开数据集
    GDALAllRegister();
    GDALDataset* dataset = static_cast<GDALDataset*>(GDALOpen("path_to_your_dataset", GA_Update));

    // 要移除的字段属性域的名称
    std::string fieldName = "your_domain_name"; // 替换为您要移除的字段属性域的名称

    // 移除字段属性域从数据集
    std::string failureReason;
    bool success = dataset->DeleteFieldDomain(fieldName, failureReason);

    if (success)
    {
        std::cout << "Field domain '" << fieldName << "' removed successfully." << std::endl;
    }
    else
    {
        std::cout << "Failed to remove field domain. Reason: " << failureReason << std::endl;
    }

    // 释放资源并关闭数据集
    GDALClose(dataset);



UpdateFieldDomain

virtual bool UpdateFieldDomain(std::unique_ptr<OGRFieldDomain> &&domain, std::string &failureReason)

通过替换现有字段属性域的定义来更新其定义

参数:

  • domain -- 域名。

  • failureReason -- 输出参数。如果发生错误,将包含错误消息。

返回:  在成功的情况下为TURE

    GDALDataset* dataset = static_cast<GDALDataset*>(GDALOpen("path_to_your_dataset", GA_Update));

    // 创建字段属性域对象并设置要更新的信息
    std::unique_ptr<OGRFieldDomain> domain = std::make_unique<OGRFieldDomain>();
    domain->SetName("your_domain_name"); // 替换为您要更新的字段属性域的名称
    domain->SetType(OFTInteger); // 替换为您要更新的域类型,这里设置为整数类型
    domain->SetMin("5"); // 替换为您要更新的最小值
    domain->SetMax("20"); // 替换为您要更新的最大值

    // 更新字段属性域信息
    std::string failureReason;
    bool success = dataset->UpdateFieldDomain(std::move(domain), failureReason);

    if (success)
    {
        std::cout << "Field domain updated successfully." << std::endl;
    }
    else
    {
        std::cout << "Failed to update field domain. Reason: " << failureReason << std::endl;
    }

GetRelationshipNames

virtual std::vector<std::string> GetRelationshipNames(CSLConstList papszOptions = NULLPTR) const

返回数据集中存储的所有关系的名称列表

参数:

papszOptions -- 确定应如何检索关系的驱动程序特定选项。传递默认行为的空点。

返回:  关系名称列表

    // 获取数据集中所有关系的名称列表
    std::vector<std::string> relationshipNames = dataset->GetRelationshipNames();

    // 输出关系的名称列表
    if (!relationshipNames.empty())
    {
        std::cout << "Relationship names in the dataset:" << std::endl;
        for (const auto& relationshipName : relationshipNames)
        {
            std::cout << "  " << relationshipName << std::endl;
        }
    }
    else
    {
        std::cout << "No relationships found in the dataset." << std::endl;
    }

GetRelations

virtual const GDALRelationship *GetRelations(const std::string &name) const

从其名称中获取关系

返回:  返回关系,如果未找到,则为 nullPTR

    // 要获取的关系的名称
    std::string relationshipName = "your_relationship_name"; // 替换为您要获取的关系的名称

    // 获取指定名称的关系的信息
    const GDALRelationship* relationship = dataset->GetRelations(relationshipName);

    if (relationship != nullptr)
    {
        // 输出关系的信息
        std::cout << "Relationship Name: " << relationship->GetName() << std::endl;
        std::cout << "Source Dataset: " << relationship->GetSourceDataset() << std::endl;
        std::cout << "Target Dataset: " << relationship->GetTargetDataset() << std::endl;
        // 可以根据需要获取其他关系信息
    }
    else
    {
        std::cout << "Relationship with name '" << relationshipName << "' not found in the dataset." << std::endl;
    }

AddRelationship

virtual bool AddRelationship(std::unique_ptr<GDALRelationship> &&relationship, std::string &failureReason)

向数据集添加关系

参数:

  • relationship -- 关系定义

  • failureReason -- 输出参数。如果发生错误,将包含错误消息

返回:  在成功的情况下为TURE

    // 创建关系对象并设置要添加的信息
    std::unique_ptr<GDALRelationship> relationship = std::make_unique<GDALRelationship>();
    relationship->SetName("your_relationship_name"); // 替换为您要添加的关系的名称
    relationship->SetSourceDataset("source_dataset_name"); // 替换为源数据集的名称
    relationship->SetTargetDataset("target_dataset_name"); // 替换为目标数据集的名称
    // 可以根据需要设置其他关系信息

    // 向数据集添加关系
    std::string failureReason;
    bool success = dataset->AddRelationship(std::move(relationship), failureReason);

    if (success)
    {
        std::cout << "Relationship added successfully." << std::endl;
    }
    else
    {
        std::cout << "Failed to add relationship. Reason: " << failureReason << std::endl;
    }

DeleteRelationship

virtual bool DeleteRelationship(const std::string &name, std::string &failureReason)

从数据集中删除关系

参数:

  • name -- 关系名称

  • failureReason -- 输出参数。如果发生错误,将包含错误消息

返回:  在成功的情况下为TURE

    // 要删除的关系的名称
    std::string relationshipName = "your_relationship_name"; // 替换为您要删除的关系的名称

    // 从数据集中删除指定名称的关系
    std::string failureReason;
    bool success = dataset->DeleteRelationship(relationshipName, failureReason);

    if (success)
    {
        std::cout << "Relationship '" << relationshipName << "' deleted successfully." << std::endl;
    }
    else
    {
        std::cout << "Failed to delete relationship. Reason: " << failureReason << std::endl;
    }

UpdateRelationship

virtual bool UpdateRelationship(std::unique_ptr<GDALRelationship> &&relationship, std::string &failureReason)

通过替换现有关系的定义来更新现有关系        将替换具有匹配名称的现有关系

参数:

  • relationship -- 关系定义

  • failureReason -- 输出参数。如果发生错误,将包含错误消息

返回:  在成功的情况下为TURE

    // 创建关系对象并设置要更新的信息
    std::unique_ptr<GDALRelationship> relationship = std::make_unique<GDALRelationship>();
    relationship->SetName("your_relationship_name"); // 替换为您要更新的关系的名称
    relationship->SetSourceDataset("new_source_dataset_name"); // 替换为新的源数据集的名称
    relationship->SetTargetDataset("new_target_dataset_name"); // 替换为新的目标数据集的名称
    // 可以根据需要设置其他关系信息

    // 更新数据集中现有关系的信息
    std::string failureReason;
    bool success = dataset->UpdateRelationship(std::move(relationship), failureReason);

    if (success)
    {
        std::cout << "Relationship updated successfully." << std::endl;
    }
    else
    {
        std::cout << "Failed to update relationship. Reason: " << failureReason << std::endl;
    }

猜你喜欢

转载自blog.csdn.net/qq_69574549/article/details/132040078