名称

ST_MapAlgebraFct — 单波段版本 - 通过对输入栅格波段应用有效的 PostgreSQL 函数,并使用提供的像素类型创建一个新的单波段栅格。如果未指定波段,则假定为波段 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);

描述

[Warning]

从 2.1.0 版本开始,ST_MapAlgebraFct 已被弃用。请改用 ST_MapAlgebra (回调函数版本)

通过对输入栅格 (rast) 应用由 onerasteruserfunc 指定的有效 PostgreSQL 函数,创建一个新的单波段栅格。如果未指定 band,则假定为波段 1。新栅格将具有与原始栅格相同的地理参考、宽度和高度,但只有一个波段。

如果传入 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 可以接受两个或三个参数:一个浮点数值、一个可选的整数数组和一个可变文本数组。第一个参数是单个栅格单元的值(无论栅格数据类型如何)。第二个参数是以“{x,y}”形式表示的当前处理单元的位置。第三个参数表示 ST_MapAlgebraFct 的所有剩余参数都应传递给 userfunction

regprodedure 参数传递给 SQL 函数需要传递完整的函数签名,然后强制转换为 regprocedure 类型。要将上面的 PL/pgSQL 函数示例作为参数传递,该参数的 SQL 为

'simple_function(float,integer[],text[])'::regprocedure

请注意,该参数包含函数名称、函数参数的类型、名称和参数类型周围的引号以及强制转换为 regprocedure

userfunction 的第三个参数是一个 variadic text 数组。任何 ST_MapAlgebraFct 调用的所有尾随文本参数都将传递给指定的 userfunction,并包含在 args 参数中。

[Note]

有关 VARIADIC 关键字的更多信息,请参阅 PostgreSQL 文档和 查询语言 (SQL) 函数 的“具有可变数量参数的 SQL 函数”部分。

[Note]

无论您是否选择将任何参数传递给用户函数进行处理,userfunctiontext[] 参数都是必需的。

可用性:2.0.0

示例

从我们的原始栅格创建一个新的单波段栅格,该栅格是原始栅格波段的模 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 像素类型的单波段栅格,该栅格经过重新分类,并将无数据值设置为传递给用户函数的参数 (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

原始(列 rast-view)

rast_view_ma

从我们的原始 3 波段栅格创建一个新的 3 波段栅格,像素类型相同,其中第一个波段通过地图代数更改,其余 2 个波段保持不变。

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;