关键点:从无到有,凭空创建一个有地理位置信息的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()设置投影转换参数信息。
待完善。