9.6 栅格图层符号化唯一值着色渲染

前言

多波段彩色渲染唯一值着色

  • 以“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);
}
  • 效果如下图
    在这里插入图片描述
    在这里插入图片描述

总结

  • 介绍了栅格图层唯一值着色的用法
栅格图进行唯一渲染的方式与矢量有所不同,以下是一个在C#中使用ArcGIS Engine进行栅格图唯一渲染的示例代码: ```csharp //获取选中的栅格图 IRasterLayer rasterLayer = comboBox1.SelectedItem as IRasterLayer; //创建一个唯一渲染器对象 IRasterUniqueValueRenderer renderer = new RasterUniqueValueRenderer(); //指定渲染的波段 renderer.Field = 0; //指定渲染符号 IRgbColor color1 = new RgbColor(); color1.Red = 255; color1.Green = 0; color1.Blue = 0; IRasterRenderer renderer1 = new RasterStretchColorRampRenderer(); renderer1.BandIndex = 0; renderer1.Update(); renderer1.ColorRamp = CreateAlgorithmicColorRamp(color1); IRgbColor color2 = new RgbColor(); color2.Red = 0; color2.Green = 255; color2.Blue = 0; IRasterRenderer renderer2 = new RasterStretchColorRampRenderer(); renderer2.BandIndex = 0; renderer2.Update(); renderer2.ColorRamp = CreateAlgorithmicColorRamp(color2); IRgbColor color3 = new RgbColor(); color3.Red = 0; color3.Green = 0; color3.Blue = 255; IRasterRenderer renderer3 = new RasterStretchColorRampRenderer(); renderer3.BandIndex = 0; renderer3.Update(); renderer3.ColorRamp = CreateAlgorithmicColorRamp(color3); //将数据绑定到唯一渲染器对象中 renderer.AddValue("Value1", renderer1); renderer.AddValue("Value2", renderer2); renderer.AddValue("Value3", renderer3); //将唯一渲染器对象应用到栅格图上 IRasterLayerExtensions.ApplyRenderer(rasterLayer, renderer as IRasterRenderer); ``` 以上示例中,首先获取选中的栅格图,创建一个唯一渲染器对象,指定要渲染的波段,然后分别创建三个颜色渐变的渲染符号,并将它们分别绑定到唯一渲染器对象中的三个上。最后将唯一渲染器对象应用到栅格图上,即可完成唯一渲染。 需要注意的是,栅格图渲染符号必须是实现了IRasterRenderer接口的对象,例如RasterStretchColorRampRenderer,而不能使用矢量中常用的SimpleFillSymbol等符号。另外,为了方便起见,以上示例中使用了CreateAlgorithmicColorRamp方法创建了一个颜色渐变,该方法返回一个IColorRamp接口,可以用于设置渲染符号的颜色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雷动软件工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值