PyQGIS: Loading and symbolizing raster layers
More information can be found in the PyQGIS Developer Cookbook.
Requirements
- QGIS version 3.0, or greater
Objectives
- Load and symbolize a raster layer with pyqgis
- Get statistics from a raster band
Open the QGIS Python Console
From the menu, select Plugins -> Python Console, or Ctrl + Alt + P (Windows)
You can type directly into the console, or select the pad and paper icon to write code in the editor. I prefer to write code in the editor because it allows me to save my work and run a compilation of commands.
Load a raster layer
Define the path to a raster
In the code editor, or console, create a variable containing the path to your raster file.
fn = 'c:/path/to/raster/file.tif'
Load raster into QGIS interface
Now we’ll simultaneously assign the raster layer to the rlayer
variable and load it into the QGIS interface.
rlayer = iface.addRasterLayer(fn, 'layer name')
This adds the raster into the QGIS interface. In the legend, the raster is labeled ‘layer name’. My raster is symbolized with a grayscale color ramp. We’ll change the symbology next.
Change raster symbology
Get raster band statistics
First, we’ll get statistics for the raster band so we can properly stretch a color ramp. The number 1 is the raster band we are getting stats for.
stats = rlayer.dataProvider().bandStatistics(1, QgsRasterBandStats.All)
Then we’ll get the minimum and maximum values.
min = stats.minimumValue max = stats.maximumValue
Create a color ramp shader
The color ramp shader will define the new color ramp we create to symbolize the raster. First we’ll create and empty color ramp shader. We also need to set type of color ramp we want to use. Options are Interpolated
, Discrete
, or Exact
.
Interpolated
stretches colors across a range of valuesDiscrete
gives all values in a range the same colorExact
gives each unique pixel value a unique colors
The data I’m using represent elevations, they are continuous data so I’ll use an Interpolated
ramp.
fnc = QgsColorRampShader() fnc.setColorRampType(QgsColorRampShader.Interpolated)
Define the colors for the QgsColorRampShader
Now we need to define a color scheme. For this example, I’m going to create a very simple color ramp that interpolates from green (low values) to yellow (high values).
lst = [QgsColorRampShader.ColorRampItem(min, QColor(0,255,0)),\ QgsColorRampShader.ColorRampItem(max, QColor(255,255,0))] fnc.setColorRampItemList(lst)
Assign the color ramp to a QgsRasterShader
We’ll assign the color ramp to a QgsRasterShader
so it can be used to symbolize a raster layer.
shader = QgsRasterShader() shader.setRasterShaderFunction(fnc)
Apply symbology to raster
Finally, we need to apply the symbology we’ve create to the raster layer. First, we’ll create a renderer using our raster shader. Then we’ll Assign the renderer to our raster layer.
renderer = QgsSingleBandPseudoColorRenderer(rlayer.dataProvider(), 1, shader) rlayer.setRenderer(renderer)
There you have it. You can watch the video below to see the results of my raster symbolization. In a future tutorial we’ll cover how to use functions to make more complicated color ramps for rasters.