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

开头

紧接着第2章未完成的,继续GDALDataset 的API学习

GetGeoTransform

virtual CPLErr GetGeoTransform(double *padfTransform)         此方法与 C GDALGetGeoTransform() 函数执行相同的操作

参数:  padfTransform – 一个现有的六个双缓冲区,转换将被放置到其中。

返回: CE_None成功时,或者CE_Failure无法获取转换             默认变换为 (0,1,0,0,0,1),即使返回CE_Failure错误(例如不支持转换为投影坐标的格式),也应返回默认变换。

double adfGeoTransform[6];         //定义了一个大小为 6 的双精度浮点型数组
dataset->GetGeoTransform(adfGeoTransform);       //函数将会将获取到的地理变换参数值存储到这个数组中

无论使用一维数组还是二维数组,都需要保证数组大小至少为6,以存储6个变换系数

地理变换参数的含义如下

  1. adfGeoTransform[0]:左上角的 X 坐标,即图像左上角像素的地理坐标的 X 坐标值。
  2. adfGeoTransform[1]:图像的水平分辨率,即每个像素在 X 方向上的实际宽度。
  3. adfGeoTransform[2]:X 方向上的旋转角度,通常为 0,即图像平行于 X 轴。
  4. adfGeoTransform[3]:左上角的 Y 坐标,即图像左上角像素的地理坐标的 Y 坐标值。
  5. adfGeoTransform[4]:Y 方向上的旋转角度,通常为 0,即图像平行于 Y 轴。
  6. adfGeoTransform[5]:图像的垂直分辨率,即每个像素在 Y 方向上的实际高度,通常为负数,表示 Y 轴坐标值的减小方向是从上到下。

其中,前两个参数(左上角的 X 坐标和图像的水平分辨率)用于计算像素的地理坐标的 X 坐标值,后两个参数(左上角的 Y 坐标和图像的垂直分辨率)用于计算像素的地理坐标的 Y 坐标值,中间两个参数(X 方向上的旋转角度和 Y 方向上的旋转角度)通常为 0,表示图像没有旋转。 

具体操作:http://t.csdn.cn/ADkbN

SetGeoTransform

virtual CPLErr SetGeoTransform(double *padfTransform)             此方法与 C GDALSetGeoTransform() 函数执行相同的操作

设置仿射变换系数

参数:padfTransform – 一个六双精度缓冲区,其中包含要与数据集一起写入的转换系数。

返回:CE_None成功,如果无法写入此转换,则CE_Failure。

double adfGeoTransform[2][3] = {{pixelWidth, 0, xOrigin}, {0, pixelHeight, yOrigin}};
poDataset->SetGeoTransform(adfGeoTransform[0]);

AddBand

virtual CPLErr AddBand(GDALDataType eType, char **papszOptions = nullptr)

参数:eType – 新波段中像素的数据类型。

        papszOptions – NAME=VALUE 选项字符串的列表。支持的选项特定于格式。默认情况下可能传递 NULL。

返回:CE_None成功或CE_Failure失败

在成功完成后并不会直接返回新的GDALRasterBand对象指针,而是需要使用GDALDataset::GetRasterBand(GDALDataset::GetRasterCount())方法获取新添加的波段。因为新添加的波段始终是数据集的最后一个波段,而GetRasterCount()方法可以返回当前数据集的波段数量。所以,通过这种方法可以获取到新添加的波段的指针,然后再进行后续的读写操作等

 GDALDataset* poDS = static_cast(GDALOpen("example.tif", GA_Update));
 poDS->AddBand(GDT_Byte, NULL);
 GDALRasterBand* poBand = poDS->GetRasterBand(poDS->GetRasterCount() + 1);

