ST_MapAlgebraFct — 1バンド版 - 入力バンドに対する妥当な PostgreSQL 関数で形成された、指定したピクセルタイプとなる 1バンドラスターを生成します。バンドを指定しない場合には、1番と仮定します。
raster ST_MapAlgebraFct(raster rast, regprocedure onerasteruserfunc);
raster ST_MapAlgebraFct(raster rast, regprocedure onerasteruserfunc, text[] VARIADIC args);
raster ST_MapAlgebraFct(raster rast, text pixeltype, regprocedure onerasteruserfunc);
raster ST_MapAlgebraFct(raster rast, text pixeltype, regprocedure onerasteruserfunc, text[] VARIADIC args);
raster ST_MapAlgebraFct(raster rast, integer band, regprocedure onerasteruserfunc);
raster ST_MapAlgebraFct(raster rast, integer band, regprocedure onerasteruserfunc, text[] VARIADIC args);
raster ST_MapAlgebraFct(raster rast, integer band, text pixeltype, regprocedure onerasteruserfunc);
raster ST_MapAlgebraFct(raster rast, integer band, text pixeltype, regprocedure onerasteruserfunc, text[] VARIADIC args);
|
|
|
ST_MapAlgebraFct は 2.1.0で非推奨になりました。代わりにST_MapAlgebra (callback function version)を使います。 |
入力ラスター (rast) に対してonerasteruserfuncで指定される妥当な PostgreSQL 関数で形成されたラスターを返します。生成されるラスターは指定したピクセルタイプとなる 1バンドラスターです。bandを指定しない場合には、1番と仮定します。新しいラスターは、元のラスターと同じ地理参照、幅、高さを持ちますが、一つのバンドしか持ちません。
pixeltypeが渡された場合には、新しいラスターのバンドは、そのピクセルタイプになります。pixeltype に NULL が渡された場合には、新しいラスターは入力rastのバンドのピクセルタイプと同じになります。
onerasteruserfunc引数は SQL 関数または PL/pgSQL 関数の名前とシグネチャで、regprocedure にキャストします。大変単純で本当に使えない PL/pgSQL関数の例を挙げます:
CREATE OR REPLACE FUNCTION simple_function(pixel FLOAT, pos INTEGER[], VARIADIC args TEXT[])
RETURNS FLOAT
AS $$ BEGIN
RETURN 0.0;
END; $$
LANGUAGE 'plpgsql' IMMUTABLE;
userfunctionは、2または 3の引数を受け付けます。すなわち、float8値、任意引数の整数配列、VARIADIC 文字列配列です。第 1引数はラスターセルごとの値です (ラスターのデータ型に関係なく)。第 2引数は現在の処理セルの位置で、'{x,y}'であらわされます。第 3引数は、ST_MapAlgebraFctへのパラメータの残っているもの全てがuserfunctionに渡されることを示します。
regprocedure引数を SQL 関数に渡す場合には、渡し先の完全な関数シグネチャが必要で、さらにregprocedureにキャストします。上の例の PL/pgSQL 関数を引数として渡すには、引数の SQL は次のようになります:
'simple_function(float,integer[],text[])'::regprocedure
引数には関数名が含まれ、関数引数の型、関数名と引数型を引用符で括ったもの、regprocedureへのキャストが存在することに注意して下さい。
userfunctionの第 3引数はvariadic text配列です。どのST_MapAlgebraFctにもついてくる全ての文字列引数は、指定されたuserfunctionに、そのまま渡されて、args引数内に入ります。
|
|
|
VARIADIC キーワードに関する詳細情報については、PostgreSQL 文書とQuery Language (SQL) Functions (訳注: 日本語版は「問い合わせ言語 (SQL)関数」です) の"SQL Functions with Variable Numbers of Arguments" (訳注: 日本語版は「可変長引数を取る SQL 関数」) 節を参照して下さい。 |
|
|
|
text[]引数は、ユーザ関数 |
Availability: 2.0.0
元のラスターから 1バンドラスターを生成します。元のラスターバンドの値について 2で割った余りが入ります。
ALTER TABLE dummy_rast ADD COLUMN map_rast raster;
CREATE FUNCTION mod_fct(pixel float, pos integer[], variadic args text[])
RETURNS float
AS $$
BEGIN
RETURN pixel::integer % 2;
END;
$$
LANGUAGE 'plpgsql' IMMUTABLE;
UPDATE dummy_rast SET map_rast = ST_MapAlgebraFct(rast, NULL, 'mod_fct(float,integer[],text[])'::regprocedure) WHERE rid = 2;
SELECT ST_Value(rast, 1, i, j) As origval, ST_Value(map_rast, 1, i, j) As mapval
FROM dummy_rast CROSS JOIN generate_series(1, 3) AS i CROSS JOIN generate_series(1, 3) AS j
WHERE rid = 2;
origval | mapval
---------+--------
253 | 1
254 | 0
253 | 1
253 | 1
254 | 0
254 | 0
250 | 0
254 | 0
254 | 0
ピクセルタイプが 2BUI の 1バンドラスターを生成します。元のラスターに対して再分類を行った値が入り、NODATA 値をユーザ関数に渡される引数の値 (0) に設定します。
ALTER TABLE dummy_rast ADD COLUMN map_rast2 raster;
CREATE FUNCTION classify_fct(pixel float, pos integer[], variadic args text[])
RETURNS float
AS
$$
DECLARE
nodata float := 0;
BEGIN
IF NOT args[1] IS NULL THEN
nodata := args[1];
END IF;
IF pixel < 251 THEN
RETURN 1;
ELSIF pixel = 252 THEN
RETURN 2;
ELSIF pixel
> 252 THEN
RETURN 3;
ELSE
RETURN nodata;
END IF;
END;
$$
LANGUAGE 'plpgsql';
UPDATE dummy_rast SET map_rast2 = ST_MapAlgebraFct(rast,'2BUI','classify_fct(float,integer[],text[])'::regprocedure, '0') WHERE rid = 2;
SELECT DISTINCT ST_Value(rast,1,i,j) As origval, ST_Value(map_rast2, 1, i, j) As mapval
FROM dummy_rast CROSS JOIN generate_series(1, 5) AS i CROSS JOIN generate_series(1,5) AS j
WHERE rid = 2;
origval | mapval
---------+--------
249 | 1
250 | 1
251 |
252 | 2
253 | 3
254 | 3
SELECT ST_BandPixelType(map_rast2) As b1pixtyp FROM dummy_rast WHERE rid = 2;
b1pixtyp ---------- 2BUI
新しいバンドを三つ持つラスターを生成します。元のバンドを三つ持つラスターと同じピクセルタイプです。1番バンドは地図代数関数によって変更され、残りの二つのバンドは値が代わりません。
CREATE FUNCTION rast_plus_tan(pixel float, pos integer[], variadic args text[])
RETURNS float
AS
$$
BEGIN
RETURN tan(pixel) * pixel;
END;
$$
LANGUAGE 'plpgsql';
SELECT ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(rast_view),
ST_MapAlgebraFct(rast_view, 1, NULL, 'rast_plus_tan(float,integer[],text[])'::regprocedure)
),
ST_Band(rast_view, 2)
),
ST_Band(rast_view, 3) As rast_view_ma
)
FROM wind
WHERE rid=167;
上の非推奨のコールバック形式は、単純なピクセルごとの変換については ST_MapAlgebra (callback function version) の式と等価です。この例では元のラスターと、2で割った剰余による分類を行ったものとを示します。
WITH pixels AS (
SELECT x, y, (x + y * 2)::double precision AS value
FROM generate_series(1, 48) AS x
CROSS JOIN generate_series(1, 48) AS y
), rows AS (
SELECT y, array_agg(value ORDER BY x) AS values
FROM pixels
GROUP BY y
), source AS (
SELECT ST_SetValues(
ST_AddBand(
ST_MakeEmptyRaster(48, 48, 0, 48, 1, -1, 0, 0, 0),
1, '8BUI', 0, 0
),
1, 1, 1, array_agg(values ORDER BY y)::double precision[][]
) AS rast
FROM rows
), variants AS (
SELECT 'source' AS title, rast AS rendered FROM source
UNION ALL
SELECT 'modulo 2', ST_MapAlgebra(
rast, 1,
'8BUI',
'mod([rast]::integer,2) * 255'
)
FROM source
)
SELECT title, ST_AsPNG(rendered) AS image
FROM variants
ORDER BY title DESC;
title | image ----------+------------------------- source | PNG image, 48 x 48 pixels modulo 2 | PNG image, 48 x 48 pixels