読者です 読者をやめる 読者になる 読者になる

waigani's diary

QGISを中心にFOSS4Gをいじくる

QGISハンズオン中級(ラスタ編)

FOSS4G Advent Calendar 2012

この記事はFOSS4G Advent Calendar 2012の穴埋め用に用意しておいたものです。
30日目にして公開。
8月から下書き状態で眠っていた記事を、書き直したものなんですが。。。

ラスタ編だよ

半年ほどあいてしまいましたが、
FOSS4G Hokkaidoハンズオン(裏メニュー)
FOSS4G Hokkaidoハンズオン(裏メニュー) 続き
の続きです。
ベクタ編に引き続きラスタ編もデータベースでどの辺を出来るかやってみます。
ラスタ編の資料はこちら。
https://dl.dropbox.com/u/1838363/QGIS_RAS.zip
ただしspatialiteはラスタに関しては解析機能がありませんので、PostgreSQL+PostGIS 2.0で行ってみます。

使った環境

この組み合わせで行っています。

PostgreSQLのインストール方法は省略。Windowsであれば、インストーラをダウンロードしてくれば特に問題無いかと。
PostGIS 2.0.1のインストールは、PostgreSQLのインストールに続いてスタックビルダにて行っています。

準備

GUI使えるところはGUIで行きましょう。
PgAdmin?を起動して、ユーザーとデータベースを作っておきます。
ログインロール"waigania13"としておきました。

作ったユーザーをオーナーにしてデータベースを作成。

その際に、templateは"template_posgis_20"にしておくのをお忘れなく。

作業手順

さてここからが本番です。
QGISハンズオン中級(ラスタ編)の中身は適当なディレクトリに解凍しておいてください。PostgreSQLの各種コマンドはC:\Program Files\PostgreSQL\9.2\binにあるとして進めます。
ハンズオンで行なっている

  • ラスタの結合
  • ラスタの投影変換
  • ラスタ情報の確認
  • 地形解析
  • ラスタのクリップ

辺りをなぞってみたいと思います。

10DEM Tiffファイルのインサート

raster2pgsqlで画像をデータベースに入れるためのSQL文を作成。demというテーブルに。QGIS_RAS\dataset\10DEMにある全てのtiffファイルを入れてしまいます。ラスタの結合はこれでOK。

raster2pgsql -c -I -s 4612 644130.tif dem > 644130.sql
raster2pgsql -a -s 4612 644131.tif dem > 644131.sql
raster2pgsql -a -s 4612 644140.tif dem > 644140.sql
raster2pgsql -a -s 4612 644141.tif dem > 644141.sql
raster2pgsql -a -s 4612 644150.tif dem > 644150.sql
raster2pgsql -a -s 4612 644151.tif dem > 644151.sql

なのですが、ここで問題が。出来たSQL文を実行すると、解像度が違うとか怒られます。
gdalinfoでタグの情報を見てみると、Pixel Sizeが微妙に違う(;_;)。644130.tifが、

Pixel Size = (0.000111111111111,-0.000111111110667)

644151.tifが、

Pixel Size = (0.000111111111111,-0.000111111112000)

精度的には無視しちゃっていい違いなのですが、ダメみたいですね。タグを書き換えたいとこですが、簡単な方法が思いつかず。

なので、ここは少々ずるをして、ハンズオン資料に入っている結合済みのラスタからスタートします。
QGIS_RAS\out_backup\6441.tifを使います。

raster2pgsql -c -I -s 4612 6441.tif dem > 6441.sql
psql -f 6441.sql -U waigania13 rastertest

psqlで少し中を見ておきましょう。

psql -U waigania13 rastertest

しておいて、\d demでカラムの表示、idとラスタデータのみ入っていることがわかります。

st_metadata()メタデータも見ておきましょう。原点座標とピクセル数、解像度、SRIDといった情報が入っています。

QGISの準備

確認はQGISから行いましょう。
QGISからPostGISのラスターテーブルにアクセスするためには、"Load Postgis raster to QGIS"プラグインを使用します。インストールしておきましょう。

"レイヤ"メニューに、"Add a Postgis Raster Layer"が追加されます。

ここで一旦"レイヤ"→"PostGISレイヤの追加"に戻っていただいて、接続のための設定をしておく必要があります。

再度"Add a Postgis Raster Layer"を選択すると、ラスターテーブルを選べるようになります。

ここで、SRIDのところが"0"になってしまっているので、"4612"と入力して読み込んでみましょう。
バンド1を原色で表示した絵ですが、データベースに取り込まれていることを確認出来ます。

ラスタの投影変換

投影変換はst_transform()で行えます。
リサンプリング時のアルゴリズム等もオプションで指定出来ます。ここでは、JGD2000/平面直角座標系12系(SRID:2454)への変換として、SRIDだけ指定すると、

select st_transform(rast, 2454) from dem;

となります。
メタデータを覗いてみると、

投影変換されてそうですね。

ラスタのクリップ

ハンズオン資料(QGIS_RAS\dataset\shp\J_buf_z12)のポリゴンを使ってクリップを行ってみます。
まずはshapefileをデータベースへ取り込み。

shp2pgsql -c -I -s 2454 J_buf_z12.shp j_buf_z12 > j_buf_z12.sql
psql -U waigania12 -f j_buf_z12.sql rastertest

クリップはst_clip()にて行えます。
クリップした画像をdem_clipテーブルに保存するようにします。お互いのテーブルにデータは1行しかないので、特にwhere句も設定しません。

create table dem_clip(rid integer, rast raster);
insert into dem_clip(rid, rast)
select d.rid, st_clip(st_transform(d.rast, 2454), j.geom) 
from dem d, j_buf_z12 j;

QGISで結果を表示してみると、このような感じになります。

地形解析

st_hillshade()st_slope()を用いて地形解析も行えます。
st_hillshade()を試してみましょう。

create table dem_hillshade(rid integer, rast raster);
insert into dem_hillshade(rid, rast) 
select rid, st_hillshade(rast, 1, '8BUI', radians(315), radians(45))
from dem;

QGISで結果を表示してみると、このような感じになります。

もうひとつおまけで、QGISのラスタ計算機のようなことをする場合、st_mapalgebraexpr()を使用出来ます。
標高1000m以上の地点を1、それ以外を0としたラスタを作るとすると、

create table dem_expr(rid integer rast raster);
insert into dem_expr(rid, rast) 
select rid, st_mapalgebraexpr(rast, 1, '1BB', 'CASE WHEN [rast] >= 1000 THEN 1 ELSE 0 END') 
from dem;

のように行えます。

感想

いろいろ出来るのはわかるのですが、データベースでやる意義が見出せない orz
データベースを使うべき場面を誰か教えて。