ST_MapAlgebraFctNgb — 1バンド版: ユーザ定義 PostgreSQL 関数を使用する最近傍地図代数関数です。入力ラスタバンドの近傍の値を与えた PL/pgSQL ユーザ定義関数の結果からなるラスターを返します。
raster ST_MapAlgebraFctNgb(raster rast, integer band, text pixeltype, integer ngbwidth, integer ngbheight, regprocedure onerastngbuserfunc, text nodatamode, text[] VARIADIC args);
|
|
|
ST_MapAlgebraFctNgb は 2.1.0で非推奨になりました。代わりにST_MapAlgebra (callback function version)を使います。 |
(1バンド版) 入力ラスターバンドの近傍の値を与えた PL/pgSQL ユーザ定義関数の結果からなるラスターを返します。ユーザ定義関数は近傍のピクセル値を数の配列として取り、ピクセル毎に、ユーザ定義関数からの結果を返し、現在の対象ピクセルのピクセル値を関数の返り値に置き換えます。
rast
ユーザ定義関数が評価されるラスターです。
band
評価されるラスターのバンド番号です。デフォルトは 1です。
pixeltype
出力ラスターのピクセルタイプです。ST_BandPixelTypeの一覧にあるものか、指定しないか、NULL を指定します。指定しないか NULL を指定した場合には、rastのピクセルタイプがデフォルトになります。結果ピクセル値がピクセルタイプが許容する範囲を超える場合には、切り詰められます。
ngbwidth
セル単位の近傍の幅です。
ngbheight
セル単位の近傍の高さです。
onerastngbuserfunc
ラスターの単一バンドの近傍ピクセルに適用される PL/pgSQL ユーザ定義関数です。一つ目の要素は、近傍ピクセルの四角形を表現する数値の 2次元配列です。
nodatamode
NODATA または NULL となる近傍ピクセルにおける関数に渡す値を定義します。
'ignore': 近傍で遭遇した NODATA 値全てが計算から除外されます。ユーザ定義関数に必ず送られ、ユーザ定義関数が対処方法を決定します。
'NULL': 近傍で遭遇した NODATA 値全てが結果を NULL とします。この場合はユーザ定義関数が呼び出されません。
'value': 近傍で遭遇した NODATA 値全てが参照ピクセル (近傍の中心にあるピクセル) の値に置き換えられます。この値が NODATA になった場合には、'NULL'と同じ挙動を取ります (影響のある近傍について)。
args
ユーザ定義関数に渡される引数です。
Availability: 2.0.0
単一タイルとしてロードされたカトリーナのラスターを使った例です。https://gdal.org/user/drivers/raster/postgisraster.htmlに説明があります。また、ST_Rescaleの例で準備を行っています
単純な'callback'として隣接ピクセルの値を全て平均する関数を使います。
CREATE OR REPLACE FUNCTION rast_avg(matrix float[][], nodatamode text, variadic args text[])
RETURNS float AS
$$
DECLARE
_matrix float[][];
x1 integer;
x2 integer;
y1 integer;
y2 integer;
sum float;
BEGIN
_matrix := matrix;
sum := 0;
FOR x in array_lower(matrix, 1)..array_upper(matrix, 1) LOOP
FOR y in array_lower(matrix, 2)..array_upper(matrix, 2) LOOP
sum := sum + _matrix[x][y];
END LOOP;
END LOOP;
RETURN (sum*1.0/(array_upper(matrix,1)*array_upper(matrix,2) ))::integer ;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE COST 1000;
入力ピクセルの X 方向、Y 方向で各 2ピクセル以内のピクセル値を平均するコールバック関数を適用する。
SELECT ST_MapAlgebraFctNgb(
rast,
1,
'8BUI',
4,
4,
'rast_avg(float[][], text, text[])'::regprocedure,
'NULL',
NULL) As nn_with_border
FROM katrinas_rescaled
limit 1;
自己完結型の近隣ピクセルの平均計算。元ラスターには中心に鋭く値が立ち上がっている正方形がありますが、結果では近隣ピクセルの向こう側に拡散しています。元データは NODATA でない値で背景を作っているので nodatamode ignore で、平均の値には背景の値と正方形の値とが使われ、背景の値を除けることはありません。
WITH source AS (
SELECT ST_SetValues(
ST_AddBand(
ST_MakeEmptyRaster(16, 16, 0, 16, 1, -1, 0, 0, 0),
1, '8BUI', 25, NULL
),
1, 6, 6,
ARRAY[
[240, 240, 240, 240, 240, 240],
[240, 240, 240, 240, 240, 240],
[240, 240, 240, 240, 240, 240],
[240, 240, 240, 240, 240, 240],
[240, 240, 240, 240, 240, 240],
[240, 240, 240, 240, 240, 240]
]::double precision[][]
) AS rast
), variants AS (
SELECT 'source' AS title, rast AS rendered FROM source
UNION ALL
SELECT 'averaged', ST_SetBandNoDataValue(ST_MapAlgebraFctNgb(
rast,
1,
'8BUI',
2,
2,
'ST_Mean4ma(float[][],text,text[])'::regprocedure,
'ignore',
NULL
), NULL) FROM source
)
SELECT title, ST_AsPNG(rendered) AS image
FROM variants
ORDER BY title DESC;
title | image ----------+------------------------- source | PNG image, 16 x 16 pixels averaged | PNG image, 16 x 16 pixels
近隣の平均化。
ラスターの 1番バンド |
平均化の結果 |