このセクションではラスタレイヤに対して行える様々な操作について紹介していきます.
ラスタレイヤは、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 から派生)はいくつかあります:
QgsSingleBandGrayRenderer
単バンドラスタレイヤはグレースケール(低い値=黒, 高い値=白)でも, 単バンドの値に色を割り当てたシュードカラーでも表示できます. また, 単バンドラスタはカラーマップでも表示できます. マルチバンドラスタは基本的にRGBカラーが割り当てて表示されますが, いずれかのバンドをグレースケールやシュードカラーで表示することもできます.
続いてのセクションではどのようにレイヤの表示方法を探したり変更するのかを説明していきます. 設定変更後にマップキャンバスの表示も更新をしたい場合は, レイヤの更新 を参考にしてください.
*特定の値の強調, 透過 (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からインデックス付けされている)。
レイヤシンボルを変更し、変更がユーザーにすぐに表示されていることを確認したい場合、これらのメソッドを呼び出します
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)