BuildOverviews
CPLErr BuildOverviews(const char*, int, const int*, int, const int*, GDALProgressFunc, void*, CSLConstList papszOptions) 此方法与 C 函数 GDALBuildOverviewsEx() 相同
构建栅格概览
参数:
-
pszResampling – 控制所应用的下采样方法
-
nResampling – 要构建的概览数,或 0 以清理概览。
-
panOverviewList – 要构建的概览抽取因子列表,如果 nOverviews == 0,则为 NULL。
-
nListBands – 要在 panBandList 中构建概览的波段数。如果此值为 0,则为所有波段构建。
-
panBandList ― 乐队编号列表。
-
pfnProgress – 用于调用以报告进度或 NULL 的函数。
-
pProgressData – 要传递给进度函数的应用程序数据。
-
papszOptions – (GDAL >= 3.6) NULL 终止的选项列表作为键=值对,或 NULL
返回: CE_None成功或CE_Failure如果操作不起作用
pszResampling
最邻近采样(Nearest Neighbour):即在输入栅格数据上选取与输出栅格数据最近的像素值作为输出像素值。最邻近采样是速度最快的一种采样方法,但是在对连续变化的数据进行预览时,其输出结果可能会有明显的锯齿状。
双线性插值(Bilinear Interpolation):双线性插值方法是一种基于四个最近邻像素值加权平均的方法,用于计算输出像素值。这种方法相对于最邻近采样方法来说会更加平滑,但是速度略慢。
三次卷积(Cubic Convolution):三次卷积方法是一种基于16个最近邻像素值的插值方法,与双线性插值相比,它能够更加准确地插值。但是其计算量比较大,速度也相应地慢一些。
平均值采样(Average):平均值采样方法是一种简单的像素均值计算方法,它会计算在输入栅格数据中所有像素值的平均值,并将该平均值作为输出像素值。这种方法的主要优点是速度非常快,但是可能会导致输出图像的细节丢失。
还有"AVERAGE_MAGPHASE"、“立方体”、“立方样”、“高斯”、“兰索斯”、“模式”或“无”
GDALDataset* poSrcDS = (GDALDataset*)GDALOpen("input.tif", GA_ReadOnly);
int nOverviews = 4;
int panOverviewList[] = { 2, 4, 8, 16 };
// 构建预览图
CPLErr err = poSrcDS->BuildOverviews("NEAREST", nOverviews, panOverviewList, 0, NULL, GDALDummyProgress, NULL, NULL);
panOverview 是一个泛概述列表(因子)
上例的代码中,2,4,8,16分别代表了第一、二、三、四不同的级别,每个级别的像素数是前一个级别的四倍。因此,如果原始图像的大小为1024x1024像素,第一级别的大小将是512x512像素,第二级别的大小将是256x256像素,以此类推,直到第八级别的大小为2x2像素
GetMetadata
virtual char **GetMetadata(const char *pszDomain = "") override 表示该函数重写了基类中的同名函数 此方法与 C 函数 GDALGetMetadata() 执行相同的操作
参数:
pszDomain – 感兴趣的域。使用“”或 NULL 作为默认域。
返回: NULL 或字符串列表
char **metadata = dataset->GetMetadata();
if (metadata != nullptr) {
for (int i = 0; metadata[i] != nullptr; i++) {
// 遍历元数据
printf("%s\n", metadata[i]);
}
}
//使用 CPL StringList 函数(如 CSLFetchNameValue() 来操作它
const char* pszDescription = CSLFetchNameValue(metadata, "Description");
// 输出名为"Description"的键的值
printf("Description: %s\n", pszDescription);
AREA_OR_POINT=Area
BandDefinitionKeyword=*
DataType=*Description: (null)
SetMetadata
virtual CPLErr SetMetadata(char **papszMetadata, const char *pszDomain) override C 函数 GDALSetMetadata() 与此方法执行相同的操作
设置元数据
参数:
-
papszMetadata – 要应用的名称=值字符串列表格式的元数据。
-
pszDomain – 感兴趣的域。使用“”或 NULL 作为默认域。
返回: CE_None成功时,CE_Failure失败时,CE_Warning元数据是否已被接受,但可能不会由会话之间的基础对象永久维护。
char *papszMetadata[] = {"DESCRIPTION=This is a test image", "AUTHOR=John Doe", NULL};
poDS->SetMetadata(papszMetadata, "IMAGE_STRUCTURE");
SetMetadataItem
virtual CPLErr SetMetadataItem(const char *pszName, const char *pszValue, const char *pszDomain)override C 函数 GDALSetMetadataItem() 与此方法执行相同的操作
设置单个元数据项
参数:
-
pszName – 要提取的元数据项的键。
-
pszValue – 要分配给键的值。
-
pszDomain – 要在其中设置的域,使用 NULL 作为默认域。
返回: 成功时CE_None,失败时错误代码。
poDS->SetMetadataItem("DESCRIPTION", "This is a test image");
poDS->SetMetadataItem("AUTHOR", "John Doe", "IMAGE_STRUCTURE");
GLOBAL
: 全局元数据,适用于整个数据集。RPC
: 存储了一些与有理多项式相关的元数据,通常用于遥感图像数据。GEOLOCATION
: 存储了一些与地理位置相关的元数据,通常用于将栅格数据与地理位置信息相对应。COLOR_TABLE
: 存储了与颜色表相关的元数据,通常用于存储栅格数据的颜色表信息。IMAGE_STRUCTURE
: 存储了一些与栅格数据结构相关的元数据,如数据块大小、压缩参数等。
GetMetadataDomainList
virtual char **GetMetadataDomainList() override 此方法与 C 函数 GDALGetMetadataDomainList() 执行相同的操作
返回: NULL 或字符串列表。必须使用 CSLDestroy() 释放
GDALDataset* poDataset = static_cast<GDALDataset*>(GDALOpen("path/to/raster/file", GA_ReadOnly));
char** papszMetadataDomains = poDataset->GetMetadataDomainList();
cout << "Metadata domains:" << endl;
for (char** ppMetadataDomain = papszMetadataDomains; *ppMetadataDomain != nullptr; ppMetadataDomain++) {
cout << "- " << *ppMetadataDomain << endl;
}
// 释放资源
CSLDestroy(papszMetadataDomains);
GDALClose(poDataset);
ClearStatistics
virtual void ClearStatistics() 与 C 函数 GDALDatasetClearStatistics() 相同
清晰的统计数据 目前仅在 PAM 支持的数据集中实现
GetLayerCount
virtual int GetLayerCount() 此方法与 C 函数 GDALDatasetGetLayerCount() 和已弃用的 OGR_DS_GetLayerCount() 相同
获取此数据集中的图层数
返回: 层数
GetLayer
virtual OGRLayer *GetLayer(int iLayer)
按索引获取图层
参数:
iLayer – 介于 0 和 GetLayerCount()-1 之间的层数。
返回: 图层,如果 iLayer 超出范围或发生错误,则为 NULL
OGRLayer *poLayer = poDS->GetLayer(0);
返回的层仍归 GDALDataset 所有,应用程序不应删除该层
获取到的 GDALRasterLayer 对象属于 GDALDataset 对象的一个指针,由 GDALDataset 对象管理和销毁。如果应用程序删除该层,可能会导致 GDALDataset 对象指向已被删除的内存,从而导致错误
OGRLayer会在矢量API部分的OGRLayer C++ API 详细学习:
IsLayerPrivate
virtual bool IsLayerPrivate(int iLayer) const 此方法与 C 函数 GDALDatasetIsLayerPrivate() 相同
如果指定索引处的图层被视为私有表或系统表,或者仅被视为内部详细信息
参数:
iLayer – 介于 0 和 GetLayerCount()-1 之间的层数。
返回: 如果图层是专用表或系统表,则为 true
poLayer = poDS->GetLayer(0);
// 检查层是否私有
if (poLayer->IsLayerPrivate()) {
printf("Layer is private.\n");
} else {
printf("Layer is not private.\n");
}
GetLayers
Layers GetLayers() GetLayer() 的C++迭代器友好版本
在数据集中的图层上返回可迭代对象的函数
int nLayers = poDS->GetLayerCount();
printf("图层数量:%d\n", nLayers);
// 获取图层列表并进行迭代
GDALDataset::LayerIterator iter = poDS->GetLayers();
for (int i = 0; i < nLayers; i++, iter++) {
OGRLayer* poLayer = iter;
printf("图层 %d 名称:%s\n", i, poLayer->GetName());
}
GetLayerByName
virtual OGRLayer *GetLayerByName(const char*) 此方法与 C 函数 GDALDatasetGetLayerByName() 和已弃用的 OGR_DS_GetLayerByName() 相同
按名称获取图层
参数:
pszName – 要获取的图层的图层名称。
返回: 图层,如果未找到图层或发生错误,则为 NULL
GDALDataset* poDS = (GDALDataset*) GDALOpen("example.tif", GA_ReadOnly);
OGRLayer *poLayer = poDS->GetLayerByName("example_layer");
if (poLayer == NULL) {
printf("Layer not found\n");
} else {
printf("Layer found!\n");
}
DeleteLayer
virtual OGRErr DeleteLayer(int iLayer) 此方法与 C 函数 GDALDatasetDeleteLayer() 和已弃用的 OGR_DS_DeleteLayer() 相同
从数据源中删除指示的图层
参数:
iLayer – 要删除的图层的索引。
返回: 成功时OGRERR_NONE,如果此数据源不支持删除图层,则OGRERR_UNSUPPORTED_OPERATION
GDALDataset* poDataset;
int nLayerIndex = 0; //要删除的图层索引
OGRLayer* poLayer = poDataset->GetLayer(nLayerIndex);
if (poLayer != NULL) {
poDataset->DeleteLayer(nLayerIndex);
delete poLayer;
}
ResetReading
virtual void ResetReading() 此方法与 C 函数 GDALDatasetResetReading() 相同
重置特征读取以从第一个特征开始 该函数可以将指针指向图层中第一个特征的位置