PyQGisCookbook--使用光栅图层(六)


使用光栅图层

警告

尽管我们不断努力,但对于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提供的主题构建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值