ST_MapAlgebra 函数通过使用代数计算表达式(Algebra Computing Language)对多个源对象的像素值进行计算,从而生成一个新的raster对象。
语法
raster ST_MapAlgebra(raster[] rasters ,
cstringalgebraExpr default NULL,
cstringstorageoptiondefault '')
参数
参数名称 | 描述 |
rasters | 需要进行代数运算的raster对象数组。 |
algebraExpr | JSON字符串用于表示代数运算表达式。 |
storageOption | JSON字符串表示的返回结果的存储选项。 |
传入的raster对象只要求长和宽一致,并不会对空间参考或分辨率等进行检查。如不一致可以通过ST_Transform、ST_Resize和ST_Clip先进行处理。
algebraExpr为JSON字符串数组,每个子JSON对象指明代数运算表达式, 参数如下。
参数名称 | 描述 | 类型 | 默认值 | 说明 |
algebraExpr | 代数运算表达式。 | string | - | - |
nodata | 是否使用nodata。 | boolean | false |
|
nodataValue | nodata值。 | float8 | 0 | - |
algebraExpr代数运算表达式有以下关键字。
[r, b]
r:raster在数组中的id,0-n-1。
b:对应raster所在的波段号, 0-n-1。
x
该象元所在的列号。
y
该象元所在的行号。
表达式支持以下运算:
分类 | 运算符/函数 | 备注 |
运算符 |
| - |
位运算 |
| - |
逻辑运算 |
| - |
运算函数 |
| 参数个数为1个。 |
统计函数 |
| 参数个数至少为2个。 |
示例1
本示例表示栅格对象为一个波段,结果值为raster[0]band[0] + raster[1]band[0] * raster[1]band[1]。
[ { "expr":"([0,0] + [1,0] * [1,1]) ", "nodata": true, "nodataValue":999 } ]
示例2
本示例表示计算三个波段的方差。
[ { "expr":"(std([0,0],[0,1],[0,2]))", "nodata": true, "nodataValue":999 } ]
示例3
以下示例表生成三个图层,每个图层使用不同的表达式进行计算。
[ { "expr":"(min([0,0],[0,1],[0,2]))", "nodata": true, "nodataValue":999 }, { "expr":"(max([0,0],[0,1],[0,2]))", "nodata": true, "nodataValue":999 }, { "expr":"(mean([0,0],[0,1],[0,2]))", "nodata": true, "nodataValue":999 } ]
storageOption参数如下。
参数名称 | 描述 | 类型 | 默认值 | 说明 |
chunking | 是否使用分块存储。 | boolean | 和原始raster一致 | - |
chunkdim | 分块的维度信息。 | string | 和原始raster一致 | 在chunking=true时才有效。 |
chunktable | 分块表名称。 | string | '' | 如果传入''值,则会产生一个随机表名临时块表用于存放数据。 该临时表只在当前会话中有效。如果需要保持一个可访问的裁剪对象,则需要指定块表名称。 |
compression | 压缩算法类型。 | string | 和原始raster一致 | 目前只支持none、jpeg、zlib、png、lzo和lz4。 |
quality | 压缩质量。 | integer | 和原始raster一致 | 只针对jpeg压缩算法。 |
interleaving | 交错方式。 | string | 和原始raster一致 | 必须是以下一种:
|
endian | 字节序。 | string | 和原始raster一致 | 必须为以下其中之一:
|
示例
-- 永久表
CREATE TABLE rast_mapalgebra_result(id integer, rast raster);
-- 插入表中
WITH foo AS (
SELECT 1 AS rid, rast AS rast from t1 WHERE id = 1
UNION ALL
SELECT 2 AS rid, rast AS rast from t2 WHERE id = 2
)
INSERT INTO rast_mapalgebra_result
SELECT 1, ST_MapAlgebra(
ARRAY(SELECT rast FROM foo ORDER BY rid),
'[{"expr":"([0,0] + 0.5 * [1,0] - ([1,1])","nodata": true, "nodataValue":999}]',
'{"chunktable":"algebra_rbt"}'
);