GDALDriver  Class        “gdal_priv.h / gdal.h”

默认注册

GDAL在初始化时会默认注册一些常用的驱动程序,例如GeoTIFF、BMP、JPEG等,因此如果我们使用的是这些常用的驱动程序,就不需要再手动注册了。不过,为了确保程序的兼容性和稳定性,我们仍然建议在程序中手动注册所需的驱动程序。

GDALAllRegister()

GDALAllRegister()是一个GDAL库函数,它用于注册所有可用的GDAL驱动程序

 GDALAllRegister();

将驱动程序注册到进程中的操作只需要执行一次,通常在应用程序初始化时执行

SetMetadataItem

virtual CPLErr SetMetadataItem(const char *pszName, const char *pszValue, const char *pszDomain = “”)      设置单个元数据项

 C 函数 GDALSetMetadataItem() 与此方法执行相同的操作

参数:

  • pszName – 要提取的元数据项的键。

  • pszValue – 要分配给键的值。

  • pszDomain – 要在其中设置的域,使用 NULL 作为默认域。

返回: 成功时CE_None,失败时错误代码。

    const char* filename = "ataset.tif";GDALDataset* poDataset = (GDALDataset*)GDALOpen(filename, GA_ReadOnly);poDataset->SetMetadataItem("AUTHOR", "changzhu");  // 设置作者元数据poDataset->SetMetadataItem("DATE", "2023-03-25");  // 设置时间元数据poDataset->SetMetadataItem("CLASSIFICATION", "Unclassified");  //设置分类

常用的键:

  • AUTHOR: 数据集作者的名称;
  • DATE: 数据集生成日期;
  • DESCRIPTION:数据集的描述信息;
  • KEYWORDS:数据集相关的关键词,以逗号分隔;
  • AREA_OR_COUNTRY: 数据集的地理区域或国家;
  • PROJCS:数据集的投影坐标系;
  • LAYER_NAME:数据集的图层名称;
  • CRS:数据集的坐标参考系统;
  • SOURCE:数据集的来源或原始提供者;
  • CONTACT_PERSON:数据集的联系人;
  • CONTACT_ORGANIZATION:数据集的联系组织

Create

GDALDataset *Create(const char *pszName, int nXSize, int nYSize, int nBands,GDALDataType eType, CSLConstList papszOptions)     使用此驱动程序创建新数据集

处理完返回的数据集后,需要使用 GDALClose() 将其关闭      等效于 C 函数 GDALCreate()

参数:

  • psz文件名 – 要创建的数据集的名称。UTF-8 编码。

  • nXSize – 所创建栅格的宽度(以像素为单位)。

  • nYSize – 创建的栅格的高度(以像素为单位)。

  • n波段 – 波段数。

  • eType – 栅格类型。

  • papsz选项 ― 驱动程序特定控制参数的列表。可以指定 APPEND_SUBDATASET=YES 选项以避免事先销毁现有数据集。

返回: 失败时为 NULL,或新的 GDALDataset。

    GDALAllRegister();GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName("GTiff");// 创建新数据集const char* pszFilename = "example.tiff";GDALDataset* poDstDs = poDriver->Create(pszFilename, 512, 512, 1, GDT_Byte, NULL);GDALClose(poDstDS);    //关闭数据集

eType

GDT_Byte 表示 8 位无符号整型数据类型,每个像素占用 1 个字节。这种数据类型可以支持从 0 到 255 的整数值,用于存储相对低灰度级别或分类数据等。

GDAL 中还提供了许多其他的数据类型,如 GDT_UInt16、GDT_Int16、GDT_UInt32、GDT_Float32、GDT_Float64 等。每个数据类型都具有不同的存储大小和数值范围,可以根据实际应用的需要进行选择。

GDALClose(poDstDS)

C++支持类型推断,可以在声明指针时,根据指针所指向的对象的类型,自动推断指针的类型

所以,GDALClose(poDstDS)在C中是不可用的,需要使用  GDALClose((GDALDatasetH) poDstDS)

CreateMultiDimensional

GDALDataset *CreateMultiDimensional(const char *pszName, CSLConstList papszRootGroupOptions, CSLConstList papszOptions)     

使用此驱动程序创建新的多维数据集         与 C 函数 GDALCreateMultiDimensional() 相同

参数:

  • pszFilename – 要创建的数据集的名称。UTF-8 编码。

  • papszRootGroupOptions – 有关创建根组的驱动程序特定选项。可能是空的。

  • papszOptions – 有关创建数据集的驱动程序特定选项。可能是空的。

