GDAL OGR C++ API 学习之路 (5)OGRLayer篇 代码示例

chatgpt/2023/9/27 7:28:10

GetStyleTable

virtual OGRStyleTable *GetStyleTable ()

返回图层样式表

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

// 假设图层对象为 poLayer
OGRStyleTable* poStyleTable = poLayer->GetStyleTable();
if (poStyleTable != nullptr) {// 处理样式表信息// ...
} else {// 图层没有关联样式表// ...
}

SetStyleTableDirect

virtual void SetStyleTableDirect(OGRStyleTable *poStyleTable )

设置图层样式表

参数:

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

// 假设图层对象为 poLayer,样式表对象为 poStyleTable
poLayer->SetStyleTableDirect(poStyleTable);

StartTransaction

Virtual OGRErr StartTransaction()

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

返回:  OGRERR_NONE成功

// 假设图层对象为 poLayer
if (poLayer->StartTransaction() == OGRERR_NONE) {// 在事务中进行一系列操作// ...// 提交事务poLayer->CommitTransaction();
} else {// 处理事务启动失败的情况
}

在 OGR 中,图层可以支持事务,通过调用 StartTransaction() 可以在图层中开始一个事务。在事务中,可以进行一系列的图层操作,例如添加要素、修改要素、删除要素等。当所有的操作都执行完成后,可以调用 CommitTransaction() 来提交事务,表示所有操作都成功执行。如果在事务过程中出现了错误,可以调用 RollbackTransaction() 来回滚事务,表示撤销之前的所有操作

 

CommitTransaction

virtual OGRErr CommitTransaction()

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

返回:  OGRERR_NONE成功

RollbackTransaction

Virtual OGRErr RollbackTransaction()

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

返回:  OGRERR_NONE成功

    // 获取第一个图层OGRLayer* poLayer = poDS->GetLayer(0);// 开始事务poDS->StartTransaction();// 创建新要素OGRFeature* poFeature = new OGRFeature(poLayer->GetLayerDefn());// 设置要素属性poFeature->SetField("name", "New Feature");poFeature->SetField("population", 10000);// 创建新几何图形并设置为要素的几何图形OGRPoint point(100, 200);poFeature->SetGeometry(&point);// 将新要素添加到图层中if (poLayer->CreateFeature(poFeature) != OGRERR_NONE) {printf("添加要素失败!\n");poDS->RollbackTransaction(); // 回滚事务,撤销之前的操作OGRDataSource::DestroyDataSource(poDS);delete poFeature;exit(1);}// 提交事务,保存更改poDS->CommitTransaction();​

GetFIDColumn

virtual const char *GetFIDColumn()

此方法返回用作 FID 列的基础数据库列的名称,如果不支持,则返回  ""

返回:  FID 列名称

    // 获取第一个图层OGRLayer* poLayer = poDS->GetLayer(0);// 获取用于唯一标识要素的字段的名称const char* fid_column = poLayer->GetFIDColumn();if (fid_column != nullptr) {printf("用于唯一标识要素的字段名称:%s\n", fid_column);} else {printf("图层中没有用于唯一标识要素的字段。\n");}

GetGeometryColumn

virtual const char *GetGeometryColumn()

此方法返回用作几何列的基础数据库列的名称,如果不支持,则返回 “”

对于具有多个几何字段的图层,此方法仅返回第一个几何列的名称

返回: 几何列名称

    // 获取第一个图层OGRLayer* poLayer = poDS->GetLayer(0);// 获取存储几何信息的字段的名称const char* geometry_column = poLayer->GetGeometryColumn();if (geometry_column != nullptr) {printf("存储几何信息的字段名称:%s\n", geometry_column);} else {printf("图层中没有存储几何信息的字段。\n");}

SetIgnoredFields

virtual OGRErr SetIgnoredFieldsconst char **papszFields)

设置从图层检索要素时可以省略的字段

参数:

