名前

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
Geometry figure for visual-rt-st-mapalgebrafctngb-01

近隣の平均化。

ラスターの 1番バンド

平均化の結果