返回: 新数据集,或在失败时为 nullptr

     const char* pszName = "multi_dimensional.nc";   // 创建多维数据集GDALDataset *poDataset = CreateMultiDimensional(pszName, NULL, NULL);poDataset->FlushCache();       //刷新缓存GDALClose(poDataset);         // 关闭数据集

FlushCache()

是为了将数据集缓存中的内容刷新到硬盘上,从而保证数据集中的数据与磁盘一致。当我们对数据集进行修改时,比如写入、更新或删除数据,这些修改会首先存在内存中的数据集缓存中,而尚未被写入硬盘,这时如果直接关闭数据集,则可能会导致数据丢失或者不完整。

Delete

CPLErr Delete(const char *pszName)     等效于 C 函数 GDALDeleteDataset()

删除命名数据集

参数:  pszFilename – 要删除的数据集的名称。

返回:  成功时CE_None,如果操作失败,则CE_Failure

    GDALAllRegister();   //注册驱动GDALDataset* poDataset = (GDALDataset*) GDALOpen("dataset", GA_Update);    // 打开数据集CPLErr err = poDataset->Delete("path/to/dataset");    // 删除数据集if (err != CE_None){printf("Delete dataset failed.\n");GDALClose(poDataset);return -1;}GDALClose(poDataset);

 CPLErr 

CPLErr类型的返回值通常用于GDAL库函数。函数将返回上述的五个常量中的一个,它们指示函数是否成功执行。

  • CE_None
  • CE_Debug
  • CE_Warning
  • CE_Failure
  • CE_Fatal

Rename

CPLErr Rename(const char *pszNewName, const char *pszOldName)   

相当于 C 函数 GDALRenameDataset()

 重命名数据集

参数:

  • pszNewName – 数据集的新名称。

  • pszOldName – 数据集的旧名称。

返回:   成功时CE_None,如果操作失败,则CE_Failure。

    GDALAllRegister();    // 注册所有GDAL驱动程序GDALDataset* poDataset = (GDALDataset*)GDALOpen("dataset", GA_Update);    // 打开数据集const char* new_name = "new_dataset_name";               //设置新名字const char* old_name = poDataset->GetDescription();     //获取旧名字CPLErr err = poDataset->Rename(new_name,old_name);      // 重命名数据集if (err != CE_None){printf("Rename dataset failed.\n");GDALClose(poDataset);return -1;}GDALClose(poDataset);

GetDescription()

获取数据集的原始名称

CopyFiles

CPLErr CopyFiles(const char *pszNewName, const char *pszOldName)       

复制数据集的文件             等效于 C 函数 GDALCopyDatasetFiles()

参数:

  • pszNewName – 数据集的新名称。

  • pszOldName – 数据集的旧名称。

返回: 成功时CE_None,如果操作失败,则CE_Failure

CreateCopy

GDALDataset*CreateCopy(const char*, GDALDataset*, int, CSLConstList papszOptions, GDALProgressFunc pfnProgress, void *pProgressData)     创建数据集的副本

参数:

  • psz文件名 – 新数据集的名称。UTF-8 编码。

  • poSrcDS – 需要被复制的数据集。

  • bStrict – 如果副本必须严格等效,则为 TRUE,或者更常见的是 FALSE,表示副本可以根据输出格式的需要进行调整。

  • papszOptions – 控制输出文件创建的附加格式相关选项。可以指定 APPEND_SUBDATASET=YES 选项以避免事先销毁现有数据集。

  • pfnProgress ー用于报告副本进度的函数。

  • pProgressData – 传递到进度函数的应用程序数据。

返回: 指向新创建的数据集的指针(可能是只读访问)

    GDALAllRegister();GDALDataset* poSrcDS = (GDALDataset*)GDALOpen("dataset——old", GA_ReadOnly);  // 打开原始数据集GDALDriver* poDriver = GetGDALDriverManager()->GetDriverByName("GTiff");   // 创建输出数据集的驱动程序对象GDALDataset* poDstDS = poDriver->CreateCopy("dataset_new", poSrcDS, FALSE, NULL, NULL, NULL);   // 创建新的输出数据集CPLErr err = poSrcDS->CopyFiles("dataset_new", "dataset_old");    // 通过复制操作将原始数据集复制到新的数据集中if (err != CE_None){printf("Copy dataset failed.\n");GDALClose(poSrcDS);GDALClose(poDstDS);return 1;}GDALClose(poSrcDS);      // 关闭数据集GDALClose(poDstDS);      // 关闭数据集

GDALDriverH ToHandle

static inline GDALDriverH ToHandle(GDALDriver *poDriver )    将 GDALDriver* 转换为 GDALDriverH

FromHandle

static inline GDALDriver *FromHandle(GDALDriverH hDriver)  将 GDALDriverH 转换为 GDALDriver*

