名稱

ST_MapAlgebraFctNgb — 單波段版本:使用使用者定義的 PostgreSQL 函數進行地圖代數最近鄰計算。返回一個光柵,其值是來自輸入光柵波段的鄰域值的 PLPGSQL 使用者函數的結果。

概要

raster ST_MapAlgebraFctNgb(raster rast, integer band, text pixeltype, integer ngbwidth, integer ngbheight, regprocedure onerastngbuserfunc, text nodatamode, text[] VARIADIC args);

描述

[Warning]

自 2.1.0 版本起,ST_MapAlgebraFctNgb 已被棄用。請改用 ST_MapAlgebra (回呼函數版本)

(單一光柵版本) 返回一個光柵,其值是來自輸入光柵波段的鄰域值的 PLPGSQL 使用者函數的結果。使用者函數將像素值的鄰域作為數字陣列,對於每個像素,返回使用者函數的結果,將目前檢查像素的像素值替換為函數結果。

rast

在其上評估使用者函數的光柵。

band

要評估的光柵的波段編號。預設為 1。

pixeltype

輸出光柵的結果像素類型。必須是 ST_BandPixelType 中列出的其中一種,或省略或設定為 NULL。如果未傳入或設定為 NULL,則預設為 rast 的像素類型。如果結果大於像素類型所允許的值,則會被截斷。

ngbwidth

鄰域的寬度,以像元為單位。

ngbheight

鄰域的高度,以像元為單位。

onerastngbuserfunc

要應用於光柵單個波段的鄰域像素的 PLPGSQL/psql 使用者函數。第一個元素是一個表示矩形像素鄰域的二維數字陣列。

nodatamode

定義要傳遞給函數的鄰域像素值,該像素為 nodata 或 NULL。

'ignore':在計算中忽略鄰域中遇到的任何 NODATA 值 — 此標誌必須傳送給使用者回呼函數,並且使用者函數決定如何忽略它。

'NULL':在鄰域中遇到的任何 NODATA 值都會導致結果像素為 NULL — 在這種情況下,將跳過使用者回呼函數。

'value':在鄰域中遇到的任何 NODATA 值都將被參考像素(位於鄰域中心的像素)替換。請注意,如果此值為 NODATA,則行為與 'NULL' 相同(對於受影響的鄰域)。

args

要傳遞到使用者函數的參數。

可用性:2.0.0

範例

範例使用載入為單一圖塊的 katrina 光柵,如 http://trac.osgeo.org/gdal/wiki/frmts_wtkraster.html 中所述,然後在 ST_Rescale 範例中準備。

--
-- A simple 'callback' user function that averages up all the values in a neighborhood.
--
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;

-- now we apply to our raster averaging pixels within 2 pixels of each other in X and Y direction --
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;
                    

我們的光柵的第一個波段

在彼此 4x4 像素範圍內對像素取平均值後的新光柵