ST_Aspect — Returns the aspect (in degrees by default) of an elevation raster band. Useful for analyzing terrain.
raster ST_Aspect(raster rast, integer band=1, text pixeltype=32BF, text units=DEGREES, boolean interpolate_nodata=FALSE);
raster ST_Aspect(raster rast, integer band, raster customextent, text pixeltype=32BF, text units=DEGREES, boolean interpolate_nodata=FALSE);
Returns the aspect (in degrees by default) of an elevation raster band. Utilizes map algebra and applies the aspect equation to neighboring pixels.
units indicates the units of the aspect. Possible values are: RADIANS, DEGREES (default).
When units = RADIANS, values are between 0 and 2 * pi radians measured clockwise from North.
When units = DEGREES, values are between 0 and 360 degrees measured clockwise from North.
If slope of pixel is zero, aspect of pixel is -1.
|
|
|
For more information about Slope, Aspect and Hillshade, please refer to ESRI - How hillshade works and ERDAS Field Guide - Aspect Images. |
Availability: 2.0.0
Enhanced: 2.1.0 Uses ST_MapAlgebra() and added optional interpolate_nodata function parameter
Changed: 2.1.0 In prior versions, return values were in radians. Now, return values default to degrees
Variant 1.
This symmetric peak highlights the expected compass
directions at the corners and the -1
aspect at the summit. The generated PNG shows the full
aspect surface without relying on a manual illustration.
The generated source raster is large enough for the PNG to
show the directional field around the summit.
WITH pixels AS (
SELECT
x,
y,
(20 - greatest(abs(x - 9), abs(y - 9)))::double precision AS value
FROM generate_series(1, 17) AS y
CROSS JOIN generate_series(1, 17) AS x
), rows AS (
SELECT
y,
array_agg(value ORDER BY x) AS row_values
FROM pixels
GROUP BY y
), source AS (
SELECT ST_SetValues(
ST_AddBand(
ST_MakeEmptyRaster(17, 17, 0, 0, 1, -1, 0, 0, 0),
1, '32BF', 0, -9999
),
1, 1, 1,
array_agg(row_values ORDER BY y)::double precision[][]
) AS rast
FROM rows
), aspect AS (
SELECT ST_Aspect(rast, 1, '32BF') AS rast
FROM source
)
SELECT
round(ST_Value(rast, 1, 1, 1)::numeric, 3) AS northwest_degrees,
round(ST_Value(rast, 1, 9, 9)::numeric, 3) AS summit_degrees,
round(ST_Value(rast, 1, 17, 17)::numeric, 3) AS southeast_degrees,
ST_AsPNG(ST_ColorMap(rast, 1, 'bluered')) AS image
FROM aspect;
northwest_degrees | summit_degrees | southeast_degrees | image
-------------------+----------------+-------------------+------------------------
315.000 | -1.000 | 135.000 | PNG image, 17 x 17 pixels
Variant 2.
Complete example of tiles of a coverage.
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_Aspect(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;