使用C++和GDAL新建影像(地理坐标系)

使用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;
}

输出结果(创建影像的默认像元值为0,故为黑色):
在这里插入图片描述
欢迎大家批评指正!

发布了35 篇原创文章 · 获赞 37 · 访问量 4274

猜你喜欢

转载自blog.csdn.net/L_J_Kin/article/details/103403122