papszFields -- 以 NULL 项结尾的字段名称数组。如果传递 NULL,则清除忽略的列表。

返回:  OGRERR_NONE是否已解析所有字段名称(即使驱动程序不支持此方法)

   // 获取第一个图层OGRLayer* poLayer = poDS->GetLayer(0);// 定义要忽略的字段数组const char* papszFields[] = {"field1", "field2"};// 设置要忽略的字段OGRErr err = poLayer->SetIgnoredFields(papszFields);if (err != OGRERR_NONE) {// 处理设置忽略字段时发生的错误}// 其他处理代码...

 GetIgnoredFields可以拿到忽略字段列表

    // 获取当前设置的忽略字段列表char** papszIgnoredFields = poLayer->GetIgnoredFields();// 打印忽略字段列表for (int i = 0; papszIgnoredFields[i] != nullptr; i++) {printf("Ignored Field: %s\n", papszIgnoredFields[i]);}

GetGeometryTypes

virtual OGRGeometryTypeCounter *GetGeometryTypes(int iGeomField, int nFlagsGGT, int &nEntryCountOut, GDALProgressFunc pfnProgress, void *pProgressData)

获取在要素中找到的实际几何类型

参数:

  • iGeomField -- 几何字段索引。

  • nFlagsGGT -- 提示标志。0 或 OGR_GGT_COUNT_NOT_NEEDED、OGR_GGT_STOP_IF_MIXED、OGR_GGT_GEOMCOLLECTIONZ_TINZ的组合

  • nEntryCountOut -- [out] 返回数组中的条目数。

  • pfnProgress-- 取消回调。可能为空。

  • pProgressData -- 取消回调的用户数据。可能为空。

返回: 一个 nEntryCount 数组,如果出现错误,必须使用 CPLFree() 或 NULL 释放

Intersection

OGRErr Intersection(OGRLayer *pLayerMethod, OGRLayer *pLayerResult, char **papszOptions = nullptr, GDALProgressFunc pfnProgress = nullptr, void *pProgressArg = nullptr)

两层的交集

参数:

  • pLayerMethod -- 方法层。不应为 NULL。

  • pLayerResult -- 插入操作生成的要素的图层。不应为 NULL

  • papszOptions -- NULL 终止的选项列表(可能为 NULL)。

  • pfnProgress -- 一个与 GDALProgressFunc() 兼容的回调函数,用于报告进度或 NULL。

  • pProgressArg -- 要传递给 pfnProgress 的参数。可能为空。

返回:

如果出现错误或执行中断,则为错误代码,否则OGRERR_NONE

Union

OGRErr Union(OGRLayer *pLayerMethod, OGRLayer *pLayerResult, char **papszOptions = nullptr, GDALProgressFunc pfnProgress = nullptr, void *pProgressArg = nullptr)

两层并集

参数:

  • pLayerMethod -- 方法层。不应为 NULL。

  • pLayerResult -- 插入操作生成的要素的图层。不应为 NULL。

  • papszOptions -- NULL 终止的选项列表(可能为 NULL)。

  • pfnProgress -- 一个与 GDALProgressFunc() 兼容的回调函数,用于报告进度或 NULL。

  • pProgressArg -- 要传递给 pfnProgress 的参数。可能为空。

返回:

如果出现错误或执行中断,则为错误代码,否则OGRERR_NONE

// 获取输入图层和输出图层
OGRLayer* pLayer1 = poInputDS->GetLayer(0);
OGRLayer* pLayer2 = poInputDS->GetLayer(1);
OGRLayer* pLayerResult = poOutputDS->CreateLayer("SymDifference_Result", nullptr, wkbUnknown, nullptr);// 计算几何形状的对称差并将结果写入输出图层
OGRErr err = pLayer1->Union(pLayer2, pLayerResult, nullptr, nullptr, nullptr);// 保存并关闭结果图层
pLayerResult->SyncToDisk();

SymDifference

