ラスターレイヤを使う

このセクションではラスタレイヤに対して行える様々な操作について紹介していきます.

レイヤについて

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()
<qgis._core.QgsRectangle object at 0x000000000F8A2048>
rlayer.extent().toString()
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

Drawing Style

When a raster layer is loaded, it gets a default drawing style based on its type. It can be altered either in raster layer properties or programmatically. The following drawing styles exist:

Index Constant: QgsRasterLater.X Comment
1 SingleBandGray Single band image drawn as a range of gray colors
2 SingleBandPseudoColor Single band image drawn using a pseudocolor algorithm
3 PalettedColor “Palette” image drawn using color table
4 PalettedSingleBandGray “Palette” layer drawn in gray scale
5 PalettedSingleBandPseudoColor “Palette” layer drawn using a pseudocolor algorithm
7 MultiBandSingleBandGray Layer containing 2 or more bands, but a single band drawn as a range of gray colors
8 MultiBandSingleBandPseudoColor Layer containing 2 or more bands, but a single band drawn using a pseudocolor algorithm
9 MultiBandColor Layer containing 2 or more bands, mapped to RGB color space.

To query the current drawing style:

rlayer.renderer().type()
u'singlebandpseudocolor'

単バンドラスタレイヤはグレースケール(低い値=黒, 高い値=白)でも, 単バンドの値に色を割り当てたシュードカラーでも表示できます. また, 単バンドラスタはカラーマップでも表示できます. マルチバンドラスタは基本的にRGBカラーが割り当てて表示されますが, いずれかのバンドをグレースケールやシュードカラーで表示することもできます.

続いてのセクションではどのようにレイヤの表示方法を探したり変更するのかを説明していきます. 設定変更後にマップキャンバスの表示も更新をしたい場合は, レイヤの更新 を参考にしてください.

TODO:

*特定の値の強調, 透過 (No Data), ユーザー定義の最大値・最小値, バンド統計

単バンドラスタ

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

# Check the renderer
rlayer.renderer().type()
u'singlebandgray'
rlayer.setDrawingStyle("SingleBandPseudoColor")
# The renderer is now changed
rlayer.renderer().type()
u'singlebandpseudocolor'
# Set a color ramp hader function
shader_func = QgsColorRampShader()
rlayer.renderer().shader().setRasterShaderFunction(shader_func)

The PseudoColorShader is a basic shader that highlights low values in blue and high values in red. There is also ColorRampShader which maps the colors as specified by its color map. It has three modes of interpolation of values:

  • 線形 (補間): カラーマップで色を指定した値とその間を線形補間により色を割りてます.

  • (離散的): カラーマップで指定された値及びそれ以上の値を同じ色に設定します.

  • (厳密): 色の補間を行わず, カラーマップで指定された値のみを表示します.

To set an interpolated color ramp shader ranging from green to yellow color (for pixel values from 0 to 255):

rlayer.renderer().shader().setRasterShaderFunction(QgsColorRampShader())
lst = [QgsColorRampShader.ColorRampItem(0, QColor(0, 255, 0)), \
    QgsColorRampShader.ColorRampItem(255, QColor(255, 255 ,0))]
fcn = rlayer.renderer().shader().rasterShaderFunction()
fcn.setColorRampType(QgsColorRampShader.INTERPOLATED)
fcn.setColorRampItemList(lst)

To return back to default gray levels, use:

rlayer.setDrawingStyle('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.setDrawingStyle('MultiBandColor')
rlayer.renderer().setGreenBand(1)
rlayer.setRedBand(2)

レイヤの更新

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以降で使用可能になりました.

二つ目の方法は更新したいマップキャンバス上のレイヤを指定して除去するやり方です.

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}