Робота з растровими шарами

У цьому розділі описано операції, які можна виконувати з растровими шарами.

Інформація про шар

A raster layer consists of one or more raster bands - it is referred to as either single band or multi band raster. One band represents a matrix of values. Usual color image (e.g. aerial photo) is a raster consisting of red, blue and green band. Single band layers typically represent either continuous variables (e.g. elevation) or discrete variables (e.g. land use). In some cases, a raster layer comes with a palette and raster values refer to colors stored in the palette.

>>> rlayer.width(), rlayer.height()
(812, 301)
>>> rlayer.extent()
u'12.095833,48.552777 : 18.863888,51.056944'
>>> rlayer.rasterType()
2  # 0 = GrayOrUndefined (single band), 1 = Palette (single band), 2 = Multiband
>>> rlayer.bandCount()
3
>>> rlayer.metadata()
u'<p class="glossy">Driver:</p>...'
>>> rlayer.hasPyramids()
False

Стиль відображення

Після завантаження растровий шар відображається стилем, що відповідає його типу. Стиль можна змінити у діалозі властивостей растра або програмним шляхом. Існують наступні стилі:

Індекс

Константа: QgsRasterLater.X

Коментар

1 SingleBandGray

Одноканальне зображення у відтінках сірого

2 SingleBandPseudoColor

Одноканальне зображення, відображається з використанням псевдокольору

3 PalettedColor

Шар з «палітрою», відображається з використанням таблиці кольорів

4 PalettedSingleBandGray

Шар з «палітрою», відображається у відтінках сірого

5 PalettedSingleBandPseudoColor

Шар з «палітрою», відображається з використанням псевдокольору

7 MultiBandSingleBandGray

Шар складається з 2 або більше каналів, відображається лише один канал у відтінках сірого

8 MultiBandSingleBandPseudoColor

Шар складається з 2 або більше каналів, відображається лише один канал з використанням псевдокольору

9 MultiBandColor

Шар складається з 2 або більше каналів, відображення у відповідності з кольорами простору RGB

To query the current drawing style:

>>> rlayer.drawingStyle()
9

Одноканальні растри можуть відображатися або у відтінках сірого (менші значення = чорний, більші значення = білий) або з використанням псевдокольору, коли значенням растра призначається свій колір. Крім того, одноканальні растри з палітрою можуть відображатися у відповідності до палітри. Багатоканальні растри, як правило, відображаються шляхом встановлення відповідності між їх каналами та кольорами RGB. Ще один спосіб — використовувати лише один канал для відображення у відтінках сірого або з використанням псевдокольору.

У наступних розділах описано як визначити та змінити стиль відображення шару. Після внесення змін необхідно буде оновити карту, див. Оновлення шарів.

TODO:
contrast enhancements, transparency (no data), user defined min/max, band statistics

Одноканальні растри

They are rendered in gray colors by default. To change the drawing style to pseudocolor:

>>> rlayer.setDrawingStyle(QgsRasterLayer.SingleBandPseudoColor)
>>> rlayer.setColorShadingAlgorithm(QgsRasterLayer.PseudoColorShader)

The PseudoColorShader is a basic shader that highlights low values in blue and high values in red. Another, FreakOutShader uses more fancy colors and according to the documentation, it will frighten your granny and make your dogs howl.

There is also ColorRampShader which maps the colors as specified by its color map. It has three modes of interpolation of values:

  • лінійна (INTERPOLATED): кінцевий колір є результатом лінійної інтерполяції кольорів

  • дискретна (DISCRETE): використовується колір що відповідає або більший за колір відповідного значення карти кольорів

  • точна (EXACT): інтерполяція відсутня, відображаються лише пікселі за значеннями, які є у карті кольорів

Створити градієнт від зеленого до жовтого (для значеннь від 0 до 255) можна так:

>>> rlayer.setColorShadingAlgorithm(QgsRasterLayer.ColorRampShader)
>>> lst = [ QgsColorRampShader.ColorRampItem(0, QColor(0,255,0)), \
    QgsColorRampShader.ColorRampItem(255, QColor(255,255,0)) ]
>>> fcn = rlayer.rasterShader().rasterShaderFunction()
>>> fcn.setColorRampType(QgsColorRampShader.INTERPOLATED)
>>> fcn.setColorRampItemList(lst)

To return back to default gray levels, use:

>>> rlayer.setDrawingStyle(QgsRasterLayer.SingleBandGray)

Багатоканальні растри

By default, QGIS maps the first three bands to red, green and blue values to create a color image (this is the MultiBandColor drawing style. In some cases you might want to override these setting. The following code interchanges red band (1) and green band (2):

>>> rlayer.setGreenBandName(rlayer.bandName(1))
>>> rlayer.setRedBandName(rlayer.bandName(2))

In case only one band is necessary for visualization of the raster, single band drawing can be chosen — either gray levels or pseudocolor, see previous section:

>>> rlayer.setDrawingStyle(QgsRasterLayer.MultiBandSingleBandPseudoColor)
>>> rlayer.setGrayBandName(rlayer.bandName(1))
>>> rlayer.setColorShadingAlgorithm(QgsRasterLayer.PseudoColorShader)
>>> # now set the shader

Оновлення шарів

If you do change layer symbology and would like ensure that the changes are immediately visible to the user, call these methods:

if hasattr(layer, "setCacheImage"):
  layer.setCacheImage(None)
layer.triggerRepaint()

Перша конструкція потрібна щоб впевнитися, що при використання кешу рендерера закешовані зображення шару видалені. Цей функціонал доступний починаючи з QGIS 1.4, у попередніх версіях QGIS ця функція відсутня — тому, перед цим, щоб бути впевненим у працездатності коду в будь-якій версії QGIS, робиться перевірка на наявність метода.

Друга конструкція відправляє сигнал, який змушує оновитися всі карти, що містять шар.

With WMS raster layers, these commands do not work. In this case, you have to do it explicitly:

layer.dataProvider().reloadData()
layer.triggerRepaint()

In case you have changed layer symbology (see sections about raster and vector layers on how to do that), you might want to force QGIS to update the layer symbology in the layer list (legend) widget. This can be done as follows (iface is an instance of QgisInterface):

iface.legendInterface().refreshLayerSymbology(layer)

Отримання значень

To do a query on value of bands of raster layer at some specified point:

ident = rlayer.dataProvider().identify(QgsPoint(15.30,40.98), \
  QgsRaster.IdentifyFormatValue)
if ident.isValid():
  print ident.results()

В нашому випадку метод results() поверне словник, з номерами каналі в якості ключів, та значеннями растра в якості значень.

{1: 17, 2: 220}