使用GDAL创建含投影信息的影像,地理坐标系为WGS 84,通过SetGeoTransform设置影像的左上角经纬度位置以及分辨率、OGRSpatialReference设置投影信息(参考)。
//头文件
#include "gdal_priv.h"
#pragma comment(lib,"gdal_i.lib")
#include "ogr_geometry.h"
//函数
bool createImage(const char* outputpath, int bandnum,
double longitude, double latitude,
double radius, double pixel)
{
// outputpath 输出路径
// bandnum 波段数
// longitude 经度
// latitude 纬度
// radius 半径, 2 * radius + 1 为影像的宽
// pixel 像元分辨率(度)
GDALAllRegister();
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
const char* type=("GTiff");
GDALDriver *poDriver = GetGDALDriverManager() -> GetDriverByName(type);
int nImgWidth = 2 * radius + 1;
int nImgHeight = 2 * radius + 1;
double lonmax, lonmin, latmax, latmin;
lonmax = longitude + radius * pixel;
lonmin = longitude - radius * pixel;
latmax = latitude + radius * pixel;
latmin = latitude - radius * pixel;
GDALDataset *poDS = poDriver -> Create(outputpath, nImgWidth,
nImgHeight, bandnum, GDT_Float32, NULL);
double adfGeoTransform[6] = {0, 1, 0, 0, 0, 1};
adfGeoTransform[0] = lonmin;
adfGeoTransform[3] = latmax;
adfGeoTransform[1] = pixel;
adfGeoTransform[5] = -pixel;
adfGeoTransform[2] = 0;
adfGeoTransform[4] = 0;
//如果图像不含地理坐标信息,默认返回值是:(0,1,0,0,0,1)
//左上角点坐标(padfGeoTransform[0],padfGeoTransform[3]);
//padfGeoTransform[1]是像元宽度(影像在宽度上的分辨率);
//padfGeoTransform[5]是像元高度(影像在高度上的分辨率);
//如果影像是指北的,padfGeoTransform[2]和padfGeoTransform[4]这两个参数的值为0。
poDS->SetGeoTransform(adfGeoTransform);
float *band1 = new float [nImgWidth * nImgHeight];
//影像的初始值为0.0
memset(band1, 0.0, nImgWidth * nImgHeight * sizeof(float));
for (int i = 0; i < bandnum; ++i)
poDS -> GetRasterBand(i + 1) -> RasterIO(GF_Write, 0, 0, nImgWidth, nImgHeight,
band1, nImgWidth, nImgHeight, GDT_Float32, 0, 0);
OGRSpatialReference oSRS;
char *pszSRS_WKT = NULL;
//oSRS.SetUTM(35, TRUE);
oSRS.SetWellKnownGeogCS("WGS84");
oSRS.exportToWkt(&pszSRS_WKT);
poDS -> SetProjection(pszSRS_WKT);
CPLFree(pszSRS_WKT);//使用完后释放
GDALClose(poDS);
delete [] band1;
return true;
};
在main函数中执行以下语句:
int main(int argc, char* argv[])
{
const char* outputpath = "data//test1.tif";
int bandnum = 1; //波段数设为1,单波段
double lon = 104.595144; //经度
double lat = 30.359144; //纬度
double radius = 200; //半径像元数
double pixel = 0.00900901; //单位为度,赤道处1度约为111km
if(createImage(outputpath, bandnum, lon, lat, radius, pixel) == false)
{
printf("create image fail.\n");
return -1;
}
return 0;
}