CPJD 2023-12-09 18:05 采纳率: 33.3%
浏览 7
已结题

用QT,进行QGIS二次开发,如何在添加栅格图层时,将黑白的矢量图渲染成彩色

这是源代码,是黑白的。

void TinyGIS::on_actionAdd_Raster_Layer_triggered()
{
    const QStringList& fileNames = QFileDialog::getOpenFileNames(this, tr("Add raster layer"), QString(), QString("GTiff(*.tif;*.tiff)"));

    if (fileNames.isEmpty())
    {
        return;
    }

    //QSignalBlocker signalBlocker(Project::instance()->layerTree());
    for (const QString& fileName : fileNames)
    {
        QFileInfo fileInfo(fileName);
        QgsRasterLayer* layer = new QgsRasterLayer(fileName, fileInfo.baseName());

        Project::instance()->addLayer(layer);// 加载栅格图层
    }

    refreshMapCanvas();
    addLog(tr("Open Raster layer successfully."));
}

void TinyGIS::refreshMapCanvas()
{
    m_mapCanvas->setLayers(Project::instance()->layerTree()->checkedLayers());
    m_mapCanvas->refresh();
}

void TinyGIS::refreshMapCanvas()
{
    m_mapCanvas->setLayers(Project::instance()->layerTree()->checkedLayers());
    m_mapCanvas->refresh();
}

这个是黑白效果

img

  • 写回答

13条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-09 20:03
    关注

    【以下回答由 GPT 生成】

    问题标题: 如何使用QT进行QGIS二次开发,在添加栅格图层时将黑白的矢量图渲染为彩色?

    问题内容:

    要将黑白的矢量图渲染为彩色图层,可以通过使用QgsSingleBandPseudoColorRenderer类来实现。以下是修改后的代码:

    void TinyGIS::on_actionAdd_Raster_Layer_triggered()
    {
        const QStringList& fileNames = QFileDialog::getOpenFileNames(this, tr("Add raster layer"), QString(), QString("GTiff(*.tif;*.tiff)"));
    
        if (fileNames.isEmpty())
        {
            return;
        }
    
        for (const QString& fileName : fileNames)
        {
            QFileInfo fileInfo(fileName);
            QgsRasterLayer* layer = new QgsRasterLayer(fileName, fileInfo.baseName());
    
            // 创建伪彩色渲染器
            QgsSingleBandPseudoColorRenderer* renderer = new QgsSingleBandPseudoColorRenderer(layer->dataProvider(), 1);
    
            // 设置渲染器的颜色样式
            renderer->setColorRampType(QgsColorRampShader::Continuous);
            QgsColorRampShader* colorRampShader = new QgsColorRampShader();
            colorRampShader->setColorRampType(QgsColorRampShader::Interpolated);
            colorRampShader->setColorRampAlgorithm(QgsColorRampShader::Exact);
    
            // 添加适当的颜色渐变
            QList<QgsColorRampShader::ColorStop> colorStops;
            colorStops << QgsColorRampShader::ColorStop(0.0, QColor("black"), "");
            colorStops << QgsColorRampShader::ColorStop(1.0, QColor("white"), "");
            colorRampShader->setColorRampStops(colorStops);
    
            renderer->setShader(colorRampShader);
            layer->rendererTreeRoot()->addRenderer(renderer);
    
            Project::instance()->addLayer(layer);   // 加载栅格图层
        }
    
        refreshMapCanvas();
        addLog(tr("Open Raster layer successfully."));
    }
    

    这个修改后的代码将使用QgsSingleBandPseudoColorRenderer来创建伪彩色渲染器,并设置颜色样式为连续的伪彩色。这里使用的渐变色是从黑色到白色的渐变。注意,你可以根据自己的需求修改渐变颜色和样式。

    请注意,这只能用于单波段的栅格图层,如果需要处理多波段的栅格图层,请使用QgsMultiBandColorRenderer类。

    希望这可以帮助到你!如果还有其他问题,请随时提问。



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月12日
  • 创建了问题 12月9日

悬赏问题

  • ¥15 请问读取环境变量文件失败是什么原因?
  • ¥15 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载