PostGIS
Name
ST_MapAlgebraFct — 1 band version - Creates a new one band raster formed by applying a valid PostgreSQL function on the input raster band and of pixeltype prodived. Band 1 is assumed if no band is specified.
Synopsis
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`
)`;
Description
|
Creates a new one band raster formed by applying a valid PostgreSQL
function specified by the onerasteruserfunc
on the input raster
(rast
). If no band
is specified, band 1 is assumed. The new
raster will have the same georeference, width, and height as the
original raster but will only have one band.
If pixeltype
is passed in, then the new raster will have a band of
that pixeltype. If pixeltype is passed NULL, then the new raster band
will have the same pixeltype as the input rast
band.
The onerasteruserfunc
parameter must be the name and signature of a
SQL or PL/pgSQL function, cast to a regprocedure. A very simple and
quite useless PL/pgSQL function example is:
CREATE OR REPLACE FUNCTION simple_function(pixel FLOAT, pos INTEGER[], VARIADIC args TEXT[])
RETURNS FLOAT
AS $$ BEGIN
RETURN 0.0;
END; $$
LANGUAGE 'plpgsql' IMMUTABLE;
The userfunction
may accept two or three arguments: a float value,
an optional integer array, and a variadic text array. The first argument
is the value of an individual raster cell (regardless of the raster
datatype). The second argument is the position of the current processing
cell in the form '\{x,y}'. The third argument indicates that all
remaining parameters to ST_MapAlgebraFct
shall be passed through to the userfunction
.
Passing a regprodedure argument to a SQL function requires the full function signature to be passed, then cast to a regprocedure type. To pass the above example PL/pgSQL function as an argument, the SQL for the argument is:
'simple_function(float,integer[],text[])'::regprocedure
Note that the argument contains the name of the function, the types of the function arguments, quotes around the name and argument types, and a cast to a regprocedure.
The third argument to the userfunction
is a variadic text
array. All trailing text arguments to any
ST_MapAlgebraFct call are passed through
to the specified userfunction
, and are contained in the args
argument.
|
|
Availability: 2.0.0
Examples
Create a new 1 band raster from our original that is a function of modulo 2 of the original raster band.
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
Create a new 1 band raster of pixel-type 2BUI from our original that is reclassified and set the nodata value to a passed parameter to the user function (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
original (column rast-view) |
rast_view_ma |
Create a new 3 band raster same pixel type from our original 3 band raster with first band altered by map algebra and remaining 2 bands unaltered.
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;