// 将 GDALDriverH 类型的句柄转换为 GDALDriver* 类型的指针
GDALDriverH driver_handle = GDALGetDriverByName("GTiff");
GDALDriver* driver_ptr = (GDALDriver*) driver_handle;// 将 GDALDriver* 类型的指针转换为 GDALDriverH 类型的句柄
GDALDriver* driver_ptr2 = GetGDALDriverManager()->GetDriverByName("GTiff");
GDALDriverH driver_handle2 = GDALDriverToHandle(driver_ptr2);// 使用 GDALDriverH 类型的句柄创建 GeoTIFF 数据集
GDALDriverH driver_handle3 = GDALGetDriverByName("GTiff");
GDALDatasetH dataset_handle = GDALCreate(driver_handle3, "output.tif", 512, 512, 1, GDT_Byte, NULL);

注:

GDALCreate是GDAL C API提供的函数,而Create是OGR C++ API提供的函数

此处在其它文章中有详细讲解:http://t.csdn.cn/Wtnp0

GDALDriverManager     用于管理文件格式驱动程序注册的类

使用 GetGDALDriverManager() 获取此类的全局单例实例

公共方法

GetDriverCount

int GetDriverCount(void) const          这个C类比是GDALGetDriverCount()

获取已注册驱动程序的数量  

参数:无参

返回:已注册驱动程序的数量

GetDriver

GDALDriver * GetDriver(int)               这个C类比是GDALGetDriver()

按索引获取驱动程序

参数:iDriver – 从 0 到 GetDriverCount()
-1 的驱动程序索引。

返回:由索引标识的驱动程序,如果索引无效,则为 NULL

示例:

#include "gdal_priv.h"
#include <iostream>
using namespace std;int main()
{GDALAllRegister();         //注册所有已知驱动GDALDriverManager* manager = GetDriverManager();     //实例管理驱动类cout << "There are " << manager->GetDriverCount() << " GDAL driver(s) available:" << endl;for (int i = 0; i < manager->GetDriverCount(); i++)   //for循环遍历每个已注册的驱动程序{GDALDriver* driver = manager->GetDriver(i);if (driver != NULL) {cout << "-" << driver->GetDescription() << endl;   //GetDescription()可以获取改驱动的名称} }GDALDestroyDriverManager();     //释放内存return 0;
}

GetDriverByName

GDALDriver*GetDriverByName(const char*)        C  GDALGetDriverByName() 函数

根据短名称提取驱动程序

参数:pszName – 要搜索的短名称,例如 GTiff。

返回:标识的驱动程序,如果未找到匹配项,则为 NULL。

    const char* driverName = "GTiff";  // 指定驱动程序名称GDALDriver* driver = GetDriverByName(driverName);  // 获取驱动程序对象if (driver == nullptr){printf("无法获取驱动程序: %s\n", driverName);exit(EXIT_FAILURE);}printf("驱动程序名称: %s\n", driver->GetDescription());     // 打印驱动程序信息

RegisterDriver

int RegisterDriver(GDALDriver*)            C 是 GDALGetDriverByName() 函数

注册驱动程序以供使用

如果此驱动程序(基于对象指针,而不是短名称)已注册,则不会进行任何更改,并返回现有驱动程序的索引。否则,将扩展驱动程序列表,并在末尾添加新驱动程序。

参数:poDriver – 要注册的驱动程序。

返回:新安装的驱动程序的索引。

    GDALAllRegister();   // 注册所有UDAL支持的文件类型GDALDriver *jpegDriver = GetGDALDriverManager()->GetDriverByName("JPEG");   // 获取JPEG驱动RegisterDriver(jpegDriver);     // 注册驱动

常见的GDAL驱动程序

  • GeoTIFF: "GTiff"
  • JPEG: "JPEG"
  • PNG: "PNG"
  • GIF: "GIF"
  • BMP: "BMP"
  • MrSID: "MrSID"
  • Erdas Imagine格式: "HFA"
  • ENVI格式: "ENVI"
  • NetCDF(科学数据格式): "netCDF"
  • HDF(层次数据格式): "HDF4" 或 "HDF5"
  • ESRI文件地理库: "OpenFileGDB" 或 "FileGDB"

DeregisterDriver

void DeregisterDriver(GDALDriver*)               C 是 GDALDeregisterDriver()

取消注册传递的驱动程序

如果未找到驱动程序,则不会进行任何更改

参数:poDriver – 要取消注册的驱动程序

    GDALAllRegister();   // 注册所有UDAL支持的文件类型GDALDriver *jpegDriver = GetGDALDriverManager()->GetDriverByName("JPEG");   // 获取JPEG驱动DeregisterDriver(jpegDriver);     // 注销驱动

