GDAL C++ API 学习之路 (1)Driver篇 代码示例 翻译 自学
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篇 代码示例 翻译 自学相关推荐
- alin的学习之路(数据库篇:五)(MySQL的相关语句及API的C语言实现)
alin的学习之路(数据库篇:五)(MySQL的相关语句及API的C语言实现) 1. MySQL概述与登陆MySQL mysql 与 oracle 的区别 oracle 是一个数据库实例下有多个用户, ...
- 学计算机之路写一篇作文,我的学习之路作文(2篇)
我的学习之路作文(2篇) 在我们平凡的日常里,大家对作文都再熟悉不过了吧,作文根据写作时限的不同可以分为限时作文和非限时作文.那要怎么写好作文呢?以下是小编整理的我的学习之路作文,仅供参考,欢迎大家阅 ...
- alin的学习之路(数据库篇:二)(select查询,where条件查询,order by排序,单行函数,多行函数,group by分组)
alin的学习之路(数据库篇:二)(select查询,where条件查询,order by排序,单行函数,多行函数,group by分组) 1. SQL语句 1.1 sql语言类型 sql是一门独立的 ...
- 个人开发经历--我的java学习之路(学校篇)
个人开发经历--我的java学习之路(学校篇) 个人介绍: 姓名: 不在这里说明 联系信息: 个人历程 jdbc阶段 sql生成器 一代代码生成器 servlet阶段 servlet项目中,sql生成 ...
- alin的学习之路(数据库篇:三)(多表查询,子查询,集合运算,数据处理)
alin的学习之路(数据库篇:三)(多表查询,子查询,集合运算,数据处理) 1. 多表查询 1.1 笛卡儿积 笛卡尔积就是两个集合的乘积计算 . 如果多个表进行联合查询, 得到结果是一个笛卡尔积, 举 ...
- Vue学习之路(基础篇)
Vue学习之路(基础篇)
- pyqt5从子目录加载qrc文件_【JVM系统学习之路】一篇看懂类加载
JVM系统学习之路系列演示代码地址:https://github.com/mtcarpenter/JavaTutorial 嗨喽,小伙伴大家好,我是小春哥,今天是打卡 [JVM系统学习之路] 的第二篇 ...
- Extjs5.0 学习之路【资源篇】
磨刀不误砍柴工. 先收集资源,然后再开始学习之路. Extjs5.0 文件下载 API-5.0 API离线包 http://cdn.sencha.com/downloads/docs/ext-docs ...
- Python学习之路【第一篇】-Python简介和基础入门
1.Python简介 1.1 Python是什么 相信混迹IT界的很多朋友都知道,Python是近年来最火的一个热点,没有之一.从性质上来讲它和我们熟知的C.java.php等没有什么本质的区别,也是 ...
最新文章
- 打马赛克就安全了吗?AI消除马赛克,GitHub开源项目上线三天收获近7000星
- codeforces700B
- yum lock 解决方法
- Session的实现与存储
- leetcode1442. 形成两个异或相等数组的三元组数目
- The authors of these two monitoring tools
- Python-web框架 fastapi
- mysql数据库怎容器化_数据库部署是否合适容器化?
- python嵌套字典的建立_python学习之第八篇——字典嵌套之字典中嵌套字典
- 软件工程导论知识点总结
- 在VUE中实现城市及对应的地区的联动渲染
- 浅析物联网行业市场最新发展趋势
- Tensorboard远程连接
- 数字信号处理实验二:DFT的共轭对称性及应用
- iptables禁止访问某个域名
- 解决Ubuntu屏幕分辨率不正常问题
- 聊聊GIS中那些坐标系(转)
- 硬盘函数不正确怎么解决
- 拍照翻译的软件有什么?不妨试试这几款好用的软件
- 【Unity3D 灵巧小知识点】 ☀️ | 切换场景后保留上个场景中的游戏物体不被销毁
热门文章
- 数据,模型,算法共同决定深度学习模型效果
- Android性能:内存篇之内存回收
- Quartus II建立新工程流程,Quartus如何建立工程?
- 使用QuickBI制作企业报表门户
- SCI论文各部分的写作原则与注意点
- Python用正则表达式根据格式匹配成语,如:AABB,AABC,ABAC......
- 深入了解String和intern
- C# 事件函数参数(object sender, EventArgs e)
- php+flash头像上传组件
- adb操作提示Read-only file system问题