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()
pyqgis 单波段着色
最新推荐文章于 2024-07-10 14:24:35 发布