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

news/2025/1/14 22:13:29/

GetNextFeature

virtual OGRFeature *GetNextFeature(OGRLayer **ppoBelongingLayer, double *pdfProgressPct, GDALProgressFunc pfnProgress, void *pProgressData)

从此数据集中获取下一个可用要素

参数:

  • ppoBelongingLayer -- 指向 OGRLayer* 变量的指针,用于接收对象所属的层或 NULL。尽管特征不是 NULL,但 *ppoBelongingLayer 的输出可能是 NULL。

  • pdfProgressPct -- 指向双精度变量的指针,用于接收进度百分比(在 [0,1] 范围内)或 NULL。返回时,如果无法确定进度,则指向值可能为负数。

  • pfnProgress -- 用于报告进度的进度回调(对于可能持续时间较长的 GetNextFeature() 调用)并提供取消可能性或 NULL。

  • pProgressData -- 提供给 pfnProgress 或 NULL 的用户数据

返回:  一个功能,如果没有其他功能可用,则为 NULL

GDALDataset* poDataset = (GDALDataset*)GDALOpenEx("your_dataset_file_path", GDAL_OF_VECTOR, NULL, NULL, NULL); // 定义变量存储获取的要素和进度OGRFeature* poFeature;OGRLayer* pBelongingLayer;double dfProgressPct;GDALProgressFunc pfnProgress = GDALTermProgress;void* pProgressData = NULL;// 遍历数据集中的所有要素while ((poFeature = poDataset->GetNextFeature(&pBelongingLayer, &dfProgressPct, pfnProgress, pProgressData)) != NULL){// 处理要素,例如获取属性值等操作// 释放要素OGRFeature::DestroyFeature(poFeature);}// 关闭数据集GDALClose(poDataset);

GetFeatures

Features GetFeatures()

在数据集图层中的要素上返回可迭代对象的函数

// 假设Features是一个包含特征图层和特征的容器类型的类型别名
using Features = std::vector<std::pair<OGRLayer*, OGRFeature*>>;// 获取Features对象,其中包含了特征图层和特征的信息
Features features = poDS->GetFeatures();for( auto&& oFeatureLayerPair: poDS->GetFeatures() )
{std::cout << "Feature of layer " <<oFeatureLayerPair.layer->GetName() << std::endl;oFeatureLayerPair.feature->DumpReadable();
}

TestCapability

virtual int TestCapabilityconst char*)

测试功能是否可用

可以将以下数据集功能名称之一传递到此方法中,并将返回 TRUE 或 FALSE 值,指示该功能是否可用于此对象。

  • ODsCCreateLayer:如果此数据源可以创建新图层,则为 True。

  • ODsCDeleteLayer:如果此数据源可以删除现有图层,则为 True。

  • ODsCCreateGeomFieldAfterCreateLayer:如果此数据源的层在创建层后支持 CreateGeomField(),则为 True。

  • ODsCCurve几何:如果此数据源支持曲线几何,则为 True。

  • ODsCTransactions:如果此数据源支持(高效)事务,则为 True。

  • ODsCEmulatedTransactions:如果此数据源支持通过仿真进行事务,则为 true。

  • ODsCRandomLayerRead:如果此数据源具有专用的 GetNextFeature() 实现,则为 True,可能以非顺序方式从层返回特征。

  • ODsCRandomLayerWrite:如果此数据源支持以非顺序方式在层上调用 CreateFeature(),则为 True。

参数:

pszCap -- 测试能力。

返回: 如果功能可用,则为 TRUE,否则为 FALSE

// 打开数据源GDALDataset* poDataset = (GDALDataset*)GDALOpenEx("your_dataset_file_path", GDAL_OF_VECTOR, NULL, NULL, NULL);// 测试数据源是否支持写入能力if (poDataset->TestCapability(ODsCCreateLayer) == TRUE){std::cout << "Dataset supports creating layers." << std::endl;}else{std::cout << "Dataset does not support creating layers." << std::endl;}// 关闭数据源GDALClose(poDataset);

GetFieldDomainNames

virtual std::vector<std::string> GetFieldDomainNames(CSLConstList papszOptions = NULLPTR) const

