PostGIS
Name
ST_MapAlgebraFctNgb — 1-band version: Map Algebra Nearest Neighbor using user-defined PostgreSQL function. Return a raster which values are the result of a PLPGSQL user function involving a neighborhood of values from the input raster band.
Synopsis
raster +`*`+ST_MapAlgebraFctNgb
*(`raster `rast
, integer
band
, text pixeltype
, integer ngbwidth
, integer
ngbheight
, regprocedure onerastngbuserfunc
, text nodatamode
,
text[] VARIADIC args`
)`;
Description
|
(one raster version) Return a raster which values are the result of a PLPGSQL user function involving a neighborhood of values from the input raster band. The user function takes the neighborhood of pixel values as an array of numbers, for each pixel, returns the result from the user function, replacing pixel value of currently inspected pixel with the function result.
- rast
-
Raster on which the user function is evaluated.
- band
-
Band number of the raster to be evaluated. Default to 1.
- pixeltype
-
The resulting pixel type of the output raster. Must be one listed in ST_BandPixelType or left out or set to NULL. If not passed in or set to NULL, will default to the pixeltype of the
rast
. Results are truncated if they are larger than what is allowed for the pixeltype. - ngbwidth
-
The width of the neighborhood, in cells.
- ngbheight
-
The height of the neighborhood, in cells.
- onerastngbuserfunc
-
PLPGSQL/psql user function to apply to neighborhood pixels of a single band of a raster. The first element is a 2-dimensional array of numbers representing the rectangular pixel neighborhood
- nodatamode
-
Defines what value to pass to the function for a neighborhood pixel that is nodata or NULL + 'ignore': any NODATA values encountered in the neighborhood are ignored by the computation — this flag must be sent to the user callback function, and the user function decides how to ignore it. + 'NULL': any NODATA values encountered in the neighborhood will cause the resulting pixel to be NULL — the user callback function is skipped in this case. + 'value': any NODATA values encountered in the neighborhood are replaced by the reference pixel (the one in the center of the neighborhood). Note that if this value is NODATA, the behavior is the same as 'NULL' (for the affected neighborhood)
- args
-
Arguments to pass into the user function.
Availability: 2.0.0
Examples
Examples utilize the katrina raster loaded as a single tile described in http://trac.osgeo.org/gdal/wiki/frmts_wtkraster.html and then prepared in the ST_Rescale examples
--
-- 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;
First band of our raster |
new raster after averaging pixels withing 4x4 pixels of each other |