OGRErr SymDifference(OGRLayer *pLayerMethod, OGRLayer *pLayerResult, char **papszOptions, GDALProgressFunc pfnProgress, void *pProgressArg)

两层对称差异(交集取反)

参数:

  • pLayerMethod -- 方法层。不应为 NULL。

  • pLayerResult -- 插入操作生成的要素的图层。不应为 NULL。

  • papszOptions -- NULL 终止的选项列表(可能为 NULL)。

  • pfnProgress -- 一个与 GDALProgressFunc() 兼容的回调函数,用于报告进度或 NULL。

  • pProgressArg -- 要传递给 pfnProgress 的参数。可能为空。

返回:

如果出现错误或执行中断,则为错误代码,否则OGRERR_NONE

// 获取输入图层和输出图层
OGRLayer* pLayer1 = poInputDS->GetLayer(0);
OGRLayer* pLayer2 = poInputDS->GetLayer(1);
OGRLayer* pLayerResult = poOutputDS->CreateLayer("SymDifference_Result", nullptr, wkbUnknown, nullptr);// 计算几何形状的对称差并将结果写入输出图层
OGRErr err = pLayer1->SymDifference(pLayer2, pLayerResult, nullptr, nullptr, nullptr);// 保存并关闭结果图层
pLayerResult->SyncToDisk();

Identity

OGRErr Identity(OGRLayer *pLayerMethod, OGRLayer *pLayerResult, char **papszOptions = nullptr, GDALProgressFunc pfnProgress = nullptr, void *pProgressArg = nullptr)

将此图层的特征与标识层中的特征标识

参数:

  • pLayerMethod -- 方法层。不应为 NULL。

  • pLayerResult -- 插入操作生成的要素的图层。不应为 NULL。

  • papszOptions -- NULL 终止的选项列表(可能为 NULL)。

  • pfnProgress -- 一个与 GDALProgressFunc() 兼容的回调函数,用于报告进度或 NULL。

  • pProgressArg -- 要传递给 pfnProgress 的参数。可能为空。

返回:

如果出现错误或执行中断,则为错误代码,否则OGRERR_NONE

// 获取输入图层和输出图层
OGRLayer* pLayer1 = poInputDS->GetLayer(0);
OGRLayer* pLayer2 = poInputDS->GetLayer(1);
OGRLayer* pLayerResult = poOutputDS->CreateLayer("Identity_Result", nullptr, wkbUnknown, nullptr);// 计算几何形状的恒等并将结果写入输出图层
OGRErr err = pLayer1->Identity(pLayer2, pLayerResult, nullptr, nullptr, nullptr);// 保存并关闭结果图层
pLayerResult->SyncToDisk();

Update

OGRErr Update(OGRLayer *pLayerMethod, OGRLayer *pLayerResult, char **papszOptions = nullptr, GDALProgressFunc pfnProgress = nullptr, void *pProgressArg = nullptr)

使用更新图层中的要素更新此图层

参数:

  • pLayerMethod -- 方法层。不应为 NULL。

  • pLayerResult -- 插入操作生成的要素的图层。不应为 NULL。

  • papszOptions -- NULL 终止的选项列表(可能为 NULL)。

  • pfnProgress -- 一个与 GDALProgressFunc() 兼容的回调函数,用于报告进度或 NULL。

  • pProgressArg -- 要传递给 pfnProgress 的参数。可能为空。

返回:

如果出现错误或执行中断,则为错误代码,否则OGRERR_NONE

// 获取输入图层和输出图层
OGRLayer* pLayer1 = poInputDS->GetLayer(0);
OGRLayer* pLayer2 = poInputDS->GetLayer(1);
OGRLayer* pLayerResult = poOutputDS->CreateLayer("SymDifference_Result", nullptr, wkbUnknown, nullptr);// 计算几何形状的对称差并将结果写入输出图层
OGRErr err = pLayer1->Update(pLayer2, pLayerResult, nullptr, nullptr, nullptr);// 保存并关闭结果图层
pLayerResult->SyncToDisk();

