ST_MapAlgebra (expression version) — 数式版 - 一つか二つの入力ラスタ、バンド番号、一つ以上のユーザ定義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
)に適用して、一つのバンドを持つラスタを生成します。band1
, band2
が指定されない場合には、1番バンドと仮定します。新しいラスタは、一つ目のラスタと同じアラインメント (スケール、スキュー、ピクセル隅)を持ちます。新しいラスタは、extenttype
引数で定義される範囲になります。
二つのラスタとPostgreSQL定義済み関数/演算子を含むPostgreSQL代数式です。関数と演算子は、二つのピクセルがインタセクトするピクセルの値を定めます。たとえば(([rast1] + [rast2])/2.0)::integerといったふうになります。
出力ラスタのピクセルタイプです。必ずST_BandPixelTypeに挙げられたものの一つになるか、省略されるか、NULLに設定されます。引数として渡されないかNULLが渡された場合には、一つ目のラスタのピクセルタイプになります。
新しいラスタの範囲を制御します。
INTERSECTION
- 新しいラスタの範囲は二つのラスタのインタセクトした領域です。これがデフォルトです。
UNION
- 新しいラスタの範囲は二つのラスタの結合です。
FIRST
- 新しいラスタの範囲は一つ目のラスタと同じです。
SECOND
- 新しいラスタの範囲は二つ目のラスタと同じです。
rast1
がNODATA値で、特にrast2ピクセルに値がある時に、rast2
だけを返すか返すべき値を定義する定数を含む代数式です。
rast2
がNODATA値で、特にrast2ピクセルに値がある時に、rast1
だけを返すか返すべき値を定義する定数を含む代数式です。
rast1とrast2のピクセルの両方がNOADTA値になる場合に返すべき定数です。
有効なexpression
, nodata1expr
, 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'::text, 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'::text, 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'::text, 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;