读取影像并获取相关影像参数
#include "gdal_priv.h"
#include<iostream>
#include "cpl_conv.h"
#include "cpl_string.h"
int main()
{
const char* pszFilename = "E:\\gdal\\osgeopy-data\\osgeopy-data-landsat-washington\\osgeopy-data\\Landsat\\Washington\\p047r027_7t20000730_z10_nn10.tif";
GDALDatasetUniquePtr poDataset;
GDALAllRegister();
const GDALAccess eAccess = GA_ReadOnly;
poDataset = GDALDatasetUniquePtr(GDALDataset::FromHandle(GDALOpen(pszFilename, eAccess)));
if (!poDataset)
{
fprintf(stderr, "GDALOpen failed - %s\n", CPLGetLastErrorMsg());
}
double adfGeoTransform[6];
printf("Driver: %s/%s\n",
poDataset->GetDriver()->GetDescription(),
poDataset->GetDriver()->GetMetadataItem(GDAL_DMD_LONGNAME));
printf("Size is %dx%dx%d\n",
poDataset->GetRasterXSize(), poDataset->GetRasterYSize(),
poDataset->GetRasterCount());
if (poDataset->GetProjectionRef() != NULL)
printf("Projection is `%s'\n", poDataset->GetProjectionRef());
if (poDataset->GetGeoTransform(adfGeoTransform) == CE_None)
{
printf("Origin = (%.6f,%.6f)\n",
adfGeoTransform[0], adfGeoTransform[3]);
printf("Pixel Size = (%.6f,%.6f)\n",
adfGeoTransform[1], adfGeoTransform[5]);
}
GDALRasterBand* poBand;
int nBlockXSize, nBlockYSize;
int bGotMin, bGotMax;
double adfMinMax[2];
poBand = poDataset->GetRasterBand(1);
poBand->GetBlockSize(&nBlockXSize, &nBlockYSize);
printf("Block=%dx%d Type=%s, ColorInterp=%s\n",
nBlockXSize, nBlockYSize,
GDALGetDataTypeName(poBand->GetRasterDataType()),
GDALGetColorInterpretationName(
poBand->GetColorInterpretation()));
adfMinMax[0] = poBand->GetMinimum(&bGotMin);
adfMinMax[1] = poBand->GetMaximum(&bGotMax);
if (!(bGotMin && bGotMax))
GDALComputeRasterMinMax((GDALRasterBandH)poBand, TRUE, adfMinMax);
printf("Min=%.3fd, Max=%.3f\n", adfMinMax[0], adfMinMax[1]);
if (poBand->GetOverviewCount() > 0)
printf("Band has %d overviews.\n", poBand->GetOverviewCount());
if (poBand->GetColorTable() != NULL)
printf("Band has a color table with %d entries.\n",
poBand->GetColorTable()->GetColorEntryCount());
float* pafScanline;
int nXSize = poBand->GetXSize();
int nYSize = poBand->GetYSize();
pafScanline = (float*)CPLMalloc(sizeof(float) * nXSize* nYSize);
poBand->RasterIO(GF_Read, 0, 0, nXSize, nYSize,
pafScanline, nXSize, nYSize, GDT_Float32,
0, 0);
const char* pszFormat = "GTiff";
GDALDriver* poDriver;
char** papszMetadata;
poDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);
if (poDriver == NULL)
exit(1);
papszMetadata = poDriver->GetMetadata();
if (CSLFetchBoolean(papszMetadata, GDAL_DCAP_CREATE, FALSE))
printf("Driver %s supports Create() method.\n", pszFormat);
if (CSLFetchBoolean(papszMetadata, GDAL_DCAP_CREATECOPY, FALSE))
printf("Driver %s supports CreateCopy() method.\n", pszFormat);
const char* newFilename = "E:\\gdal\\osgeopy-data\\osgeopy-data-landsat-washington\\osgeopy-data\\Landsat\\Washington\\new.tif";
GDALDataset* poSrcDS =(GDALDataset*)GDALOpen(pszFilename, GA_ReadOnly);
GDALDataset* poDstDS;
char** papszOptions = NULL;
papszOptions = CSLSetNameValue(papszOptions, "TILED", "YES");
papszOptions = CSLSetNameValue(papszOptions, "COMPRESS", "PACKBITS");
poDstDS = poDriver->CreateCopy(newFilename, poSrcDS, FALSE,
papszOptions, GDALTermProgress, NULL);
if (poDstDS != NULL)
GDALClose((GDALDatasetH)poDstDS);
CSLDestroy(papszOptions);
GDALDataset* hDstDS;
char** papszOptions_new = NULL;
GDALAllRegister();
const char* pszDstFilename = "E:\\gdal\\osgeopy-data\\osgeopy-data-landsat-washington\\osgeopy-data\\Landsat\\Washington\\a.tif ";
GDALDriver* hDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);
char** papszOption = NULL;
papszOption = CSLSetNameValue(papszOption, "TILED", "YES");
papszOption = CSLSetNameValue(papszOption, "COMPRESS", "PACKBITS");
hDstDS = poDriver->Create(pszDstFilename, 512, 512, 1, GDT_Byte,
papszOption);
double adfGeoTransform_new[6] = { 444720, 30, 0, 3751320, 0, -30 };
OGRSpatialReference oSRS;
char* pszSRS_WKT = NULL;
GDALRasterBand* poBand_new = NULL;
GByte abyRaster[512 * 512];
hDstDS->SetGeoTransform(adfGeoTransform_new);
oSRS.SetUTM(11, TRUE);
oSRS.SetWellKnownGeogCS("NAD27");
oSRS.exportToWkt(&pszSRS_WKT);
hDstDS->SetProjection(pszSRS_WKT);
CPLFree(pszSRS_WKT);
poBand_new = hDstDS->GetRasterBand(1);
poBand_new->RasterIO(GF_Write, 0, 0, 512, 512,
abyRaster, 512, 512, GDT_Byte, 0, 0);
GDALClose((GDALDatasetH)hDstDS);
return 0;
}
// GDALDatasetH指向一个指针类型, GDALDataset* 指针类型;
如果使用GDALDatasetH数据类型来指向一个GDALDataset*的类函数会提示:表达式必须包含指向类的指针类型
可以适用强制类型转换,对两种类型进行转换
GDALDataset *poDstDS;
char **papszOptions = NULL;
poDstDS = poDriver->Create( pszDstFilename, 512, 512, 1, GDT_Byte,
papszOptions );
GDALDatasetH hDstDS;
char **papszOptions = NULL;
hDstDS = GDALCreate( hDriver, pszDstFilename, 512, 512, 1, GDT_Byte,
papszOptions );