Clip

OGRErr Clip(OGRLayer *pLayerMethod, OGRLayer *pLayerResult, char **papszOptions = nullptr, GDALProgressFunc pfnProgress = nullptr, void *pProgressArg = nullptr)

裁剪方法图层未覆盖的区域

参数:

  • pLayerMethod -- 方法层。不应为 NULL。

  • pLayerResult -- 插入操作生成的要素的图层。不应为 NULL。

  • papszOptions -- NULL 终止的选项列表(可能为 NULL)。

  • pfnProgress -- 一个与 GDALProgressFunc() 兼容的回调函数,用于报告进度或 NULL。

  • pProgressArg -- 要传递给 pfnProgress 的参数。可能为空。

返回:如果出现错误或执行中断,则为错误代码,否则OGRERR_NONE

// 获取输入图层和输出图层
OGRLayer* pLayer1 = poInputDS->GetLayer(0);
OGRLayer* pLayer2 = poInputDS->GetLayer(1);
OGRLayer* pLayerResult = poOutputDS->CreateLayer("SymDifference_Result", nullptr, wkbUnknown, nullptr);// 计算几何形状的对称差并将结果写入输出图层
OGRErr err = pLayer1->Clip(pLayer2, pLayerResult, nullptr, nullptr, nullptr);// 保存并关闭结果图层
pLayerResult->SyncToDisk();

Erase

OGRErr Erase(OGRLayer *pLayerMethod, OGRLayer *pLayerResult, char **papszOptions = nullptr, GDALProgressFunc pfnProgress = nullptr, void *pProgressArg = nullptr)

移除方法图层覆盖的区域

参数:

  • pLayerMethod -- 方法层。不应为 NULL。

  • pLayerResult -- 插入操作生成的要素的图层。不应为 NULL。

  • papszOptions -- NULL 终止的选项列表(可能为 NULL)。

  • pfnProgress -- 一个与 GDALProgressFunc() 兼容的回调函数,用于报告进度或 NULL。

  • pProgressArg -- 要传递给 pfnProgress 的参数。可能为空。

返回: 如果出现错误或执行中断,则为错误代码,否则OGRERR_NONE

// 获取输入图层和输出图层
OGRLayer* pLayer1 = poInputDS->GetLayer(0);
OGRLayer* pLayer2 = poInputDS->GetLayer(1);
OGRLayer* pLayerResult = poOutputDS->CreateLayer("SymDifference_Result", nullptr, wkbUnknown, nullptr);// 计算几何形状的对称差并将结果写入输出图层
OGRErr err = pLayer1->Erase(pLayer2, pLayerResult, nullptr, nullptr, nullptr);// 保存并关闭结果图层
pLayerResult->SyncToDisk();

Reference

int Reference()

递增图层引用计数

返回:递增后的引用计数

Dereference

int Dereference()

递减图层参考计数

返回:递减后的引用计数

ReorderField

OGRErr ReorderField(int iOldFieldPos, int iNewFieldPos)

对图层上的现有字段重新排序

参数:

  • iOldFieldPos -- 要移动的字段的先前位置。必须在 [0,GetFieldCount()-1] 范围内。

  • iNewFieldPos -- 要移动的字段的新位置。必须在 [0,GetFieldCount()-1] 范围内。

返回:  OGRERR_NONE成功

// 获取输入图层
OGRLayer* pLayer = poInputDS->GetLayer(0);// 获取字段总数
int fieldCount = pLayer->GetLayerDefn()->GetFieldCount();// 假设我们要将第1个字段移动到第3个位置
int oldFieldPos = 0; // 第1个字段的位置(索引从0开始)
int newFieldPos = 2; // 新的位置(索引从0开始)if (oldFieldPos < 0 || oldFieldPos >= fieldCount || newFieldPos < 0 || newFieldPos >= fieldCount) {// 检查字段位置是否有效// 可以根据需要添加其他错误处理逻辑return OGRERR_FAILURE;
}// 重新排列字段
OGRErr err = pLayer->ReorderField(oldFieldPos, newFieldPos);
if (err != OGRERR_NONE) {// 重新排列失败,可以根据需要添加错误处理逻辑return err;
}// 保存并关闭数据源
pLayer->SyncToDisk();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-5313609.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

