Docs in progress for 'QGIS testing'. Visit https://docs.qgis.org/3.4 for QGIS 3.4 docs and translations.
警告
Despite our constant efforts, information beyond this line may not be updated for QGIS 3. Refer to https://qgis.org/pyqgis/master for the python API documentation or, give a hand to update the chapters you know about. Thanks.
如果您在Pyqgis控制台之外,则此页上的代码段需要以下导入:
from qgis.core import (
QgsRasterLayer,
QgsColorRampShader,
QgsSingleBandPseudoColorRenderer
)
栅格图层由一个或多个栅格条带组成,称为单条带或多条带栅格。一个波段代表一个值矩阵。通常的彩色图像(例如航空照片)是由红色、蓝色和绿色带组成的栅格。单波段层通常代表连续变量(如高程)或离散变量(如土地利用)。在某些情况下,栅格图层带有调色板,而栅格值是指存储在调色板中的颜色。
以下代码假定 rlayer
是一个 QgsRasterLayer
对象。
rlayer = QgsProject.instance().mapLayersByName('srtm')[0]
# get the resolution of the raster in layer unit
rlayer.width(), rlayer.height()
(919, 619)
# get the extent of the layer as QgsRectangle
rlayer.extent()
<QgsRectangle: 20.06856808199999875 -34.27001076999999896, 20.83945284300000012 -33.75077500700000144>
# get the extent of the layer as Strings
rlayer.extent().toString()
'20.0685680819999988,-34.2700107699999990 : 20.8394528430000001,-33.7507750070000014'
# get the raster type: 0 = GrayOrUndefined (single band), 1 = Palette (single band), 2 = Multiband
rlayer.rasterType()
0
# get the total band count of the raster
rlayer.bandCount()
1
# get all the available metadata as a QgsLayerMetadata object
rlayer.metadata()
'<qgis._core.QgsLayerMetadata object at 0x13711d558>'
加载栅格层时,将根据其类型获取默认渲染器。它可以在栅格层属性中更改,也可以通过编程方式更改。
要查询当前渲染器:
rlayer.renderer()
<qgis._core.QgsSingleBandGrayRenderer object at 0x7f471c1da8a0>
rlayer.renderer().type()
'singlebandgray'
要设置渲染器,请使用 setRenderer()
方法 QgsRasterLayer
. 有几个可用的渲染器类(派生自 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)
该明暗器按其颜色映射指定的颜色。颜色映射作为具有像素值及其关联颜色的项的列表提供。有三种插值模式:
Interpolated
):结果颜色从实际像素值的上方和下方的颜色映射条目线性内插。Discrete
):颜色从具有相同或更高值的颜色映射条目中使用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()<qgis.core.qgsmaplayer.triggerrepaint>`更新地图并查看结果:
rlayer_multi.triggerRepaint()
查询栅格值的第一种方法是使用 sample()
方法 QgsRasterDataProvider
班级。您必须指定 QgsPointXY
以及要查询的栅格层的带号。方法返回一个具有值和 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}}