ST_MapAlgebraExpr — 单波段栅格版本:创建一个新的单波段栅格,该栅格通过对输入栅格波段应用有效的 PostgreSQL 代数运算,并使用提供的像素类型形成。如果未指定波段,则假定为波段 1。
raster ST_MapAlgebraExpr(raster rast, integer band, text pixeltype, text expression, double precision nodataval=NULL);
raster ST_MapAlgebraExpr(raster rast, text pixeltype, text expression, double precision nodataval=NULL);
| ![[Warning]](../images/warning.png)  | |
| 自 2.1.0 版本起,ST_MapAlgebraExpr 已被弃用。请改用 ST_MapAlgebra (表达式版本)。 | 
创建一个新的单波段栅格,该栅格通过对输入栅格 (rast) 应用由 expression 定义的有效 PostgreSQL 代数运算形成。如果未指定 band,则假定为波段 1。新栅格将具有与原始栅格相同的地理参考、宽度和高度,但只包含一个波段。
如果传入 pixeltype,则新栅格将具有该像素类型的波段。如果传入的像素类型为 NULL,则新栅格波段将具有与输入 rast 波段相同的像素类型。
在表达式中,您可以使用术语 [rast] 来引用原始波段的像素值,使用 [rast.x] 来引用基于 1 的像素列索引,使用 [rast.y] 来引用基于 1 的像素行索引。
可用性:2.0.0
从原始栅格创建一个新的单波段栅格,它是原始栅格波段对 2 取模的函数。
ALTER TABLE dummy_rast ADD COLUMN map_rast raster;
UPDATE dummy_rast SET map_rast = ST_MapAlgebraExpr(rast,NULL,'mod([rast]::numeric,2)') 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 的单波段栅格,该栅格已重新分类,并将 nodata 值设置为 0。
ALTER TABLE dummy_rast ADD COLUMN map_rast2 raster;
UPDATE dummy_rast SET
    map_rast2 = ST_MapAlgebraExpr(rast,'2BUI'::text,'CASE WHEN [rast] BETWEEN 100 and 250 THEN 1 WHEN [rast] = 252 THEN 2 WHEN [rast] BETWEEN 253 and 254 THEN 3 ELSE 0 END'::text, '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
                    
        | 
  原始(列 rast_view) 
 | 
  rast_view_ma 
 | 
从原始的 3 波段栅格创建一个新的 3 波段栅格,该栅格具有相同的像素类型,其中第一个波段通过地图代数修改,其余 2 个波段保持不变。
SELECT
    ST_AddBand(
        ST_AddBand(
            ST_AddBand(
                ST_MakeEmptyRaster(rast_view),
                ST_MapAlgebraExpr(rast_view,1,NULL,'tan([rast])*[rast]')
            ),
            ST_Band(rast_view,2)
        ),
        ST_Band(rast_view, 3)
    )  As rast_view_ma
FROM wind
WHERE rid=167;