目录
4 使用栅格图层
4.1 图层细节
4.2 渲染器
4.2.1 单波段栅格
4.2.2 多波段栅格
4.3 查询值
此页面上的代码段需要导入以下模块:
from qgis.core import (
QgsRasterLayer,
QgsColorRampShader,
QgsSingleBandPseudoColorRenderer
)
栅格图层由一个或多个栅格波段组成——称为单波段和多波段栅格。一个波段代表一个值矩阵。彩色图像(例如航拍照片)是由红色,蓝色和绿色波段组成。单波段栅格通常表示连续变量(例如高程)或离散变量(例如土地使用)。在某些情况下,栅格图层带有调色板,栅格值指的是调色板中存储的颜色。
以下代码假设rlayer
是一个 QgsRasterLayer
对象。
rlayer = QgsProject.instance().mapLayersByName('srtm')[0]
# 获取图层单元
rlayer.width(), rlayer.height()
(919, 619)
# 获取图层范围,返回QgsRectangle对象
rlayer.extent()
# 获取图层范围,转换为字符串
rlayer.extent().toString()
'20.0685680819999988,-34.2700107699999990 : 20.8394528430000001,-33.7507750070000014'
# 获取栅格类型: 0 = 灰度值(单波段), 1 = 调色板(单波段), 2 = 多波段,3 = 网络?
rlayer.rasterType()
0
# 获取波段个数
rlayer.bandCount()
1
# 获取所有可用的元数据,返回QgsLayerMetadata对象
rlayer.metadata()
''
加载栅格图层时,它会根据其类型获取默认渲染器。它可以在图层属性中更改,也可以通过编程方式更改。
查询当前渲染器:
rlayer.renderer()
rlayer.renderer().type()
'singlebandgray'
设置渲染器,使用QgsRasterLayer
的setRenderer
方法。下面有许多渲染器类(派生自QgsRasterRenderer
):
QgsMultiBandColorRenderer
QgsPalettedRasterRenderer
QgsSingleBandColorDataRenderer
QgsSingleBandGrayRenderer
QgsSingleBandPseudoColorRenderer
单波段栅格图层可以以灰色(低值=黑色,高值=白色)或使用伪彩色算法绘制,该算法为值指定颜色。也可以使用调色板绘制带调色板的单波段栅格。多波段图层通常通过将波段映射到RGB来绘制颜色。另一种可能性是仅使用一个波段来绘图。
假设我们想要渲染一个单波段栅格图层,颜色范围从绿色到黄色(对应于0到255之间的像素值)。在第一阶段,我们将准备一个:QgsRasterShader
fcn = QgsColorRampShader()
fcn.setColorRampType(QgsColorRampShader.Interpolated)
lst = [ QgsColorRampShader.ColorRampItem(0, QColor(0,255,0)),QgsColorRampShader.ColorRampItem(255, QColor(255,255,0)) ]
fcn.setColorRampItemList(lst)
shader = QgsRasterShader()
shader.setRasterShaderFunction(fcn)
着色器按其颜色映射指定的颜色。彩色地图被提供为具有相关颜色的像素值列表。插值有三种模式:
linear(Interpolated
):从像素值上方和下方的颜色映射条目线性插值颜色
discrete(Discrete
):颜色取自具有相同或更高值的最接近的颜色映射条目
exact(Exact
):不插入颜色,只绘制值等于颜色映射条目的像素
在第二步中,我们将此着色器与栅格图层相关联:
renderer = QgsSingleBandPseudoColorRenderer(rlayer.dataProvider(), 1, shader)
rlayer.setRenderer(renderer)
上面代码的数值1
是波段号(栅格波段的一个索引)。
最后我们必须使用 triggerRepaint
方法来查看结果:
rlayer.triggerRepaint()
默认情况下,QGIS将前三个波段映射为红色,绿色和蓝色以创建彩色图像(这是MultiBandColor
绘图样式。在某些情况下,您可能希望覆盖这些设置。以下代码互换红色波段(1)和绿色波段(2):
rlayer_multi = QgsProject.instance().mapLayersByName('multiband')[0]
rlayer_multi.renderer().setGreenBand(1)
rlayer_multi.renderer().setRedBand(2)
如果只需要一个波段来实现光栅的可视化,则可以选择单波段绘制,单波段灰度或单波段伪彩色。
我们必须使用triggerRepaint
更新地图并查看结果:
rlayer.triggerRepaint()
查询栅格值的第一种方法是使用 QgsRasterDataProvider
的sample
方法查询。您必须指定栅格图层的QgsPointXY
和波段号。该方法返回一个value和result(true或false):
val, res = rlayer.dataProvider().sample(QgsPointXY(20.50, -34), 1)
查询栅格值的另一种方法是使用identify
方法,返回QgsRasterIdentifyResult
对象 。
ident = rlayer.dataProvider().identify(QgsPointXY(20.5, -34), QgsRaster.IdentifyFormatValue)
if ident.isValid():
print(ident.results())
在这种情况下,该results
方法返回一个字典,波段索引作为键,波段值作为值。例如{1: 323.0}
写在最后:文中难免有翻译错误,欢迎您的指正。完整版翻译请移步PyQGIS开发者手册-完整版