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

CreateLayer

virtual OGRLayer *CreateLayer(const char *pszName, OGRSpatialReference *poSpatialRef = nullptrOGRwkbGeometryType eGType = wkbUnknown, char **papszOptions = nullptr)

此方法尝试在数据集上创建一个具有指定名称、坐标系、几何类型的新图层

参数:

  • pszName -- 新图层的名称。理想情况下,这应该与数据源上的任何现有层都不匹配。

  • poSpatialRef -- 用于新图层的坐标系,如果没有可用的坐标系,则为 NULL。驱动程序可能只增加对象的引用计数器来获取所有权,而不是创建完整副本,因此不要使用 OSRDestroySpatialReference(),而是在完成对象后使用 OSRRelease()。

  • eGType -- 图层的几何类型。如果对要写入的类型几何图形没有约束,请使用 wkbUnknown。

  • papszOptions -- 名称=值选项的字符串列表。选项特定于驱动程序。

返回: 失败时返回 NULL,成功时返回新的 OGRLayer 句柄

    // 创建图层
    const char* layerName = "new_layer"; // 替换为您要创建的图层名称
    OGRSpatialReference* spatialRef = nullptr; // 替换为您要设置的空间参考信息,这里为nullptr表示使用默认的空间参考
    OGRwkbGeometryType geometryType = wkbPoint; // 替换为您要设置的几何对象类型,这里设置为点类型
    char** options = nullptr; // 替换为您要设置的图层选项

    OGRLayer* layer = dataset->CreateLayer(layerName, spatialRef, geometryType, options);
    if (layer == nullptr)
    {
        // 处理图层创建失败的情况
        GDALClose(dataset);
        return 1;
    }

    // 在这里可以添加要素和属性信息到图层

CopyLayer

virtual OGRLayer *CopyLayer(OGRLayer *poSrcLayer, const char *pszNewName, char **papszOptions = nullptr)

复制现有图层

参数:

  • poSrcLayer -- 源层。

  • pszNewName -- 要创建的图层的名称。

  • papszOptions -- 名称=值选项的字符串列表。选项特定于驱动程序。设置输出图层空间参考有一个常用选项:DST_SRSWKT。该选项应采用 WKT 格式。从 GDAL 3.7 开始,可以将通用选项 COPY_MD设置为 NO 以防止将元数据从源图层默认复制到目标图层。

返回: 图层的句柄,如果发生错误,则为 NULL

​
    // 获取原有图层
    OGRLayer* srcLayer = dataset->GetLayerByName("source_layer_name"); // 替换为原有图层的名称

    // 复制图层
    const char* newLayerName = "new_layer"; // 替换为新图层的名称

    char** options = nullptr; // 替换为复制图层的选项,如果不需要设置选项,则使用nullptr

    OGRLayer* newLayer = dataset->CopyLayer(srcLayer, newLayerName, options);
    if (newLayer == nullptr)
    {
        std::cout << "Failed to copy layer." << std::endl;
    }
    else
    {
        std::cout << "Layer copied successfully." << std::endl;
    }

​

GetStyleTable

virtual OGRStyleTable *GetStyleTable()

返回数据集样式表

返回:  指向不应由调用方修改或释放的样式表的指针

    // 获取图层
    OGRLayer* layer = dataset->GetLayerByName("your_layer_name"); // 替换为您要获取样式表的图层名称

    // 获取图层的样式表
    OGRStyleTable* styleTable = layer->GetStyleTable();

    if (styleTable == nullptr)
    {
        std::cout << "Style table not found for the layer." << std::endl;
        GDALClose(dataset);
        return 1;
    }

    // 输出样式表内容
    for (int i = 0; i < styleTable->GetCount(); ++i)
    {
        const char* styleName;
        const char* styleDef;
        styleTable->GetStyle(i, &styleName, &styleDef);
        std::cout << "Style Name: " << styleName << "  Style Definition: " << styleDef << std::endl;
    }

SetStyleTableDirectly

virtual void SetStyleTableDirectly(OGRStyleTable *poStyleTable)

设置数据集样式表

参数:

poStyleTable -- 指向要设置的样式表的指针

    // 获取图层
    OGRLayer* layer = dataset->GetLayerByName("your_layer_name"); // 替换为您要设置样式表的图层名称

    // 创建样式表对象并设置样式
    OGRStyleTable* styleTable = new OGRStyleTable();

    styleTable->AddStyle("my_style", "SYMBOL('circle') COLOR('#FF0000') SIZE(5)"); // 替换为您要设置的样式内容

    // 设置样式表到图层
    layer->SetStyleTableDirectly(styleTable);

    // 保存图层和数据集
    layer->SyncToDisk();

ExecuteSQL

virtual OGRLayer *ExecuteSQL(const char *pszStatement, OGRGeometry *poSpatialFilter, const char *pszDialect)

对数据存储执行 SQL 语句

参数:

  • pszStatement -- 要执行的 SQL 语句。

  • poSpatialFilter -- 表示空间过滤器的几何图形。可以为空。

  • pszDialect -- 允许控制语句特有用语。如果设置为 NULL,则将使用 OGR SQL 引擎,但将使用其专用 SQL 引擎的 RDBMS 驱动程序除外,除非 OGRSQL 作为特有用语显式传递。从 OGR 1.10 开始,也可以使用 SQLITE 方言。

