pyqgis 单波段着色

from qgis.core import (
    QgsRasterLayer,
    QgsProject,
    QgsPointXY,
    QgsRaster,
    QgsRasterShader,
    QgsColorRampShader,
    QgsSingleBandPseudoColorRenderer,
    QgsSingleBandColorDataRenderer,
    QgsSingleBandGrayRenderer,
)
import numpy as np
from qgis.PyQt.QtGui import QColor

import random

def randomcolor():
    # 随机生成颜色
    colorArr = ['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
    color = ""
    for i in range(6):
        color += colorArr[random.randint(0,14)]
    return "#"+color


def convertRasterToNumpyArray(lyr): #Input: QgsRasterLayer
    # QgsRasterLayer转numpy
    values=[]
    provider= lyr.dataProvider()
    block = provider.block(1,lyr.extent(),lyr.width(),lyr.height())
    for i in range(lyr.width()):
        for j in range(lyr.height()):
            
            values.append(block.value(i,j))
    return np.array(values)
    
def uniqueRasterValue(imgpath):
    # 获取影影像的不同数值
    raster = gdal.Open(imgpath)
    
    if(raster.RasterCount==1):
        band = raster.GetRasterBand(1)
        img =  band.ReadAsArray()
    return np.unique(img).tolist()
    
def getLst(imgpath):
    lst = []
    for i in uniqueRasterValue(imgpath):
        if i == 0:
            lst.append(QgsColorRampShader.ColorRampItem(i,QColor(255,255,255), str(i)))
        else:
            lst.append(QgsColorRampShader.ColorRampItem(i,QColor(randomcolor()), str(i)))
    return lst
    
pathfile = r'C:\Users\67231\Desktop\PYQIS3\select_sample_0.2_test.tif'
#rlayer = QgsRasterLayer(pathfile, "raster layer")

rlayer = QgsProject.instance().mapLayersByName('select_sample_0.2_test')[0]

# 配置着色函数
shader = QgsRasterShader()# 创建通用栅格着色器对象

fcn = QgsColorRampShader() # 实例化
fcn.setColorRampType(QgsColorRampShader.Interpolated) #设置渲染类型

#lst = [ QgsColorRampShader.ColorRampItem(0, QColor(0,255,0)),QgsColorRampShader.ColorRampItem(255, QColor(255,255,0)) ]
lst = getLst(pathfile)

fcn.setColorRampItemList(lst)# 设置渲染颜色
shader.setRasterShaderFunction(fcn)
#
# 色器与栅格图层相关联
renderer = QgsSingleBandPseudoColorRenderer(rlayer.dataProvider(), 1, shader)
# 设置透明度
renderer.setOpacity(1)
rlayer.setRenderer(renderer)

# 查看结果
rlayer.triggerRepaint()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陨星落云

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

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

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

打赏作者

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

抵扣说明:

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

余额充值