ラスターレイヤを使う

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

レイヤについて

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

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

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

“Palette” layerdrawn using a pseudocolor algorithm
7

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

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

8

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

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

9

マルチバンドカラー

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

現在の表示方法を検索:

>>> rlayer.drawingStyle()
9

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

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

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

単バンドラスタ

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

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

The PseudoColorShader is a basic shader that highlighs 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.

カラーマップ ではカラーマップにより色をわりあてることができます. 値の補間方法には以下の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以降で使用可能になりました.

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

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

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

The results method in this case returs a dictionary, with band indices as keys, and band values as values.

{1: 17, 2: 220}