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 
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++,开源)