名前

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[]引数は、ユーザ関数 userfunctionに処理用の引数を渡すかどうかにかかわらず求められます。

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
Geometry figure for visual-rt-st-mapalgebrafct-04