ラスターレイヤを使う

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

レイヤについて

ラスタレイヤは一つ以上のラスタバンドで構成され, シングルバンドラスタやマルチバンドラスタと呼ばれます. 一つのバンドは値が行列上に並んだものです. 空中写真などの普通のカラー画像は, 赤・青・緑のバンドから構成されるラスタです. シングルバンドは基本的に標高などの連続値や土地利用などの整数値からなります. ラスタレイヤの中にはパレットデータを伴うものがあり, ラスタレイヤの値がパレットの色を指定ている場合があります.

>>> 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

描画スタイル

ラスタレイヤが読み込まれるときの表示の仕方は, その種類によって異なってきます. 表示方法はラスタレイヤプロパティやプログラムなどにより変更が可能です. 描画スタイルには以下のものがあります:

インデックス

Constant: QgsRasterLater.X

コメント

1

単バンドグレー

シングルバンドをグレーカラーで表示

2

シュードカラー

シングルバンドをグレーカラーで表示

3

カラーマップ

インデックスカラーをカラーマップで表示

4

グレースケールカラーマップ

インデックスカラーをグレースケール表示

5

シュードカラーカラーマップ

インデックスカラーをシュードカラーで表示

7

マルチバンドグレースケール

2バンド以上のレイヤをグレーカラーで表示

8

マルチバンドシュードカラー

2バンド以上のレイヤをシュードカラーで表示

9

マルチバンドカラー

2バンド以上のレイヤをカラーマップで表示

現在の表示方法を検索:

>>> rlayer.drawingStyle()
9

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

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

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

単バンドラスタ

デフォルトではグレースケールで表示されます. 表示方法をシュードカラーに帰る場合:

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

シュードカラー は低い値を青, 高い値を赤に割り当てる基本的な表示方法の一つです. フリークアウト はマニュアルにもあるように, より派手でけばけばしい色合いです.

カラーマップ ではカラーマップにより色をわりあてることができます. 値の補間方法には以下の3種類があります:

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

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

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

色を緑から黄色の補間で設定する場合 (グリッドの値は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)

デフォルトのグレースケールに戻す場合は:

>>> rlayer.setDrawingStyle(QgsRasterLayer.SingleBandGray)

マルチバンドラスタ

QGISではデフォルトで最初の3バンドを赤・緑・青に割り当てます (これは マルチバンドカラー と呼ばれる表示方法です. この設定を変更したい場合があるかもしれません. 以下のコードは赤バンド (1) と緑バンド (2) をい入れ替える例です:

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

グレースケールやシュードカラーを使って一つのバンドだけを表示することも可能です. 前のセクション参照:

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

レイヤの更新

レイヤの表示方法の変更をしてすぐ反映させたい場合は以下の方法を実行してください:

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

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

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

WMSラスタレイヤで、これらのコマンドは機能しません。この場合、あなたは明示的にそれをしないといけません:

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

レイヤの表示方法を変えた際 (ラスター及びベクターレイヤの変更方法のセクション参照), レイヤーリスト (凡例) の表示も更新したい場合は (QGISのインターフェースである``iface``) にて以下のようにすることで可能です:

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}