ラスターレイヤを使う

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

レイヤについて

ラスタレイヤは、1つまたは複数のラスタバンドで構成されています。それらはシングルバンドまたはマルチバンドラスタと呼ばれます。 1つのバンドは値のマトリックスを表します。通常のカラー画像(例えば、空中写真)は、赤、青、緑のバンドからなるラスタです。単一バンドレイヤーは、通常、連続変数(例えば高度)または離散変数(例えば土地利用)のいずれかを表します。場合によっては、ラスタレイヤにパレットが付属し、ラスタ値はパレットに保存されている色を参照します:

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

レンダラ

ラスターレイヤーがロードされると、そのタイプに基づいてデフォルトのレンダラーが取得されます。ラスターレイヤのプロパティまたはプログラムで変更できます。

現在のレンダラを照会する:

>>> rlayer.renderer()
<qgis._core.QgsSingleBandPseudoColorRenderer object at 0x7f471c1da8a0>
>>> rlayer.renderer().type()
u'singlebandpseudocolor'

レンダラを設定するためには:class:QgsRasterLayer の:func:setRenderer メソッドを使用します。利用可能なレンダラークラス(QgsRasterRenderer から派生)はいくつかあります:

  • QgsMultiBandColorRenderer
  • QgsPalettedRasterRenderer
  • QgsSingleBandColorDataRenderer
  • QgsSingleBandGrayRenderer
  • QgsSingleBandGrayRenderer

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

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

TODO:

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

単バンドラスタ

ラスターレイヤー(バンドは1つだけと仮定)(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)

シェーダは、そのカラーマップによって指定された色をマッピングします。カラーマップは、画素値とそれに関連する色を持つ項目のリストとなっています。値の補間のモードは3つあります。

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

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

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

第二段階では、ラスタレイヤにこのシェーダを関連付けます:

>>> renderer = QgsSingleBandPseudoColorRenderer(layer.dataProvider(), 1, shader)
>>> layer.setRenderer(renderer)

上記のコード中の数1はバンド番号です(ラスタバンドは、1からインデックス付けされている)。

マルチバンドラスタ

デフォルトでは、QGISは最初の3つのバンドを赤、緑、青の値にマッピングしてカラー画像を作成します(これは ``MultiBandColor``描画スタイルです)場合によっては、これらの設定をオーバーライドすることもできます。 次のコードは、赤のバンド(1)と緑のバンド(2)を交換します:

rlayer.renderer().setGreenBand(1)
rlayer.renderer().setRedBand(2)

ラスタを視覚化するために必要な帯域が1つだけの場合は、グレーレベルまたは疑似カラーのいずれかのシングルバンド描画を選択できます。

レイヤの更新

レイヤシンボルを変更し、変更がユーザーにすぐに表示されていることを確認したい場合、これらのメソッドを呼び出します

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

一つ目の方法は, キャッシュ表示をオンにした際に表示レイヤのキャッシュ画像を削除するやり方です. この機能はQGIS 1.4以降で使用可能になりました.

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

WMSのラスタレイヤと、これらのコマンドは動作しません。このケースでは、明示的にそれをしなければなりません

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

レイヤシンボルを変更している(それを行う方法については、ラスタとベクタレイヤーに関するセクションを参照)ケースでは、レイヤーリスト(凡例)ウィジェット内のレイヤシンボルを更新することをQGISに強制させたい場合があります。これは以下のように行うことができます(iface は:class:QgisInterface のインスタンスです)

iface.legendInterface().refreshLayerSymbology(layer)

値の検索

いくつかの指定された時点で、ラスタレイヤのバンドの値のクエリを実行するには

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

この場合の results メソッドは、キーとしてバンドインデックスを持ち、値としてバンド値を持つ辞書型を返します。

{1: 17, 2: 220}