对于栅格或矢量影像的读取并显示出来在前面的文章中已经写出,显示方面可以参考前面的文章。在这个文章中主要写的是把栅格影像读取出来后,若是对其进行了处理后如何把栅格波段保存成为TIF格式的文件。
如果学习过GDAL的话就很容易理解,和GDAL的保存成TIF文件差不多,下面是具体的代码与步骤,可以作为参考:
1.首先是获取栅格图层
QgsRasterLayer *result = new QgsRasterLayer(tmpName, QStringLiteral("result"));
if (! result->isValid())
{
QMessageBox::information(NULL, "提示", "计算失败,公式有误");
return;
}
// 显示输出结果在画布中(如果没有创建画布可以不要这一行)
QgsProject::instance()->addMapLayer(result);
2.获取仿射矩阵
// 创建输出文件的仿射矩阵
QgsRectangle extent_result = result->extent();
int nCols = result->width();
int nRows = result->height();
qDebug() << nCols << endl << nRows << endl;
double tform[] =
{
extent_result.xMinimum(),extent_result.width() / nCols,0.0,
extent_result.yMaximum(),0.0,-extent_result.height() / nRows
};
//获取波段的数据类型
Qgis::DataType DT = result->dataProvider()->dataType(1);
3.创建一个输出文件的壳(没有像元数据 )
//QString outFile = ui.lineE_outFile->text();
QString outFile = "E:/my_outFile.tif";
qDebug() << "输出名:" << outFile << endl;
QgsRasterDataProvider *dp = QgsRasterDataProvider::create(QStringLiteral("gdal"),
outFile,
QStringLiteral("GTiff"),
1,
DT,
nCols,
nRows,
tform,
result->crs()
);
4.创建块,将像元数据导入到输出文件中
QgsRasterBlock *block = result->dataProvider()->block(1,result->extent(),nCols,nRows);
bool res = dp->writeBlock(block, 1);
if (1 != res)
{
QMessageBox::critical(NULL, "警告", "影像块创建失败"); return;
}
delete block;// 这两一定要释放,不然程序不关闭,图像block导入不了
delete dp;
这一步要注意了,block与dp这两个指针一定要释放掉,不然在程序关闭之前像元的值不会导入到输出文件中。
总结:
上面的代码基本上是保存成TIF格式的所以的代码了,在下面就不附上总的代码了。(因为这段代码是我总程序的一段,如果附上完整的代码还需要整理,太麻烦了,偷个懒,嘻嘻.........,其实上面的代码也很简单都能看懂)