
Contents
実行環境 Windows 7 + PostgreSQL 9.5.0 に PL/v8 をインストール PostGIS 2.2 のインストールは 9.5 RC1 の時と同様(以上、1 月 23 日) PNG ファイルをインポートして PostGIS ラスタのサンプルデータを作る インポートしたラスタを再び PNG ファイルに出力して確認(以上、1 月 24 日) - PostGIS
ラスタで画像処理、続けて PNG ファイルに出力するテンプレート - PostGIS
の関数のソースを見て、PL/v8 への置き換えを考える (以下、1 月 26 日) コールバック関数 ST_Range4ma の PL/v8 版を作る PL/pgSQL の単純化バージョンも作る SQL でもコールバック関数を作る テストの全体 (以下、1 月 28 日) コールバック関数 4 つ × 周辺範囲 5 つ × 複数回テスト、を一つのクエリで テスト結果の TSV を PostgreSQL にインポート PL/v8 の方が、元からある PL/pgSQL の数倍速い (以下、1 月 31 日) テスト結果の PostgreSQL テーブルを R で読み込む 今回のテストと外れ値、95% 信頼区間について 全体を一つの棒グラフにまとめる(エラーバー付) ピクセル範囲から所要時間を予測する回帰式(関数別) 全体のまとめ
PostGIS ラスタで画像処理、続けて PNG ファイルに出力するテンプレート
前回までの続きです。説明は後にして、先にクエリのテンプレートを示します。↓copy ( select ST_AsPNG(ST_MapAlgebra ( rast, 1, 'st_range4ma(float[][][], int[][], text[])' :: regprocedure, '8BUI', 'FIRST', NULL, 4, 4) ) from adbadge_tall ) to program '"D:/AppsPortable/GitPortable/2.6.2/App/Git/usr/bin/xxd" -r -p > "出力先PNGファイル"';
昨日も書きましたが、今回の中心部分は
- Writing PostGIS raster Map Algebra Callback Functions in PLV8(Postgres OnLine Journal, 2014.1.27)
上のテンプレート中、ST_MapAlgebra
↓ 画像一つ目が元ラスタ、二つ目が上記クエリ(コールバック関数に


ST_MapAlgebra
- PostGIS 2.2.2dev Manual(英語): ST_MapAlgebra
— Callback function version - 〃
Built-in Map Algebra Callback Functions - PostGIS 2.2.0dev
マニュアル(日本語): ST_MapAlgebra — コールバック関数版 - 〃 組み込み地図代数コールバック関数
PostGIS の関数のソースを見て、PL/v8 への置き換えを考える
コールバック関数\pset format unaligned \pset tuples_only on -- 関数の定義文だけ見るため、設定変更 select prosrc from pg_proc where proname = 'st_range4ma' and proargnames[1] = 'value';-- PostGIS 2.1で追加された方 DECLARE _value double precision[][][]; min double precision; max double precision; x int; y int; z int; ndims int; BEGIN min := 'Infinity'::double precision; max := '-Infinity'::double precision; ndims := array_ndims(value); -- add a third dimension if 2-dimension IF ndims = 2 THEN _value := _st_convertarray4ma(value); ELSEIF ndims != 3 THEN RAISE EXCEPTION 'First parameter of function must be a 3-dimension array'; ELSE _value := value; END IF; -- raster FOR z IN array_lower(_value, 1)..array_upper(_value, 1) LOOP -- row FOR y IN array_lower(_value, 2)..array_upper(_value, 2) LOOP -- column FOR x IN array_lower(_value, 3)..array_upper(_value, 3) LOOP IF _value[z][y][x] IS NULL THEN IF array_length(userargs, 1) > 0 THEN _value[z][y][x] = userargs[array_lower(userargs, 1)]::double precision; ELSE CONTINUE; END IF; END IF; IF _value[z][y][x] < min THEN min := _value[z][y][x]; END IF; IF _value[z][y][x] > max THEN max := _value[z][y][x]; END IF; END LOOP; END LOOP; END LOOP; IF max = '-Infinity'::double precision OR min = 'Infinity'::double precision THEN RETURN NULL; END IF; RETURN max - min; END;

3
で、この
また一般的にラスタ演算のコールバック関数は配列への処理が中心なので、今回うまく行けば「PostGIS