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

news/2024/6/26 22:09:12

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://lihuaxi.xjx100.cn/news/1396484.html

相关文章

Spring | Bean 作用域和生命周期

一、通过一个案例来看 Bean 作用域的问题 Spring 是用来读取和存储 Bean&#xff0c;因此在 Spring 中 Bean 是最核心的操作资源&#xff0c;所以接下来我们深入学习⼀下 Bean 对象 假设现在有⼀个公共的 Bean&#xff0c;提供给 A 用户和 B 用户使用&#xff0c;然而在使用的…

HCIE Security——防火墙互联技术

目录 一、防火墙接口互联接口 1.防火墙支持的接口及板卡 2.物理链接线缆 3.支持接口种类 &#xff08;1&#xff09;物理接口 &#xff08;2&#xff09;逻辑接口 二、相关配置命令 1.配置三层接口IP地址 2.配置PPPOE拨号接口 3.配置VLANIF接口、子接口、回环接口 4…

81%的消费者预算增加,今年返校季会有哪些机会?

对于跨境卖家来说&#xff0c;7-9月的重头戏莫过于“返校季”。多项调研表明&#xff0c;今年“返校季”消费者预计投入更多预算&#xff0c;并瞄准线上渠道。目前&#xff0c;亚马逊“返校季”促销活动正在火热进行中&#xff0c;许多产品甚至卖到脱销。 那么&#xff0c;今年…

XGBoost的基础思想与实现

目录 1. XGBoost VS 梯度提升树 1.1 XGBoost实现精确性与复杂度之间的平衡 1.2 XGBoost极大程度地降低模型复杂度、提升模型运行效率 1.3 保留了部分与梯度提升树类似的属性 2. XGBoost回归的sklearnAPI实现 2.1 sklearn API 实现回归 2.2 sklearn API 实现分类 3. XGBo…

MySQL主从复制及读写分离(三十四)

目录 MySQL主从复制 一、概述 1、MySQL Replication优点&#xff1a; 二、MySQL复制类型 1、异步复制&#xff08;Asynchronous repication&#xff09; 2、全同步复制&#xff08;Fully synchronous replication&#xff09; 3、半同步复制&#xff08;Semisynchronous…

配置IPv6 over IPv4 GRE隧道示例

组网需求 如图1&#xff0c;两个IPv6网络分别通过SwitchA和SwitchC与IPv4公网中的SwitchB连接&#xff0c;客户希望两个IPv6网络中的PC1和PC2实现互通。 其中PC1和PC2上分别指定SwitchA和SwitchC为自己的缺省网关。 图1 配置IPv6 over IPv4 GRE隧道组网图 配置思路 要实现I…

嵌入式基础知识-存储器

本篇介绍计算机存储硬件的一些基础知识&#xff0c;在嵌入式开发中&#xff0c;也同样适用。 1 计算机存储结构 存储器是计算机中的重要部件&#xff0c;理想的存储器应该是执行快&#xff0c;容量足&#xff0c;价格便宜等。但实际上&#xff0c;目前无法同时满足这些目标&a…

获取安卓模拟器截图

最简单的方法当然是使用adb adb shell screencap -p >screenshot.png 不过有些app会限制adb进行截图&#xff0c;这个时候adb截屏为黑屏 此时有两种方法获取截图 第一使用模拟器自带截图快捷键,获取安卓自带截图键&#xff0c;逍遥模拟器为altF3 可模拟键盘输入按键&#…