papszOptions

  1. “PIXELTYPE={BYTE/UINT16/INT16/UINT32/INT32/FLOAT32/FLOAT64/CPL_STRING}”:设置像素类型。默认为 BYTE。
  2. “INTERLEAVE={ BAND / PIXEL }”:设置波段排列方式。默认为 BAND,表示按波段排列。

  3. “COMPRESS={ NONE / LZW / JPEG / DEFLATE / ZSTD / PACKBITS }”:设置压缩方式。默认为 NONE。

  4. “PHOTOMETRIC={ MINISBLACK / MINISWHITE / RGB / PALETTE / CIELAB / ICCLAB / ITULAB / YCBCR }”:设置波段颜色编码方式。默认为 MINISBLACK。

  5. “NBITS=n”:设置像素的位数。n 可以为 1 到 64。默认为 8

  6. “BLOCKXSIZE=n” 和 “BLOCKYSIZE=n”:设置块的大小。默认为 256。

  7. “TILED=YES”:启用瓦片模式。默认为 BAND 模式。

  8. “BIGTIFF=YES”:启用 BigTIFF 格式。默认为普通 TIFF 格式。

GetInternalHandle

virtual void *GetInternalHandleconst char *pszHandleName)            此方法与 C GDALGetInternalHandle() 方法相同

提取特定于格式的内部有意义的句柄

参数: pszHandleName – 所需的句柄名称。有意义的名称将特定于文件格式。

返回: 所需的句柄值,如果无法识别/支持,则为 NULL

Handle:

  • “METADATA”: 光栅波段的元数据句柄,用于存储和访问数据集的描述性信息,例如名称、作者、时间戳、坐标参考系统、地理变换信息等。
  • “IMAGE_STRUCTURE”: 光栅波段的影像结构句柄,用于存储和访问影像的附加结构信息,例如压缩类型、块大小、缩略图等。

  • “RPC”: 光栅波段的RPC(Rational Polynomial Coefficients)模型句柄,用于存储和访问RPC模型信息,该模型可用于对图像进行几何校正和重投影

  • “GCP”: 光栅波段的GCP(Ground Control Points)模型句柄,用于存储和访问GCP模型信息,该模型可用于对图像进行几何校正和重投影。

  • “DIMENSION”: 光栅波段的尺寸信息句柄,用于存储和访问波段的像素宽度、高度和深度等信息。

  • “NBITS”: 光栅波段的位深度句柄,用于存储和访问波段的位深度信息,例如8位、16位、32位等。

  • “SCALE”: 光栅波段的比例尺句柄,用于存储和访问波段的比例尺信息,例如像素宽度和高度的比例尺。

  • “OFFSET”: 光栅波段的偏移量句柄,用于存储和访问波段的偏移量信息,例如像素坐标的偏移量。

GetDriver

virtual GDALDriver *GetDriver(void)       此方法与 C GDALGetDatasetDriver() 函数相同

提取与此数据集相关的驱动程序

返回:GDALDriver类的指针

const char* filepath = "example.tif";

// 打开数据集
dataset = (GDALDataset*) GDALOpen(filepath, GA_ReadOnly);

// 获取数据集所使用的驱动程序的指针
driver = dataset->GetDriver();

// 输出驱动程序的名称
printf("Driver name: %s\n", driver->GetDescription());

GetFileList

virtual char **GetFileList(void)            此方法与 C GDALGetFileList() 函数相同

获取形成数据集的文件  

返回:NULL 或以 NULL 结尾的文件名数组

获取当前数据集所包含的文件列表,是指获取一个数据集所有文件的路径列表,这些文件通常包含该数据集的各个组成部分或属性。在地理空间数据处理中,数据集通常不是一个单独的文件,而是由多个文件组成的,每个文件存储数据集的不同部分或属性。例如,多波段遥感影像数据通常由多个单波段影像文件组成,矢量数据则可能由多个.shp、.dbf、.shx等文件组成。使用GetFileList函数可以获取数据集的所有文件路径,以便在需要时对其进行读取、写入或复制等操作

 GDALDataset* poDataset = (GDALDataset*)GDALOpen("sample.tif", GA_ReadOnly);
 char** papszFileList = poDataset->GetFileList();
 CSLDestroy(papszFileList);

GetDriverName

virtual const char *GetDriverName(

返回驱动程序名称

返回:驱动程序名称

 GDALDataset* poDataset = (GDALDataset*)GDALOpen("sample.tif", GA_ReadOnly);
 // 获取驱动程序名称
 const char* pszDriverName = poDataset->GetDriverName();
 cout << "Dataset is using driver: " << pszDriverName << endl;

持续更新,下次继续GCP

你可能感兴趣的:(GDAL,学习,c++)