前言
- 介绍栅格图层数据渲染之唯一值着色渲染
- 说明:文章中的示例代码均来自开源项目qgis_cpp_api_apps
多波段彩色渲染唯一值着色
- 以“with_color_table.tif”数据为例,在QGis中加载默认显示为多波段彩色如下图
QGis设置为唯一值着色
-
在图层属性的“Symbology”选项卡中选择“Render type”为“Paletted/Unique values”
-
在“Band”中选择需要渲染的波段;在“Color ramp”中选择配色方案。
-
单击“Classify”按钮会自动统计栅格波段所有的唯一值,并以配色方案的方式显示在列表中。“Value”列表示所有的渲染值;“Color”列表示渲染颜色;“Label”列表示图例文字。
-
单击列表右下角的“…”下拉按钮,即可从其他图层或外部读取色彩配置表(Color map):
- Load Classes from Layer:使用其他图层的色彩配置表。
- Load Color Map from File…:从文件中加载色彩配置表。
- Export Color Map to File…:导出色彩配置表到文件。
-
属性设置完成后,图层渲染效果如下图
二次开发代码实现唯一值着色
- 类
QgsPalettedRasterRenderer
是对应的渲染器,详情见文档,类图如下
- 几个静态函数用于分类,代码如下
static QgsPalettedRasterRenderer::ClassData classDataFromFile (const QString &path)
static QgsPalettedRasterRenderer::ClassData classDataFromRaster (QgsRasterInterface *raster, int bandNumber, QgsColorRamp *ramp=nullptr, QgsRasterBlockFeedback *feedback=nullptr)
static QgsPalettedRasterRenderer::ClassData classDataFromString (const QString &string)
static QString classDataToString (const QgsPalettedRasterRenderer::ClassData &classes)
static QgsPalettedRasterRenderer::ClassData colorTableToClassData (const QList< QgsColorRampShader::ColorRampItem > &table)
- 添加文件with_color_table.tif,调用函数
colorTableToClassData
,根据文件中包含的colorTable生成分类
const QgsPalettedRasterRenderer::ClassData classes = QgsPalettedRasterRenderer::colorTableToClassData( layer->dataProvider()->colorTable( grayBand ) );
- 调用构造函数生成渲染器并设置给图层
- 完整测试代码如下
void MainWindow::rasterPalettedSlot()
{
//添加测试图层
QgsRasterLayer *layer = addTestRaster("maps/raster/with_color_table.tif");
const int grayBand = 1;
const QgsPalettedRasterRenderer::ClassData classes = QgsPalettedRasterRenderer::colorTableToClassData( layer->dataProvider()->colorTable( grayBand ) );
auto renderer = new QgsPalettedRasterRenderer( layer->dataProvider(),grayBand,classes );
layer->setRenderer(renderer);
}
- 效果如下图
总结
- 介绍了栅格图层唯一值着色的用法