使用光栅图层
警告
尽管我们不断努力,但对于QGIS 3而言,超出此范围的信息可能不会更新。有关Python API文档的信息,请参阅https://qgis.org/pyqgis/master。谢谢。
如果您在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'
要设置渲染器,请使用的QgsRasterLayer::
setRenderer
方法。有许多渲染器类(继承自QgsRasterRenderer
):
可以以灰色(低值=黑色,高值=白色)或使用为颜色分配颜色的伪彩色算法绘制单波段栅格图层。也可以使用调色板绘制带有调色板的单波段栅格。通常通过将波段映射到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
更新地图并查看结果:
rlayer_multi.triggerRepaint()
查询值
可以使用类QgsRasterDataProvider::
sample
方法查询栅格值。您必须指定一个位置 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}
©版权所有2002-现在,QGIS项目 最近更新于2020年4月3日09:14。
使用Sphinx使用Read the Docs提供的主题构建。