Os trechos de código desta página precisam das seguintes importações se você estiver fora do console do pyqgis:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from qgis.core import (
QgsRasterLayer,
QgsProject,
QgsPointXY,
QgsRaster,
QgsRasterShader,
QgsColorRampShader,
QgsSingleBandPseudoColorRenderer,
QgsSingleBandColorDataRenderer,
QgsSingleBandGrayRenderer,
)
from qgis.PyQt.QtGui import (
QColor,
)
|
5. Usando Camadas Raster¶
5.1. Detalhes da Camada¶
Uma camada raster consiste em uma ou mais bandas raster - conhecidas como rasters de banda única e multibanda. Uma banda representa uma matriz de valores. Uma imagem colorida (por exemplo, foto aérea) é um raster composto por faixas vermelhas, azuis e verdes. Rasters de banda única normalmente representam variáveis contínuas (por exemplo, elevação) ou variáveis discretas (por exemplo, uso do solo). Em alguns casos, uma camada raster vem com uma paleta e os valores raster referem-se às cores armazenadas na paleta.
O código a seguir assume que o objeto rlayer
é uma QgsRasterLayer
.
rlayer = QgsProject.instance().mapLayersByName('srtm')[0]
# get the resolution of the raster in layer unit
print(rlayer.width(), rlayer.height())
919 619
# get the extent of the layer as QgsRectangle
print(rlayer.extent())
<QgsRectangle: 20.06856808199999875 -34.27001076999999896, 20.83945284300000012 -33.75077500700000144>
# get the extent of the layer as Strings
print(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
print(rlayer.rasterType())
0
# get the total band count of the raster
print(rlayer.bandCount())
1
# get all the available metadata as a QgsLayerMetadata object
print(rlayer.metadata())
<qgis._core.QgsLayerMetadata object at 0x13711d558>
5.2. Renderizador¶
Quando uma camada raster é carregada, ela obtém um renderizador padrão com base em seu tipo. Pode ser alterado nas propriedades da camada ou usando programação.
Para consultar o renderizador atual:
print(rlayer.renderer())
<qgis._core.QgsSingleBandGrayRenderer object at 0x7f471c1da8a0>
print(rlayer.renderer().type())
singlebandgray
Para definir um renderizador, use o método setRenderer
de QgsRasterLayer
. Existem várias classes de renderizador (derivadas de QgsRasterRenderer
):
As camadas raster de banda única podem ser desenhadas nas cores cinza (valores baixos = preto, valores altos = branco) ou com um algoritmo de pseudo-cor que atribui cores aos valores. Rasters de banda única com uma paleta também podem ser desenhados usando a paleta. Camadas de multibandas geralmente são desenhadas mapeando as bandas para cores RGB. Outra possibilidade é usar apenas uma banda para desenhar.
5.2.1. Rasters com Banda Única¶
Digamos que queremos uma camada raster de renderização de banda única com cores que variam de verde a amarelo (correspondendo a valores de pixel de 0 a 255). No primeiro estágio, prepararemos um objeto QgsRasterShader
e configuraremos sua função de sombreamento:
1 2 3 4 5 6 7 | 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)
|
Os sombreador mapeia as cores conforme especificado pelo seu mapa de cores. O mapa de cores é fornecido como uma lista de valores de pixels com cores associadas. Existem três modos de interpolação:
linear (
Interpolated
): a cor é interpolada linearmente a partir das entradas do mapa de cores acima e abaixo do valor do pixeldiscreto (
Discrete
): a cor é obtida da entrada mais próxima do mapa de cores com valor igual ou superiorexato (
Exact
): a cor não é interpolada, apenas pixels com valores iguais às entradas do mapa de cores serão desenhados
Na segunda etapa, associaremos esse sombreador à camada raster:
renderer = QgsSingleBandPseudoColorRenderer(rlayer.dataProvider(), 1, shader)
rlayer.setRenderer(renderer)
O número ``1 ‘’ no código acima é o número da banda (as bandas raster são indexadas a partir de uma).
Finalmente, temos que usar o método triggerRepaint
para ver os resultados:
rlayer.triggerRepaint()
5.2.2. Rasters Multibandas¶
Por padrão, o QGIS mapeia as três primeiras bandas para vermelho, verde e azul para criar uma imagem colorida (este é o estilo de desenho MultiBandColor
. Em alguns casos, você pode substituir essas configurações. O código a seguir troca a faixa vermelha (1) e faixa verde (2):
rlayer_multi = QgsProject.instance().mapLayersByName('multiband')[0]
rlayer_multi.renderer().setGreenBand(1)
rlayer_multi.renderer().setRedBand(2)
No caso de apenas uma banda ser necessária para a visualização do raster, o desenho de banda única pode ser escolhido, tanto em níveis de cinza quanto em pseudocolor.
Temos que usar triggerRepaint
para atualizar o mapa e ver o resultado:
rlayer_multi.triggerRepaint()
5.3. Valores de Consulta¶
Os valores raster podem ser consultados usando o método sample
de QgsRasterDataProvider
. Você deve especificar uma QgsPointXY
e o número da banda da camada raster que você deseja consultar. O método retorna uma tupla com o valor e True
ou False
, dependendo dos resultados:
val, res = rlayer.dataProvider().sample(QgsPointXY(20.50, -34), 1)
Outro método para consultar valores raster é usar o método identify
que retorna um objeto QgsRasterIdentifyResult
.
ident = rlayer.dataProvider().identify(QgsPointXY(20.5, -34), QgsRaster.IdentifyFormatValue)
if ident.isValid():
print(ident.results())
{1: 323.0}
Nesse caso, o método results
retorna um dicionário, com índices de banda como chaves, e valores de banda como valores. Por exemplo, algo como {1: 323.0}