紧接着第2章未完成的,继续GDALDataset 的API学习
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个变换系数
地理变换参数的含义如下
- adfGeoTransform[0]:左上角的 X 坐标,即图像左上角像素的地理坐标的 X 坐标值。
- adfGeoTransform[1]:图像的水平分辨率,即每个像素在 X 方向上的实际宽度。
- adfGeoTransform[2]:X 方向上的旋转角度,通常为 0,即图像平行于 X 轴。
- adfGeoTransform[3]:左上角的 Y 坐标,即图像左上角像素的地理坐标的 Y 坐标值。
- adfGeoTransform[4]:Y 方向上的旋转角度,通常为 0,即图像平行于 Y 轴。
- adfGeoTransform[5]:图像的垂直分辨率,即每个像素在 Y 方向上的实际高度,通常为负数,表示 Y 轴坐标值的减小方向是从上到下。
其中,前两个参数(左上角的 X 坐标和图像的水平分辨率)用于计算像素的地理坐标的 X 坐标值,后两个参数(左上角的 Y 坐标和图像的垂直分辨率)用于计算像素的地理坐标的 Y 坐标值,中间两个参数(X 方向上的旋转角度和 Y 方向上的旋转角度)通常为 0,表示图像没有旋转。
具体操作:http://t.csdn.cn/ADkbN
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]);
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
- “PIXELTYPE={BYTE/UINT16/INT16/UINT32/INT32/FLOAT32/FLOAT64/CPL_STRING}”:设置像素类型。默认为 BYTE。
“INTERLEAVE={ BAND / PIXEL }”:设置波段排列方式。默认为 BAND,表示按波段排列。
“COMPRESS={ NONE / LZW / JPEG / DEFLATE / ZSTD / PACKBITS }”:设置压缩方式。默认为 NONE。
“PHOTOMETRIC={ MINISBLACK / MINISWHITE / RGB / PALETTE / CIELAB / ICCLAB / ITULAB / YCBCR }”:设置波段颜色编码方式。默认为 MINISBLACK。
“NBITS=n”:设置像素的位数。n 可以为 1 到 64。默认为 8
“BLOCKXSIZE=n” 和 “BLOCKYSIZE=n”:设置块的大小。默认为 256。
“TILED=YES”:启用瓦片模式。默认为 BAND 模式。
“BIGTIFF=YES”:启用 BigTIFF 格式。默认为普通 TIFF 格式。
virtual void *GetInternalHandle(const 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”: 光栅波段的偏移量句柄,用于存储和访问波段的偏移量信息,例如像素坐标的偏移量。
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());
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);
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