Bootstrap

9.2 栅格图层符号化单波段灰度渲染

前言

单波段灰度

  • 以“3420C_2010_327_RGB_LATLNG.tif”数据为例,在QGis中加载默认显示如下图
    在这里插入图片描述

QGis设置为单波段灰度

  • 在图层属性的“Symbology”选项卡中选择“Render type”为“Singleband gray”,如图所示
    在这里插入图片描述
  • 在“Gray band”中选择需要渲染的波段;在“Color gradient”中选择渐变方向,包括从黑色到白色(Black to white)和从白色到黑色(White to Black)两种方式。
  • 在“Contrast enhancement”中选择对比度增强方法,包括无增强(No enhancement)、拉伸到最小值和最大值之间的范围(Stretch to MinMax)、拉伸并裁剪到最小值和最大值之间的范围(Stretch and clip to MinMax)、裁剪到最小值和最大值之间的范围(Clip to MinMax)。经过裁剪后,超出范围的像元将不显示在地图画布上;反之,则显示为黑色或白色。
  • 在“Min”和“Max”中输入渐变区域的最小值和最大值,或者通过“Min / Max ValueSettings”中的四个选项进行自动设置。
    • User defined:用户自定义最大值和最小值。
    • Cumulative count Cut:按照数值从小到大排列,仅保留一定百分比内的数值,去除可能存在的异常值。
    • Min / max:设置为波段内数值的最小值或最大值。
    • Mean +/- standard deviation:取平均值左右两侧一个标准差范围内的数值,以及μ- σ与μ+σ之间的数值(μ表示平均值,σ表示标准差)。
    • 在“Statistics extent”中选择上述设置的统计范围,包括整个影像(Whole raster)、当前范围(Current canvas)和随范围变化(Updated canvas)。随范围变化指当用户改变地图范围时,栅格数据渲染的最大值和最小值也随之变化。
    • 在“Accuracy”中选择最大值和最小值的计算精度,包括估计(较快)[Estimate (faster)]和精确(较慢)[Actual (slower)]两种。
  • “Layer Rendering”选项区域设置显示效果,包括混合模式(Blending mode)、亮度(Brightness)、对比度(Contrast)、饱和度(Saturation)、灰阶(Grayscale)等。
  • 在“Resampling”选项区域可以设置显示效果的重采样方法,包括上采样(放大地图时插值数据)和下采样(缩小地图时抽取数据)两种。上采样(Zoom in)包括最邻近法(Nearest neighbour)、双线性法(Bilinear)和三次立方法(Cubic);下采样(Zoom out)包括最邻近法(Nearest neighbour)和平均值法(Average)。另外,还可以在“Oversampling”中选择过采样系数(默认为2,使用最邻近法时无效)。通常,默认的最邻近法渲染速度最快,但是使用双线性法(Bilinear)和三次立方法(Cubic)时渲染效果更好。
  • 属性设置完成后,图层渲染效果如下图
    在这里插入图片描述

二次开发代码实现单波段灰度

  • QgsSingleBandGrayRenderer是单波段灰度渲染器,详情见文档,类图如下
    在这里插入图片描述
  • 其构造函数有两个参数:QgsSingleBandGrayRenderer( QgsRasterInterface *input, int grayBand );,分别传入dataProvider和波段序号,代码如下
    const int grayBand = 1;
    QgsSingleBandGrayRenderer *renderer = new QgsSingleBandGrayRenderer( layer->dataProvider(), grayBand );
  • 调用类的成员函数setters,如void setGradient( Gradient gradient )设置参数,代码如下
    renderer->setGradient(QgsSingleBandGrayRenderer::BlackToWhite);//
    QgsContrastEnhancement *ce = new QgsContrastEnhancement( ( Qgis::DataType )(layer->dataProvider()->dataType( grayBand ) ) );
    ce->setContrastEnhancementAlgorithm(QgsContrastEnhancement::StretchToMinimumMaximum);
    ce->setMinimumValue(-1);
    ce->setMaximumValue(2630);
    renderer->setContrastEnhancement(ce);
    QgsRasterMinMaxOrigin mmOrigin = renderer->minMaxOrigin();
    renderer->setMinMaxOrigin(mmOrigin);
    //QgsRasterLayer中有Layer Rendering和Resampling中的相应设置
  • 最后设置图层的渲染器即可
  • 完整测试代码如下
void MainWindow::rasterSinglebandGraySlot()
{
    //添加测试图层
    QgsRasterLayer *layer = addTestRaster("maps/raster/3420C_2010_327_RGB_LATLNG.tif");
    //
    const int grayBand = 1;
    QgsSingleBandGrayRenderer *renderer = new QgsSingleBandGrayRenderer( layer->dataProvider(), grayBand );
    renderer->setGradient(QgsSingleBandGrayRenderer::BlackToWhite);//
    QgsContrastEnhancement *ce = new QgsContrastEnhancement( ( Qgis::DataType )(layer->dataProvider()->dataType( grayBand ) ) );
    ce->setContrastEnhancementAlgorithm(QgsContrastEnhancement::StretchToMinimumMaximum);
    ce->setMinimumValue(-1);
    ce->setMaximumValue(2630);
    renderer->setContrastEnhancement(ce);
    QgsRasterMinMaxOrigin mmOrigin = renderer->minMaxOrigin();
    renderer->setMinMaxOrigin(mmOrigin);
    //QgsRasterLayer中有Layer Rendering和Resampling中的相应设置

    layer->setRenderer(renderer);
}

  • 测试效果如下
    在这里插入图片描述
    在这里插入图片描述

总结

  • 介绍了栅格图层单波段灰度渲染的使用
;