実行環境 Windows 7 + PostgreSQL 9.5.0PL/v8をインストール PostGIS 2.2のインストールは9.5 RC1の時と同様(以上、昨日の記事) (以下、125日) PostGISラスタで画像処理、続けてPNGファイルに出力するテンプレート PostGISの関数のソースを見て、PL/v8への置き換えを考える (以下、126日) コールバック関数ST_Range4maPL/v8版を作る PL/pgSQLの単純化バージョンも作る SQLでもコールバック関数を作る テストの全体 (以下、128日) コールバック関数4つ × 周辺範囲5つ × 複数回テスト、を一つのクエリで テスト結果のTSVPostgreSQLにインポート PL/v8の方が、元からあるPL/pgSQLの数倍速い (以下、131日) テスト結果のPostgreSQLテーブルをRで読み込む 今回のテストと外れ値、95%信頼区間について 全体を一つの棒グラフにまとめる(エラーバー付) ピクセル範囲から所要時間を予測する回帰式(関数別) 全体のまとめ
Contents


PNGファイルをインポートしてPostGISラスタのサンプルデータを作る

今回の主要部分は ↓ をなぞってます。違うのは実行環境(Win + Postgres 9.5でやってみた)、PostGISラスタのサンプルデータ作成についても記述、画像処理結果のバイナリファイル出力についても記述、そしてビルトイン関数との比較を少し詳しく行ったことなど。


画像処理の対象も同じPostGISのロゴ ↓ にしました。以下、ロゴのPNGファイルをPostGISラスタとしてDBに取り込む手順について。下記のロゴ配布元からadbadge_tall.pngをダウンロードします(597
KB)。


PNGファイルをラスタにする際、PostGISに付属するコマンドラインツールraster2pgsqlを使います。コマンドプロンプトから単独で起動できますが、PostGISを普通にインストールするとpsqlと同じbinフォルダに配置されるので、psqlからも ↓ のように呼び出し可能。引数なしで起動するとバージョンとヘルプが表示されます。
-- on psql
\! raster2pgsql
RELEASE: 2.2.0 GDAL_VERSION=20 (r14208)
USAGE: raster2pgsql [<options>] <raster>[ <raster>[ ...]] [[<schema>.]<table>]
  Multiple rasters can also be specified using wildcards (*,?).

OPTIONS:
  -s <srid> Set the SRID field. Defaults to 0. If SRID not
     provided or is 0, raster's metadata will be checked to
     determine an appropriate SRID.
(...)


raster2pgsqlの最も単純な使い方。取り込みたいファイル、取り込み先テーブル名を半角空白で区切って渡すと、インポート用sqlコマンドを標準出力に吐き出します。
raster2pgsql PNGファイル インポート先テーブル


上記コマンドの後にパイプでpsqlをつなげれば一行でインポートできますが、今回は吐き出されるSQLを確認するため、一時ファイルに出力。↓raster2pgsqlの実行、出力先フォルダの確認、そしてSQLを画面表示した様子です。
\! raster2pgsql "R:/TMP/adbadge_tall.png" adbadge_tall > "R:/TMP/for_import.sql"
Processing 1/1: R:/TMP/adbadge_tall.png
INFO: Using default geotransform matrix (0, 1, 0, 0, 0, -1) for raster: R:/TMP/adbadge_tall.png

\! dir "R:/TMP"
(...)
Jan 22  19:22           611,223 adbadge_tall.png
Jan 22  19:41         4,214,681 for_import.sql
               2 File(s)      4,825,904 bytes
               2 Dir(s)   4,238,409,728 bytes free

\! more "R:/TMP/for_import.sql"
BEGIN;
CREATE TABLE "adbadge_tall" ("rid" serial PRIMARY KEY,"rast" raster);
INSERT INTO "adbadge_tall" ("rast") VALUES ('0100000400000000000000F03F000000000000 (...)


raster2pgsqlは処理完了のメッセージを出さないので、上のようにプロンプトなしのpsqlからファイル出力すると、終わったのかどうか一見分かりません^^;psqlで何かコマンドを打てる状態になっていれば終了済みで、エラーが出てないのでOKと仮定し先に進みます。元のPNG600
x878のフルカラーで、SQLは約4MBになりました。↓


psqlで外部SQLファイルの実行は、メタコマンド\i。SQLファイルのパスを「スラッシュ区切り&二重引用符でクォート」するとエラーで(普通のWindowsコンソールと逆)↓ クォートせずに渡します。先ほどraster2pgsqlコマンドで指定したテーブルが作成され、ラスタ1行が入力されました。メタコマンド\dでテーブル属性を確認すると主キーの連番IDが自動的に付いており、raster2pgsqlのデフォルトでそうなってます。
\i "R:/TMP/for_import.sql"
"R:/TMP/for_import.sql: Invalid argument ← クォートするとエラー

\i R:/TMP/for_import.sql
BEGIN
CREATE TABLE
INSERT 0 1
COMMIT

\d adbadge_tall
                           Table "public.adbadge_tall"
+--------+---------+------------------------------------------------------------+
| Column |  Type   |                         Modifiers                          |
+--------+---------+------------------------------------------------------------+
| rid    | integer | not null default nextval('adbadge_tall_rid_seq'::regclass) |
| rast   | raster  |                                                            |
+--------+---------+------------------------------------------------------------+
Indexes:
    "adbadge_tall_pkey" PRIMARY KEY, btree (rid)


インポートしたラスタを再びPNGファイルに出力して確認

ラスタをPNGファイルに逆変換して出力することにより、正常に作成されたかどうか確認します。手順は(1)PostGISST_AsPNG関数でラスタをPNG形式に変換、(2)結果のbytea型データを12日に書いた方法 ↓ でPNGファイルにエクスポート。
copy ( 一つのbytea型データを返すクエリ )
to program 'xxd -r -p > "出力先バイナリファイルのパス"';


実際のクエリは ↓ こんな感じ。xxdコマンドはGit Portable 2.6.2にあったものをそのまま使ってます。xxdのパスを短く書けないか少し試しましたが(psql上でカレントフォルダを移動する等)うまくいかず、今回は絶対パスのまま。
copy (
    select ST_AsPNG(rast) from adbadge_tall
)
to program '"D:/AppsPortable/GitPortable/2.6.2/App/Git/usr/bin/xxd" -r -p > "R:/check_original.png"';

上のとおり元と同じPNGになりました。これでサンプル用ラスタの準備・確認終わり。次の画像処理が今回の本題で、明日以降書きます。