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

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中也有事务的使用,代码几乎一样

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HackSudo2靶机 通关详解

环境配置 发现vmWare的kali扫不到virtualbox的靶机 网上找了挺久资料都没解决 索性全桥接上物理机了 信息收集 漏洞发现 扫个目录 都看了一眼 没什么有用的 然后回到file.php 感觉之前做过类似的靶场,猜测存在文件包含 随便传个file试试 确实有 考虑日志文件包含 之前看…

hbase优化:客户端、服务端、hdfs

hbase优化 一.读优化 1.客户端&#xff1a; scan。cache 设置是否合理&#xff1a;大scan场景下将scan缓存从100增大到500或者1000&#xff0c;用以减少RPC次数使用批量get进行读取请求离线批量读取请求设置禁用缓存&#xff0c;scan.setBlockCache(false)以指定列族或者列进行…

Spring Framework 提供缓存管理器Caffeine

说明 Spring Framework 提供了一个名为 Caffeine 的缓存管理器。Caffeine 是一个基于 Java 的高性能缓存库&#xff0c;被广泛用于处理大规模缓存数据。 使用 Caffeine 缓存管理器&#xff0c;可以轻松地在 Spring 应用程序中添加缓存功能。它提供了以下主要特性&#xff1a;…

《2023中国开发者调查报告》探索2023中国开发者的技术创新与挑战:AIoT、云原生、国产数据库等领域的发展与前景

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

算法之桶排序算法

桶排序的基本思想是&#xff1a; 把数组 arr 划分为 n 个大小相同子区间&#xff08;桶&#xff09;&#xff0c;每个子区间各自排序&#xff0c;最 后合并 。计数排序是桶排序的一种特殊情况&#xff0c;可以把计数排序当成每个桶里只有一个元素的情况。 1.找出待排序数组中的…

【AI之路】使用huggingface_hub优雅解决huggingface大模型下载问题

文章目录 前言一、Hugging face是什么&#xff1f;二、准备工作三、下载整个仓库或单个大模型文件1. 下载整个仓库2. 下载单个大模型文件 总结附录 前言 Hugging face 资源很不错&#xff0c;可是国内下载速度很慢&#xff0c;动则GB的大模型&#xff0c;下载很容易超时&#…

无涯教程-jQuery - load( url, data, callback)方法函数