matlab多线程,parfor循环进度,matlab互斥锁

一. 内容简介 matlab多线程&#xff0c;parfor循环进度&#xff0c;matlab互斥锁 二. 软件环境 2.1 matlab 2022b 2.2代码链接 https://gitee.com/JJW_1601897441/csdn 三.主要流程 3.1 matlab多线程 有好几种&#xff0c;最简单的&#xff0c;最好理解的就是parfor&am…

汽车后视镜反射率检测系统

随着社会的快速发展和物质生活的提供&#xff0c;机动车越来越普及&#xff0c;道路行车安全日益重要。为了保障机动车辆和行人的安全&#xff0c;在行车时不断观察后方和两侧的图像尤为重要。机动车后视镜通过反射镜面可以提供在规定视野内后方和两侧的图像&#xff0c;从而提…

深入篇【C++】手搓模拟实现list类(详细剖析底层实现原理)模拟实现正反向迭代器【容器适配器模式】

深入篇【C】手搓模拟实现list类(详细剖析底层实现原理&#xff09;&& 模拟实现正反向迭代器【容器适配器模式】 Ⅰ.迭代器实现1.一个模板参数2.两个模板参数3.三个模板参数 Ⅱ.反向迭代器实现1.容器适配器模式 Ⅲ.list模拟实现1.定义结点2.封装结点3.构造/拷贝4.迭代器…

使用机器学习进行疾病预测 -- 机器学习项目基础篇(3)

本文旨在实现一个强大的机器学习模型&#xff0c;可以根据他/她所拥有的症状有效地预测人类的疾病。让我们看看如何解决这个机器学习问题&#xff1a; 方法&#xff1a; 收集数据&#xff1a;数据准备是任何机器学习问题的主要步骤。我们将使用来自Kaggle的数据集来解决这个问…

揭秘!头条百科词条创建全过程及技巧解析

随着互联网时代的到来&#xff0c;人们获取信息的方式越来越便捷。作为国内领先的信息平台&#xff0c;头条百科成为了很多人查阅知识的首选。然而&#xff0c;如何在头条上创建百科词条&#xff0c;让更多人了解和熟知自己呢&#xff1f;本文伯乐网络传媒将为您揭开这个谜团&a…

python3GUI--我的翻译器By:PyQt5(附下载地址)

文章目录 一&#xff0e;前言二&#xff0e;展示1.主界面2.段落翻译3.单词翻译 三&#xff0e;设计1.UI设计2.软件设计3.参考 四&#xff0e;总结 一&#xff0e;前言 很早之前写过一篇python3GUI–翻译器By:PyQt5&#xff08;附源码&#xff09; &#xff0c;但是发现相关引擎…

Python实现九宫格数独小游戏

1 问题 有1-9个数字&#xff0c;将他们填入一个3*3的九宫格中&#xff0c;使得他们的每行&#xff0c;每列&#xff0c;以及对角线上的和相等&#xff0c;且要求每个格子的数字不可以重复。使用python列出所有可能的组合。示例如下: 2 方法 每行&#xff0c;列&#xff0c;对角…

算法:HJ27 查找兄弟单词

描述 定义一个单词的“兄弟单词”为&#xff1a;交换该单词字母顺序&#xff08;注&#xff1a;可以交换任意次&#xff09;&#xff0c;而不添加、删除、修改原有的字母就能生成的单词。 兄弟单词要求和原来的单词不同。例如&#xff1a; ab 和 ba 是兄弟单词。 ab 和 ab 则…
推荐文章