ST_MapAlgebraFct — 1 波段版本 - 通过在输入栅格波段和提供的像素类型上应用有效的 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)
;
ST_MapAlgebraFct 自 2.1.0 起已弃用。 使用ST_MapAlgebra (callback function version)(回调函数版本)代替。 |
创建一个新的单波段栅格,该栅格是通过在输入栅格 (rast
) 上应用 oneerasteruserfunc
指定的有效 PostgreSQL 函数而形成的。 如果未指定波段
,则假定为波段 1。 新栅格将具有与原始栅格相同的地理参考、宽度和高度,但只有一个波段。
如果传入像素类型
,则新栅格将具有该像素类型的波段。 如果将像素类型传递为 NULL,则新的栅格带将具有与输入栅格
带相同的像素类型。
oneerasteruserfunc
参数必须是 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
的第三个参数是一个可变文本数组。 任何ST_MapAlgebraFct 调用的所有尾随文本参数都会传递到指定的userfunction
,并包含在 args
参数中。
有关 VARIADIC 关键字的更多信息,请参阅 PostgreSQL 文档和查询语言 (SQL) 函数的“具有可变参数数量的 SQL 函数”部分。 |
无论您是否选择将任何参数传递给userfunction进行处理, text[] 参数在 |
可用性: 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
|
|
从原始 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;