返回: 包含查询结果的 OGRLayer。使用 ReleaseResultSet() 解除分配

    // 要执行的SQL查询语句
    const char* sqlStatement = "SELECT * FROM your_table_name WHERE your_attribute = 'some_value'"; // 替换为您的SQL查询语句

    // 空间过滤器,用于对查询结果进行空间过滤,如果不需要空间过滤,设置为nullptr
    OGRGeometry* spatialFilter = nullptr;

    // SQL查询方言,如果使用默认SQL方言,设置为nullptr
    const char* dialect = nullptr;

    // 执行SQL查询
    OGRLayer* resultLayer = dataset->ExecuteSQL(sqlStatement, spatialFilter, dialect);

    if (resultLayer == nullptr)
    {
        std::cout << "SQL query failed." << std::endl;
        GDALClose(dataset);
        return 1;
    }

    // 在这里可以对查询结果的图层进行处理和分析

    // 释放查询结果图层的资源
    dataset->ReleaseResultSet(resultLayer);

ReleaseResultSet

virtual void ReleaseResultSet(OGRLayer *poResultsSet)

释放查询结果图层

参数:

poResultsSet -- 先前 ExecuteSQL() 调用的结果

AbortSQL

virtual OGRErr AbortSQL()

中止数据存储中运行的任何 SQL 语句

    // 要执行的SQL查询语句
    const char* sqlStatement = "SELECT * FROM your_table_name WHERE your_attribute = 'some_value'"; // 替换为您的SQL查询语句

    // 空间过滤器,用于对查询结果进行空间过滤,如果不需要空间过滤,设置为nullptr
    OGRGeometry* spatialFilter = nullptr;

    // SQL查询方言,如果使用默认SQL方言,设置为nullptr
    const char* dialect = nullptr;

    // 执行SQL查询
    OGRLayer* resultLayer = dataset->ExecuteSQL(sqlStatement, spatialFilter, dialect);

    if (resultLayer == nullptr)
    {
        std::cout << "SQL query failed." << std::endl;
        GDALClose(dataset);
        return 1;
    }

    // 在这里可以对查询结果的图层进行处理和分析
    // 如果需要终止查询操作,可以在适当的位置调用AbortSQL函数
    dataset->AbortSQL();

    // 释放查询结果图层的资源
    dataset->ReleaseResultSet(resultLayer);

GetRefCount

int GetRefCount() const

中止数据存储中运行的任何 SQL 语句

返回: 数据源对象本身的当前引用计数

GetSummaryRefCount

int GetSummaryRefCount() const

获取数据源和所有拥有的层的引用计数

返回:  数据源对象本身的当前引用计数

Release

OGRErr Release()

删除对此数据集的引用,如果引用计数下降到一个,则关闭(销毁)数据集

返回:  OGRERR_NONE成功或错误代码

StartTransaction

virtual OGRErr StartTransaction(int bForce = FALSE)

对于支持事务的数据源,StartTransaction 会创建一个“事务”

参数:

bForce -- 如果事务机制的模拟(可能很慢)是可接受的,则可以设置为 TRUE。

返回:  OGRERR_NONE成功

CommitTransaction

virtual OGRErr CommitTransaction()

对于支持事务的数据源,提交事务提交事务

返回:  OGRERR_NONE成功

RollbackTransaction

virtual OGRErr RollbackTransaction()

对于支持事务的数据源,RollbackTransaction 会将数据源回滚到当前事务开始之前的状态

返回:OGRERR_NONE成功

GetRootGroup

virtual std::shared_ptr<GDALGroup> GetRootGroup() const

返回此数据集的根 GDALGroup

仅对多维数据集有效

    // 开始事务
    OGRErr result = dataset->StartTransaction();

    if (result != OGRERR_NONE)
    {
        std::cout << "Failed to start transaction." << std::endl;
        GDALClose(dataset);
        return 1;
    }

    // 在这里执行一系列数据集的更新操作
    // 比如添加、修改或删除要素和属性信息等

    // 结束事务并提交更新
    result = dataset->CommitTransaction();

    if (result != OGRERR_NONE)
    {
        std::cout << "Failed to commit transaction." << std::endl;
        GDALClose(dataset);
        return 1;
    }

    // 或者在这里执行回滚操作,撤销之前的更新
    // dataset->RollbackTransaction();

在GDAL中,事务主要用于一系列对数据集的更新操作,例如添加、修改或删除要素和属性信息等。通过将这些更新操作组织在一个事务中,可以确保这些操作要么全部执行成功,要么全部回滚(撤销),从而保持数据的一致性。如果在事务执行过程中出现错误或意外情况,可以选择回滚事务,以撤销之前的更新操作,从而避免数据的损坏或不一致。

事务的使用还可以提高数据更新的效率。当数据量较大时,将多个更新操作组织在一个事务中,可以减少多次打开和关闭数据集的开销,从而提高数据更新的效率。

注意,OGRLayer中也有事务的使用,代码几乎一样

猜你喜欢

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