GDAL在初始化时会默认注册一些常用的驱动程序,例如GeoTIFF、BMP、JPEG等,因此如果我们使用的是这些常用的驱动程序,就不需要再手动注册了。不过,为了确保程序的兼容性和稳定性,我们仍然建议在程序中手动注册所需的驱动程序。
GDALAllRegister()是一个GDAL库函数,它用于注册所有可用的GDAL驱动程序
GDALAllRegister();
将驱动程序注册到进程中的操作只需要执行一次,通常在应用程序初始化时执行
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
:数据集的联系组织
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)
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()
是为了将数据集缓存中的内容刷新到硬盘上,从而保证数据集中的数据与磁盘一致。当我们对数据集进行修改时,比如写入、更新或删除数据,这些修改会首先存在内存中的数据集缓存中,而尚未被写入硬盘,这时如果直接关闭数据集,则可能会导致数据丢失或者不完整。
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
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()
获取数据集的原始名称
CPLErr CopyFiles(const char *pszNewName, const char *pszOldName)
复制数据集的文件 等效于 C 函数 GDALCopyDatasetFiles()
参数:
pszNewName – 数据集的新名称。
pszOldName – 数据集的旧名称。
返回: 成功时CE_None,如果操作失败,则CE_Failure
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); // 关闭数据集
static inline GDALDriverH ToHandle(GDALDriver *poDriver ) 将 GDALDriver* 转换为 GDALDriverH
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
使用 GetGDALDriverManager() 获取此类的全局单例实例
int GetDriverCount(void) const 这个C类比是GDALGetDriverCount()
获取已注册驱动程序的数量
参数:无参
返回:已注册驱动程序的数量
GDALDriver * GetDriver(int) 这个C类比是GDALGetDriver()
按索引获取驱动程序
参数:iDriver – 从 0 到 GetDriverCount()
-1 的驱动程序索引。
返回:由索引标识的驱动程序,如果索引无效,则为 NULL
示例:
#include "gdal_priv.h"
#include
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;
}
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()); // 打印驱动程序信息
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"
void DeregisterDriver(GDALDriver*) C 是 GDALDeregisterDriver()
取消注册传递的驱动程序
如果未找到驱动程序,则不会进行任何更改
参数:poDriver – 要取消注册的驱动程序
GDALAllRegister(); // 注册所有UDAL支持的文件类型
GDALDriver *jpegDriver = GetGDALDriverManager()->GetDriverByName("JPEG"); // 获取JPEG驱动
DeregisterDriver(jpegDriver); // 注销驱动
持续更新中...........