CreateLayer
virtual OGRLayer *CreateLayer(const char *pszName, OGRSpatialReference *poSpatialRef = nullptr, OGRwkbGeometryType 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; // 替换为复制图层的选项,如果不需要设置选项,则使用nullptrOGRLayer* 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查询语句// 空间过滤器,用于对查询结果进行空间过滤,如果不需要空间过滤,设置为nullptrOGRGeometry* spatialFilter = nullptr;// SQL查询方言,如果使用默认SQL方言,设置为nullptrconst 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查询语句// 空间过滤器,用于对查询结果进行空间过滤,如果不需要空间过滤,设置为nullptrOGRGeometry* spatialFilter = nullptr;// SQL查询方言,如果使用默认SQL方言,设置为nullptrconst 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中也有事务的使用,代码几乎一样