名称

ST_MapAlgebraFctNgb — 单波段版本:使用用户定义的 PostgreSQL 函数进行地图代数最近邻运算。返回一个栅格,其值是 PLPGSQL 用户函数对输入栅格波段的值邻域进行运算的结果。

概要

栅格 ST_MapAlgebraFctNgb(栅格 rast, 整数 band, 文本 pixeltype, 整数 ngbwidth, 整数 ngbheight, regprocedure onerastngbuserfunc, 文本 nodatamode, 文本[] VARIADIC args);

描述

[Warning]

ST_MapAlgebraFctNgb 从 2.1.0 版本开始已弃用。请改用 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 像素范围内对像素进行平均后的新栅格