初学GDAL,根据老师所给的学习代码在本文进行记录和总结
读取与写入代码
#include <gdal_priv.h>
int main()
{
GDALAllRegister();
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
const char* Filepath
= "./data/test.tif";
GDALDataset
* poDataset
= (GDALDataset
*)GDALOpen(Filepath
, GA_ReadOnly
);
int width
= poDataset
->GetRasterXSize();
int height
= poDataset
->GetRasterYSize();
int nCount
= poDataset
->GetRasterCount();
const char* Projection
= poDataset
->GetProjectionRef();
double adfGeo
[6];
poDataset
->GetGeoTransform(adfGeo
);
GDALDataType gdal_datatype
= poDataset
->GetRasterBand(1)->GetRasterDataType();
unsigned char* Data
= new unsigned char[width
* height
* nCount
];
int pBandMap
[3] = { 1,2,3 };
poDataset
->RasterIO(GF_Read
, 0, 0, width
, height
, Data
, width
, height
, gdal_datatype
, nCount
, pBandMap
, 0, 0, 0);
GDALRasterBand
* poBand
= poDataset
->GetRasterBand(1);
unsigned char* pData
= new unsigned char[width
* height
];
poBand
->RasterIO(GF_Read
, 0, 0, width
, height
, pData
, width
, height
, gdal_datatype
, 0, 0, 0);
GDALDriver
* poDriver
= GetGDALDriverManager()->GetDriverByName("GTiff");
const char* pszDstFilename
= "./data/out.tif";
GDALDataset
* poDstDS
= poDriver
->Create(pszDstFilename
, width
, height
, nCount
, gdal_datatype
, NULL);
poDstDS
->RasterIO(GF_Write
, 0, 0, width
, height
, Data
, width
, height
, gdal_datatype
,nCount
, pBandMap
, 0, 0, 0);
poDstDS
->GetRasterBand(1)->RasterIO(GF_Write
, 0, 0, width
, height
, pdata
, width
, height
, gdal_datatype
,0, 0);
GDALClose(poDataset
);
GDALClose(poDstDS
);
delete[] Data
;
delete[] pData
;
}
图像所在位置
代码中采用相对路径 ,针对工程文件(*.vcxproj),用反斜杠表示:"./"代表源文件目前所在的目录,"../"代表上级目录。
影像六参数
即影像的左上角的地理坐标adfGeo[0],adfGeo[3],影像的行列号分辨率adfGeo[1],adfGeo[5],以及影像相对于正北方向的旋转角度,可通过影像六参数将影像坐标(x,y)转换到地理坐标(X,Y) X=adfGeo[0]+adfGeo[1]*x+adfGeo[2]*y; Y=adfGeo[3]+adfGeo[4]*x+adfGeo[5]*y;
RasterIO函数参数说明
第一个参数用来指定是读取数据还是写入数据,其值只能为GF_Read或GF_Write. 第二个和第三个表示读取或写入的影像的起始点坐标,影像的左上角坐标为(0,0) 第四个和第五个分别为读取或写入影像数据的窗口大小 第六个参数pData是指向存储数据的指针 第七个和第八个参数指定缓冲区的大小,即pData的大小为两者的积,默认等于第四个参数和第五个参数 第九个参数为影像的数据类型 第十个参数为影像的波段数 第十一个参数为影像的排列顺序
GDALDataType
代码中测试影像数据类型为GDT_Byte,对应C++中unsigned char类型,除此外还有如下数据类型: GDT_UInt16 : 16bit正整型 (C++中对应 unsigned short) GDT_Int16 : 16bit整型 (C++中对应 short 或 short int) GDT_CInt16 : 16bit复整型 (C++中对应Complex Int16) GDT_UInt32 : 32bit 正整型 (C++中对应unsigned long) GDT_Int32 : 32bit整型 (C++中对应int 或 long 或 long int) GDT_CInt32 : 32bit复整型 (C++中对应Complex Int32) GDT_Float32 : 32bit 浮点型 (C++中对应float) GDT_CFloat32 : 32bit复浮点型 (C++中对应Complex Float32) GDT_Float64 : 64bit 浮点型 (C++中对应double) GDT_CFloat64 : 64bit复浮点型 (C++中对应Complex Float64)