load(url&#xff0c;data&#xff0c;callback)方法从服务器加载数据&#xff0c;并将返回的HTML放入匹配的元素中。 load( url, [data], [callback] ) - 语法 [selector].load( url, [data], [callback] ) 这是此方法使用的所有参数的描述- url - 包含请求发送到…

Meta AI研究团队新AI模型:Segment Anything图像分割任务

Segment Anything是Meta AI研究团队开发的一种新的AI模型&#xff0c;用于图像分割任务。该模型可以对任何图像中的任何对象进行分割&#xff0c;即将对象从图像中"剪切"出来。Segment Anything模型&#xff08;SAM&#xff09;是一个可提示的模型&#xff0c;可以根…

Vite+Vue3 开发UI组件库并发布到npm

一直对开源UI组件库比较感兴趣&#xff0c;摸索着开发了一套&#xff0c;虽然还只是开始&#xff0c;但是从搭建到发布这套流程基本弄明白了&#xff0c;现在分享给大家&#xff0c;希望对同样感兴趣的同学有所帮助。 目前我的这套名为hasaki-ui的组件库仅有两个组件&#xff0…

列表转字典

编写一个程序将字符串转换为字典。 定义函数convert_str_list_to_dict()&#xff0c;参数为str_list(输入的字符串)。在函数内部&#xff0c;创建一个字典&#xff0c;其中每个字符串使用进行分割&#xff0c;第一部分为键&#xff0c;第二部分为值。返回字典。 示例输入 5F…

我的512天创作纪念日

眼馋csdn发的虚拟徽章&#xff0c;所以写此文。个人总结&#xff0c;无技术分享。 机缘 写代码的机缘&#xff0c;在于听说这个挣钱多&#xff0c;坐办公室&#xff0c;凤吹不着&#xff0c;雨淋不着。 而写blog的机缘&#xff0c;则在于是自己的技术的总结&#xff0c;经常是…

分布式异步任务处理组件(五)

节点上线和下线的逻辑-- 节点下线分为两种--心跳失败主动或被动和主节点断开连接&#xff0c;但是节点本身没有发生重启&#xff1b;第二种就是节点宕机重启--其实这两中情况下处理逻辑都是一样的&#xff0c;只是节点本身如果还能消费到kafka的时候可以继续执行任务但是不能从…

分布式异步任务处理组件(四)

基于zookeeper的HA集群设计思路-- 各个节点都可以消费任务&#xff0c;但是由主节点来投票&#xff1b;主节点通过注册zookeeper的临时节点来选举--主节点需要同步从节点的信息正常工作机制--各个节点&#xff08;包括主节点本身&#xff09;在执行任务之前询问主节点&#xf…

IntelliJ IDEA 2023.2 最新变化

主要更新 AI Assistant 限定访问 Ultimate 在此版本中&#xff0c;我们为 IntelliJ IDEA 引入了一项重要补充 – AI Assistant。 AI Assistant 当前具备一组由 AI 提供支持的初始功能&#xff0c;提供集成式 AI 聊天&#xff0c;可以完成一些任务&#xff0c;例如自动编写文档…

【计算机视觉】BLIP:统一理解和生成的自举多模态模型

文章目录 一、导读二、背景和动机三、方法3.1 模型架构3.2 预训练目标3.3 BLIP 高效率利用噪声网络数据的方法&#xff1a;CapFilt 四、实验4.1 实验结果4.2 各个下游任务 BLIP 与其他 VLP 模型的对比 一、导读 BLIP 是一种多模态 Transformer 模型&#xff0c;主要针对以往的…

5、Kubernetes核心技术 - Controller控制器工作负载

目录 一、Deployments - 控制器应用 二、Deployment升级回滚和弹性收缩 2.1、创建一个 1.14 版本的 pod 2.2、应用升级 2.3、查看升级状态 2.4、查看历史版本 2.5、应用回滚 2.6、弹性伸缩 三、StatefulSet - 有状态应用 四、DaemonSet - 守护进程 五、Job - 单次任…

小红书JAVA后端一面汇总总结

小红书 2 年社招 Java 后端一面的面经,面试的风格是从一个知识一层一层深入问到底层。 从 Java IO,问到 socket 底层。从 Java 内存,问到操作系统内存。所以学习知识的时候,不要只 看八股文,还是需要从点到面一层层去掌握, 才能比较好应对这类的面试场景。 问题记录 自我…

Linux近两年高危漏洞修复过程记录

一、背景 2023年8月份&#xff0c;面对即将到来的“大运会”、“亚运会”&#xff0c;今年的例行安全护网阶段也将迎来新的挑战和时刻&#xff0c;为此相关部门发布了国家级实战攻防演练已进入紧急「备战」时刻&#xff01;这里我们主要说一下Linux OS层面的漏洞处理&#xff0…

SpringBoot之logging基于application多环境配置文件配置日志输出到文件(非spring-logback.xml)

一般情况&#xff1a;日志文件按yyyy-MM-dd分文件夹&#xff0c;%i按单个日志文件大小切割文件并用索引命名。 开发环境&#xff08;dev&#xff09;&#xff1a;只输出到控制台&#xff0c;不输出到文件&#xff0c;日志级别为INFO。测试环境&#xff08;test&#xff09;&am…

spring5源码篇(12)——spring-mvc请求流程

spring-framework 版本&#xff1a;v5.3.19 文章目录 一、请求流程1、处理器映射器1.1、 RequestMappingHandlerMapping1.2、获取对应的映射方法1.3、添加拦截器 2、获取合适的处理器适配器3、通过处理器适配器执行处理器方法3.1、拦截器的前置后置3.2、处理器的执行3.2.1 参数…