返回数据集中存储的所有字段属性域的名称列表

参数:

papszOptions -- 确定应如何检索属性的特定于驱动程序的选项。传递默认行为的空点。

返回:  字段域名列表

    // 打开数据源GDALDataset* poDataset = (GDALDataset*)GDALOpenEx("your_dataset_file_path", GDAL_OF_VECTOR, NULL, NULL, NULL);// 获取所有字段属性域的名称列表std::vector<std::string> fieldDomainNames;fieldDomainNames = poDataset->GetFieldDomainNames();// 输出域名称列表std::cout << "Field Domains: ";for (const std::string& domainName : fieldDomainNames){std::cout << domainName << ", ";}std::cout << std::endl;// 关闭数据源GDALClose(poDataset);

GetFieldDomain

virtual const OGRFieldDomain *GetFieldDomain(const std::string &name) const

从字段名称中获取字段域

// 打开数据集GDALAllRegister();GDALDataset* dataset = static_cast<GDALDataset*>(GDALOpen("path_to_your_dataset", GA_ReadOnly));// 获取指定字段的域信息std::string fieldName = "your_field_name"; // 替换为你想查询的字段名const OGRFieldDomain* fieldDomain = dataset->GetFieldDomain(fieldName);if (fieldDomain == nullptr){// 如果字段没有定义域,返回空指针std::cout << "Field '" << fieldName << "' has no domain defined." << std::endl;}

AddFieldDomain

virtual bool AddFieldDomain(std::unique_ptr<OGRFieldDomain> &&domain, std::string &failureReason)

将字段属性域添加到数据集

参数:

  • domain -- 域定义。

  • failureReason -- 输出参数。如果发生错误,将包含错误消息。

返回:  在成功的情况下为TURE

    GDALDataset* dataset = static_cast<GDALDataset*>(GDALOpen("path_to_your_dataset", GA_Update));// 创建字段属性域对象std::unique_ptr<OGRFieldDomain> domain = std::make_unique<OGRFieldDomain>();// 设置字段属性域信息domain->SetName("your_domain_name"); // 替换为您要设置的域名称domain->SetType(OFTInteger); // 替换为您要设置的域类型,这里设置为整数类型domain->SetMin("1"); // 替换为您要设置的最小值domain->SetMax("10"); // 替换为您要设置的最大值// 添加字段属性域到数据集std::string failureReason;bool success = dataset->AddFieldDomain(std::move(domain), failureReason);if (success){std::cout << "Field domain added successfully." << std::endl;}else{std::cout << "Failed to add field domain. Reason: " << failureReason << std::endl;}

 

DeleteFieldDomain

virtual bool DeleteFieldDomain(const std::string &name, std::string &failureReason)

从数据集中移除字段属性域

参数:

  • domain -- 域名。

  • failureReason -- 输出参数。如果发生错误,将包含错误消息。

返回:  在成功的情况下为TURE

    // 打开数据集GDALAllRegister();GDALDataset* dataset = static_cast<GDALDataset*>(GDALOpen("path_to_your_dataset", GA_Update));// 要移除的字段属性域的名称std::string fieldName = "your_domain_name"; // 替换为您要移除的字段属性域的名称// 移除字段属性域从数据集std::string failureReason;bool success = dataset->DeleteFieldDomain(fieldName, failureReason);if (success){std::cout << "Field domain '" << fieldName << "' removed successfully." << std::endl;}else{std::cout << "Failed to remove field domain. Reason: " << failureReason << std::endl;}// 释放资源并关闭数据集GDALClose(dataset);

 

UpdateFieldDomain

virtual bool UpdateFieldDomain(std::unique_ptr<OGRFieldDomain> &&domain, std::string &failureReason)

通过替换现有字段属性域的定义来更新其定义

参数:

  • domain -- 域名。

  • failureReason -- 输出参数。如果发生错误,将包含错误消息。