持续更新中...........

GDAL C++ API 学习之路 (1)Driver篇 代码示例 翻译 自学相关推荐

  1. alin的学习之路(数据库篇:五)(MySQL的相关语句及API的C语言实现)

    alin的学习之路(数据库篇:五)(MySQL的相关语句及API的C语言实现) 1. MySQL概述与登陆MySQL mysql 与 oracle 的区别 oracle 是一个数据库实例下有多个用户, ...

  2. 学计算机之路写一篇作文,我的学习之路作文(2篇)

    我的学习之路作文(2篇) 在我们平凡的日常里,大家对作文都再熟悉不过了吧,作文根据写作时限的不同可以分为限时作文和非限时作文.那要怎么写好作文呢?以下是小编整理的我的学习之路作文,仅供参考,欢迎大家阅 ...

  3. alin的学习之路(数据库篇:二)(select查询,where条件查询,order by排序,单行函数,多行函数,group by分组)

    alin的学习之路(数据库篇:二)(select查询,where条件查询,order by排序,单行函数,多行函数,group by分组) 1. SQL语句 1.1 sql语言类型 sql是一门独立的 ...

  4. 个人开发经历--我的java学习之路(学校篇)

    个人开发经历--我的java学习之路(学校篇) 个人介绍: 姓名: 不在这里说明 联系信息: 个人历程 jdbc阶段 sql生成器 一代代码生成器 servlet阶段 servlet项目中,sql生成 ...

  5. alin的学习之路(数据库篇:三)(多表查询,子查询,集合运算,数据处理)

    alin的学习之路(数据库篇:三)(多表查询,子查询,集合运算,数据处理) 1. 多表查询 1.1 笛卡儿积 笛卡尔积就是两个集合的乘积计算 . 如果多个表进行联合查询, 得到结果是一个笛卡尔积, 举 ...

  6. Vue学习之路(基础篇)

    Vue学习之路(基础篇)

  7. pyqt5从子目录加载qrc文件_【JVM系统学习之路】一篇看懂类加载

    JVM系统学习之路系列演示代码地址:https://github.com/mtcarpenter/JavaTutorial 嗨喽,小伙伴大家好,我是小春哥,今天是打卡 [JVM系统学习之路] 的第二篇 ...

  8. Extjs5.0 学习之路【资源篇】

    磨刀不误砍柴工. 先收集资源,然后再开始学习之路. Extjs5.0 文件下载 API-5.0 API离线包 http://cdn.sencha.com/downloads/docs/ext-docs ...

  9. Python学习之路【第一篇】-Python简介和基础入门

    1.Python简介 1.1 Python是什么 相信混迹IT界的很多朋友都知道,Python是近年来最火的一个热点,没有之一.从性质上来讲它和我们熟知的C.java.php等没有什么本质的区别,也是 ...

最新文章

  1. 打马赛克就安全了吗?AI消除马赛克,GitHub开源项目上线三天收获近7000星
  2. codeforces700B
  3. yum lock 解决方法
  4. Session的实现与存储
  5. leetcode1442. 形成两个异或相等数组的三元组数目
  6. The authors of these two monitoring tools
  7. Python-web框架 fastapi
  8. mysql数据库怎容器化_数据库部署是否合适容器化?
  9. python嵌套字典的建立_python学习之第八篇——字典嵌套之字典中嵌套字典
  10. 软件工程导论知识点总结
  11. 在VUE中实现城市及对应的地区的联动渲染
  12. 浅析物联网行业市场最新发展趋势
  13. Tensorboard远程连接
  14. 数字信号处理实验二:DFT的共轭对称性及应用
  15. iptables禁止访问某个域名
  16. 解决Ubuntu屏幕分辨率不正常问题
  17. 聊聊GIS中那些坐标系(转)
  18. 硬盘函数不正确怎么解决
  19. 拍照翻译的软件有什么?不妨试试这几款好用的软件
  20. 【Unity3D 灵巧小知识点】 ☀️ | 切换场景后保留上个场景中的游戏物体不被销毁

热门文章

  1. 数据,模型,算法共同决定深度学习模型效果
  2. Android性能:内存篇之内存回收
  3. Quartus II建立新工程流程,Quartus如何建立工程?
  4. 使用QuickBI制作企业报表门户
  5. SCI论文各部分的写作原则与注意点
  6. Python用正则表达式根据格式匹配成语,如:AABB,AABC,ABAC......
  7. 深入了解String和intern
  8. C# 事件函数参数(object sender, EventArgs e)
  9. php+flash头像上传组件
  10. adb操作提示Read-only file system问题