ST_MapAlgebra — 数式版 - ひとつ以上の入力ラスタ、バンド番号、ひとつ以上のユーザ定義SQL式からひとつのバンドを持つラスタを返します。
raster ST_MapAlgebra(raster rast, integer nband, text pixeltype, text expression, double precision nodataval=NULL);
raster ST_MapAlgebra(raster rast, text pixeltype, text expression, double precision nodataval=NULL);
raster ST_MapAlgebra(raster rast1, integer nband1, raster rast2, integer nband2, text expression, text pixeltype=NULL, text extenttype=INTERSECTION, text nodata1expr=NULL, text nodata2expr=NULL, double precision nodatanodataval=NULL);
raster ST_MapAlgebra(raster rast1, raster rast2, text expression, text pixeltype=NULL, text extenttype=INTERSECTION, text nodata1expr=NULL, text nodata2expr=NULL, double precision nodatanodataval=NULL);
expressionで定義された妥当なPostgreSQL代数演算を入力ラスタ(rast)に適用して、バンドひとつのラスタを生成します。nbandが指定されない場合には、1番バンドと仮定します。新しいラスタは、元のラスタと同じ地理参照、幅、高さになりますが、バンドはひとつだけとなります。
pixeltypeが渡された場合には、新しいラスタのバンドは、そのピクセルタイプになります。pixeltypeにNULLが渡された場合には、新しいラスタは入力rastのバンドのピクセルタイプと同じになります。
expressionのキーワードは次の通りです。
[rast] - 演算対象ピクセルの値
[rast.val] - 演算対象ピクセルの値
[rast.x] - 演算対象ピクセルの列(1始まり)
[rast.y] - 演算対象ピクセルの行(1始まり)
expressionで定義された妥当なふたつのバンドへのPostgreSQL代数演算を入力ラスタ(rast1, rast2)に適用して、バンドひとつのラスタを生成します。nband1, nband2が指定されない場合には、1番バンドと仮定します。新しいラスタは、ひとつめのラスタと同じアラインメント(スケール、スキュー、ピクセル隅)を持ちます。新しいラスタは、extenttype引数で定義される範囲になります。
ふたつのラスタとPostgreSQL定義済み関数/演算子を含むPostgreSQL代数式です。関数と演算子は、ふたつのピクセルがインタセクトするピクセルの値を定めます。たとえば(([rast1] + [rast2])/2.0)::integerといったふうになります。
出力ラスタのピクセルタイプです。必ずST_BandPixelTypeに挙げられたもののひとつになるか、省略されるか、NULLに設定されます。引数として渡されないかNULLが渡された場合には、ひとつめのラスタのピクセルタイプになります。
新しいラスタの範囲を制御します。
INTERSECTION - 新しいラスタの範囲はふたつのラスタのインタセクトした領域です。これがデフォルトです。
UNION - 新しいラスタの範囲はふたつのラスタの結合です。
SECOND - 新しいラスタの範囲はひとつめのラスタと同じです。
SECOND - 新しいラスタの範囲はふたつめのラスタと同じです。
rast1がNODATA値で、特にrast2ピクセルに値がある時に、rast2だけを返すか返すべき値を定義する定数を含む第数式です。
rast2がNODATA値で、特にrast2ピクセルに値がある時に、rastだけを返すか返すべき値を定義する定数を含む第数式です。
rast1とrast2のピクセルの両方がNOADTA値になる場合に返すべき定数です。
expression, nodata1expr and nodata2exprのキーワードは次の通りです。
[rast1] - rast1の演算対象ピクセルの値
[rast1.val] - rast1の演算対象ピクセルの値
[rast1.x] - rast1の演算対象ピクセルの列(1始まり)
[rast1.y] - rast1の演算対象ピクセルの行(1始まり)
[rast2] - rast2の演算対象ピクセルの値
[rast2.val] - rast2の演算対象ピクセルの値
[rast2.x] - rast2の演算対象ピクセルの列(1始まり)
[rast2.y] - rast2の演算対象ピクセルの行(1始まり)
WITH foo AS (
SELECT ST_AddBand(ST_MakeEmptyRaster(10, 10, 0, 0, 1, 1, 0, 0, 0), '32BF', 1, -1) AS rast
)
SELECT
ST_MapAlgebra(rast, 1, NULL, 'ceil([rast]*[rast.x]/[rast.y]+[rast.val])')
FROM foo
WITH foo AS (
SELECT 1 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 0, 1, -1, 0, 0, 0), 1, '16BUI', 1, 0), 2, '8BUI', 10, 0), 3, '32BUI', 100, 0) AS rast UNION ALL
SELECT 2 AS rid, ST_AddBand(ST_AddBand(ST_AddBand(ST_MakeEmptyRaster(2, 2, 0, 1, 1, -1, 0, 0, 0), 1, '16BUI', 2, 0), 2, '8BUI', 20, 0), 3, '32BUI', 300, 0) AS rast
)
SELECT
ST_MapAlgebra(
t1.rast, 2,
t2.rast, 1,
'([rast2] + [rast1.val]) / 2'
) AS rast
FROM foo t1
CROSS JOIN foo t2
WHERE t1.rid = 1
AND t2.rid = 2