返回:  在成功的情况下为TURE

    GDALDataset* dataset = static_cast<GDALDataset*>(GDALOpen("path_to_your_dataset", GA_Update));// 创建字段属性域对象并设置要更新的信息std::unique_ptr<OGRFieldDomain> domain = std::make_unique<OGRFieldDomain>();domain->SetName("your_domain_name"); // 替换为您要更新的字段属性域的名称domain->SetType(OFTInteger); // 替换为您要更新的域类型,这里设置为整数类型domain->SetMin("5"); // 替换为您要更新的最小值domain->SetMax("20"); // 替换为您要更新的最大值// 更新字段属性域信息std::string failureReason;bool success = dataset->UpdateFieldDomain(std::move(domain), failureReason);if (success){std::cout << "Field domain updated successfully." << std::endl;}else{std::cout << "Failed to update field domain. Reason: " << failureReason << std::endl;}

GetRelationshipNames

virtual std::vector<std::string> GetRelationshipNames(CSLConstList papszOptions = NULLPTR) const

返回数据集中存储的所有关系的名称列表

参数:

papszOptions -- 确定应如何检索关系的驱动程序特定选项。传递默认行为的空点。

返回:  关系名称列表

    // 获取数据集中所有关系的名称列表std::vector<std::string> relationshipNames = dataset->GetRelationshipNames();// 输出关系的名称列表if (!relationshipNames.empty()){std::cout << "Relationship names in the dataset:" << std::endl;for (const auto& relationshipName : relationshipNames){std::cout << "  " << relationshipName << std::endl;}}else{std::cout << "No relationships found in the dataset." << std::endl;}

GetRelations

virtual const GDALRelationship *GetRelations(const std::string &name) const

从其名称中获取关系

返回:  返回关系,如果未找到,则为 nullPTR

    // 要获取的关系的名称std::string relationshipName = "your_relationship_name"; // 替换为您要获取的关系的名称// 获取指定名称的关系的信息const GDALRelationship* relationship = dataset->GetRelations(relationshipName);if (relationship != nullptr){// 输出关系的信息std::cout << "Relationship Name: " << relationship->GetName() << std::endl;std::cout << "Source Dataset: " << relationship->GetSourceDataset() << std::endl;std::cout << "Target Dataset: " << relationship->GetTargetDataset() << std::endl;// 可以根据需要获取其他关系信息}else{std::cout << "Relationship with name '" << relationshipName << "' not found in the dataset." << std::endl;}

AddRelationship

virtual bool AddRelationship(std::unique_ptr<GDALRelationship> &&relationship, std::string &failureReason)

向数据集添加关系

参数:

  • relationship -- 关系定义

  • failureReason -- 输出参数。如果发生错误,将包含错误消息

返回:  在成功的情况下为TURE

    // 创建关系对象并设置要添加的信息std::unique_ptr<GDALRelationship> relationship = std::make_unique<GDALRelationship>();relationship->SetName("your_relationship_name"); // 替换为您要添加的关系的名称relationship->SetSourceDataset("source_dataset_name"); // 替换为源数据集的名称relationship->SetTargetDataset("target_dataset_name"); // 替换为目标数据集的名称// 可以根据需要设置其他关系信息// 向数据集添加关系std::string failureReason;bool success = dataset->AddRelationship(std::move(relationship), failureReason);if (success){std::cout << "Relationship added successfully." << std::endl;}else{std::cout << "Failed to add relationship. Reason: " << failureReason << std::endl;}

DeleteRelationship

virtual bool DeleteRelationship(const std::string &name, std::string &failureReason)

从数据集中删除关系

参数:

  • name -- 关系名称

  • failureReason -- 输出参数。如果发生错误,将包含错误消息

返回:  在成功的情况下为TURE

    // 要删除的关系的名称std::string relationshipName = "your_relationship_name"; // 替换为您要删除的关系的名称// 从数据集中删除指定名称的关系std::string failureReason;bool success = dataset->DeleteRelationship(relationshipName, failureReason);if (success){std::cout << "Relationship '" << relationshipName << "' deleted successfully." << std::endl;}else{std::cout << "Failed to delete relationship. Reason: " << failureReason << std::endl;}

UpdateRelationship

virtual bool UpdateRelationship(std::unique_ptr<GDALRelationship> &&relationship, std::string &failureReason)

