gdal创建有地理位置信息的GeoTIF

关键点:从无到有,凭空创建一个有地理位置信息的tif,高程值自己指定。

先贴所有代码。

#include
using namespace std;

#include "gdal_priv.h"
#include "ogr_spatialref.h"
#pragma comment(lib,"gdal_i.lib")

int main()
{
	CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");//支持中文路径
	GDALAllRegister();  //注册所有的驱动
	//写tiff测试
	GDALDriver *pDriver = GetGDALDriverManager()->GetDriverByName("GTIFF"); //图像驱动
	char** ppszOptions = NULL;
	ppszOptions = CSLSetNameValue(ppszOptions, "BIGTIFF", "IF_NEEDED"); //配置图像信息
	/*ppszOptions = pDriver->GetMetadata();
	if (CSLFetchBoolean(ppszOptions, GDAL_DCAP_CREATE, FALSE))
		printf("Driver %s supports Create() method.\n", "GTIFF");
	if (CSLFetchBoolean(ppszOptions, GDAL_DCAP_CREATECOPY, FALSE))
		printf("Driver %s supports CreateCopy() method.\n", "GTIFF");*/
	
	//创建图像
	int bufWidth = 2652;  //图像X尺寸
	int bufHeight = 1343;  //图像Y尺寸
	int bandNum = 1;//波段数
	int depth = 4;//图像深度
	GDALDataset* dst = pDriver->Create("D:\\tifftest\\e.tiff", bufWidth, bufHeight, bandNum, GDT_Float32, ppszOptions);
	if (dst == nullptr)
	{
		printf("Can't Write Image!");
		return 0;
	}
	double a[6] = { 55.8,0.034693633,0,13.52,0,0.034693633 };
	dst->SetGeoTransform(a);
	
	OGRSpatialReference oSRS;//该类需要#include "ogr_spatialref.h"头文件
	char *pszSRS_WKT = NULL;
	//oSRS.SetProjCS("UTM 17 /WGS84");
	//oSRS.SetUTM(17,TRUE);
	oSRS.SetWellKnownGeogCS("WGS84");
	oSRS.exportToWkt(&pszSRS_WKT);
	dst->SetProjection(pszSRS_WKT);
	CPLFree(pszSRS_WKT);
	
	//获取图像波段
	GDALRasterBand *poBand1;
	poBand1 = dst->GetRasterBand(1);
	if (poBand1==NULL)
	{
		printf("poBand is null!");
		return 0;
	}

	size_t BufNum = (size_t)1 * 1 * bandNum*depth;
	float* tifBuf = new float[BufNum*bufWidth*bufHeight];
	for (size_t i = 0; i < bufWidth*bufHeight; i++)
	{
		tifBuf[i] = 1.0;
	}
	poBand1->RasterIO(GF_Write, 0, 0, bufWidth, bufHeight, tifBuf, bufWidth, bufHeight, GDT_Float32, 0, 0);
	delete[] tifBuf;
	//for (int i = 0; i < bufWidth; i++)
	//{
	//	for (size_t j = 0; j < bufHeight; j++)
	//	{
	//		size_t BufNum = (size_t)1 * 1 * bandNum*depth;
	//		float* tifBuf = new float[BufNum];
	//		*tifBuf = 0;
	//		if (j > 400 && j < 600)
	//		{
	//			*tifBuf = 3;
	//		}
	//		poBand1->RasterIO(GF_Write, i, j, 1, 1, tifBuf, 1, 1, GDT_Float32, 0, 0);
	//		//释放
	//		delete[] tifBuf;
	//		tifBuf = nullptr;
	//	}
	//}

	GDALClose(dst);
	system("pause");
}

需要理解完善的地方:代码中ppszOptions相关内容,oSRS相关内容。比如oSRS.SetProjCS("UTM 17 /WGS84")和oSRS.SetUTM(17,TRUE)放开注释后生成的tif文件在ArcMap中加载看到地理位置不太合理。

oSRS相关的几个方法解释:SetProjCS()函数设置投影坐标系统的名称,SetWellKnownGeogCS()指定地理坐标系统,SetUTM()设置投影转换参数信息。

待完善。

你可能感兴趣的:(gdal,Geotif)