ST_Slope
Name
ST_Slope — Returns the slope (in degrees by default) of an elevation raster band. Useful for analyzing terrain.
Synopsis
raster
ST_Slope
(
raster
rast
, integer
nband=1
, text
pixeltype=32BF
, text
units=DEGREES
, double precision
scale=1.0
, boolean
interpolate_nodata=FALSE
)
;
raster
ST_Slope
(
raster
rast
, integer
nband
, raster
customextent
, text
pixeltype=32BF
, text
units=DEGREES
, double precision
scale=1.0
, boolean
interpolate_nodata=FALSE
)
;
Description
Returns the slope (in degrees by default) of an elevation raster band. Utilizes map algebra and applies the slope equation to neighboring pixels.
units
indicates the units of the slope. Possible values are: RADIANS, DEGREES (default), PERCENT.
scale
is the ratio of vertical units to horizontal. For Feet:LatLon use scale=370400, for Meters:LatLon use scale=111120.
If
interpolate_nodata
is TRUE, values for NODATA pixels from the input raster will be interpolated using
ST_InvDistWeight4ma
before computing the surface slope.
For more information about Slope, Aspect and Hillshade, please refer to ESRI - How hillshade works and ERDAS Field Guide - Slope Images . |
Availability: 2.0.0
Enhanced: 2.1.0 Uses ST_MapAlgebra() and added optional
units
,
scale
,
interpolate_nodata
function parameters
Changed: 2.1.0 In prior versions, return values were in radians. Now, return values default to degrees
Examples: Variant 1
WITH foo AS ( SELECT ST_SetValues( ST_AddBand(ST_MakeEmptyRaster(5, 5, 0, 0, 1, -1, 0, 0, 0), 1, '32BF', 0, -9999), 1, 1, 1, ARRAY[ [1, 1, 1, 1, 1], [1, 2, 2, 2, 1], [1, 2, 3, 2, 1], [1, 2, 2, 2, 1], [1, 1, 1, 1, 1] ]::double precision[][] ) AS rast ) SELECT ST_DumpValues(ST_Slope(rast, 1, '32BF')) FROM foo st_dumpvalues ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --------------------------------------------------------------------- (1,"{{10.0249881744385,21.5681285858154,26.5650520324707,21.5681285858154,10.0249881744385},{21.5681285858154,35.2643890380859,36.8698959350586,35.2643890380859,21.5681285858154}, {26.5650520324707,36.8698959350586,0,36.8698959350586,26.5650520324707},{21.5681285858154,35.2643890380859,36.8698959350586,35.2643890380859,21.5681285858154},{10.0249881744385,21. 5681285858154,26.5650520324707,21.5681285858154,10.0249881744385}}") (1 row)
Examples: Variant 2
Complete example of tiles of a coverage. This query only works with PostgreSQL 9.1 or higher.
WITH foo AS ( SELECT ST_Tile( ST_SetValues( ST_AddBand( ST_MakeEmptyRaster(6, 6, 0, 0, 1, -1, 0, 0, 0), 1, '32BF', 0, -9999 ), 1, 1, 1, ARRAY[ [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 2, 1], [1, 2, 2, 3, 3, 1], [1, 1, 3, 2, 1, 1], [1, 2, 2, 1, 2, 1], [1, 1, 1, 1, 1, 1] ]::double precision[] ), 2, 2 ) AS rast ) SELECT t1.rast, ST_Slope(ST_Union(t2.rast), 1, t1.rast) FROM foo t1 CROSS JOIN foo t2 WHERE ST_Intersects(t1.rast, t2.rast) GROUP BY t1.rast;