通过替换现有关系的定义来更新现有关系        将替换具有匹配名称的现有关系

参数:

  • relationship -- 关系定义

  • failureReason -- 输出参数。如果发生错误,将包含错误消息

返回:  在成功的情况下为TURE

    // 创建关系对象并设置要更新的信息std::unique_ptr<GDALRelationship> relationship = std::make_unique<GDALRelationship>();relationship->SetName("your_relationship_name"); // 替换为您要更新的关系的名称relationship->SetSourceDataset("new_source_dataset_name"); // 替换为新的源数据集的名称relationship->SetTargetDataset("new_target_dataset_name"); // 替换为新的目标数据集的名称// 可以根据需要设置其他关系信息// 更新数据集中现有关系的信息std::string failureReason;bool success = dataset->UpdateRelationship(std::move(relationship), failureReason);if (success){std::cout << "Relationship updated successfully." << std::endl;}else{std::cout << "Failed to update relationship. Reason: " << failureReason << std::endl;}


http://www.ppmy.cn/news/1001839.html

相关文章

小研究 - 领域驱动设计DDD在IT企业内部网站开发中的运用(二)

在企业内部网站的建设过程中&#xff0c;网站后端最初采用传统的表模式的开发方式。这种方式极易导致站点的核心业务逻辑和业务规则分布在架构的各个层和对象中&#xff0c;这使得系统业务逻辑的复用性不高。为了解决这个问题&#xff0c;作者在后期的开发过程中引入了领域驱动…

套接字通信的客户端和服务端的实现

知识了解&#xff1a; 1.IP:本质是一个整型数&#xff0c;用于表示计算机在网络中的地址。IP协议版本有两个&#xff1a;IPv4和IPv6 IPv4&#xff08;Internet Protocol version4&#xff09;: 使用一个32位的整型数描述一个IP地址&#xff0c;4个字节&#xff0c;int型也可以…

华为OD机试真题 Java 实现【寻找最大价值的矿堆】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、Java算法源码五、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多…

Dockerfile构建LNMP镜像(yum方式)

目录 Dockerfile构建LNMP镜像 1、建立工作目录 2、编写Dockerfile文件 3、构建镜像 4、测试容器 5、浏览器访问测试&#xff1a; Dockerfile构建LNMP镜像 1、建立工作目录 [roothuyang1 ~]# mkdir lnmp/ [roothuyang1 ~]# cd lnmp/ 2、编写Dockerfile文件 [roothuyang1 …

【计算机网络】NAT及Bridge介绍

OSI七层模型 七层模型介绍及举例 为通过网络将人类可读信息通过网络从一台设备传输到另一台设备&#xff0c;必须在发送设备沿 OSI 模型的七层结构向下传输数据&#xff0c;然后在接收端沿七层结构向上传输数据。 数据在 OSI 模型中如何流动 库珀先生想给帕尔梅女士发一封电…

STSP中用于记录节点和旅行回路的四种数据结构

STSP中用于记录节点和旅行回路的四种数据结构 双链表结构2-level tree卫星结构k-level卫星结构树参考文献 对于TSP是是历史悠久的研究问题&#xff0c;直至现在已经有了很多成熟高效的算法来求解问题。在拥有好的求解算法的同时&#xff0c;优秀的数据结构可以同时大幅提升问题…

zabbix简易入门:基本的网络监控、WEB监控

我们越来越发现&#xff1a;网络越来越复杂&#xff0c;网络、应用、云端……故障点随时可能发生&#xff0c;而我们不能人工盯着所有的问题&#xff0c;所以&#xff0c;网管软件是必须的。那么没有预算的情况下&#xff0c;我们只好自己布署简单的网管软件了。 zabbix网站上可…

Requests模块怎么设置字符编码

Requests模块在发出网络请求时,支持设置字符编码,主要有以下两种方式: 在请求头中设置字符编码 可以通过headers参数设置字符编码,例如: import requestsurl http://www.example.comheaders {user-agent: my-app/0.0.1,Accept-Encoding: utf-8}resp requests.get(url, he…