5.4 数学的操作
ラスター代数の主な用途は、ソースの異なるラスター・レイヤーに数学的モデルを適用することです。
1つ以上のGeoRasterオブジェクトの1つ以上のレイヤーに数学的操作を適用して新しいGeoRasterオブジェクトを生成するには、SDO_GEOR_RA.rasterMathOpプロシージャを使用します。
このプロシージャのほとんどの形式では、operation
パラメータで、出力GeoRasterオブジェクトのラスター・セル値を計算するために使用するarithmeticExpr
文字列の配列を指定します。配列の各要素は、出力GeoRasterオブジェクトのレイヤーに対応します。
例5-8で実行したように、booleanExpr
はarithmeticExpr
としても使用できることに注意してください。
例5-9 数学的操作(1)
例5-9では、SDO_GEOR_RA.rasterMathOpプロシージャをコールして3レイヤーのソースGeoRasterオブジェクトから6レイヤーの新しいGeoRasterオブジェクトを生成し、次のルールに従ってターゲットGeoRasterオブジェクトのセル値を計算します。
-
ターゲットGeoRasterオブジェクトの最初の3つのレイヤーのセル値は、ソースGeoRasterオブジェクトの対応するレイヤーの値から10を引いた値に等しくなります。
-
ターゲットGeoRasterオブジェクトの最後の3つのレイヤーのセル値は、それぞれソースGeoRasterオブジェクトの最初の3つのレイヤーの値に等しくなります。
DECLARE geor SDO_GEORASTER; geor1 SDO_GEORASTER; geor2 SDO_GEORASTER; BEGIN SELECT georaster INTO geor FROM georaster_table WHERE georid = 1; INSERT into georaster_table values (16, sdo_geor.init('rdt_1', 16)) returning georaster into geor1; sdo_geor_ra.rasterMathOp(geor,SDO_STRING2_ARRAY('{0,0}-10','{0,1}-10','{0,2}-10','{0,0}','{0,1}','{0,2}'),null,geor1); UPDATE georaster_table SET georaster = geor1 WHERE georid = 16; COMMIT; END; / PL/SQL procedure successfully completed. SELECT sdo_geor.getcellvalue(georaster,0,100,100,'') FROM georaster_table WHERE georid=1; SDO_GEOR.GETCELLVALUE(GEORASTER,0,100,100,'') -------------------------------------------------------------------------------- SDO_NUMBER_ARRAY(181, 163, 159) 1 row selected. -- In the results of the next SELECT statement, note: -- 171=181-10 -- 153=163-10 -- 149=159-10 -- 181=181 -- 163=163 -- 159=159 SELECT sdo_geor.getcellvalue(georaster,0,100,100,'') FROM georaster_table WHERE georid =16; SDO_GEOR.GETCELLVALUE(GEORASTER,0,100,100,'') -------------------------------------------------------------------------------- SDO_NUMBER_ARRAY(171, 153, 149, 181, 163, 159) 1 row selected.
例5-10 数学的操作(2)
例5-10では、2要素のGeoRaster配列(2つの3レイヤーのソースGeoRasterオブジェクトを含む)に対して操作を適用し、3レイヤーの新しいGeoRasterオブジェクトを生成します。
DECLARE geor SDO_GEORASTER; geor1 SDO_GEORASTER; geor2 SDO_GEORASTER; geo_array SDO_GEORASTER_ARRAY; BEGIN SELECT georaster INTO geor FROM georaster_table WHERE georid = 1; SELECT georaster INTO geor2 FROM georaster_table WHERE georid = 2; INSERT into georaster_table values (17, sdo_geor.init('rdt_1', 17)) returning georaster into geor1; geo_array:=SDO_GEORASTER_ARRAY(geor,geor2); sdo_geor_ra.rasterMathOp(geo_array,SDO_STRING2_ARRAY('{0,0}-0.5*{1,0}','{0,1}-0.5*{1,1}','{0,2}-0.5*{1,2}'),null,geor1,'false',null,'parallel=4'); UPDATE georaster_table SET georaster = geor1 WHERE georid = 17; COMMIT; END; / PL/SQL procedure successfully completed. SELECT sdo_geor.getcellvalue(georaster,0,100,100,'') FROM georaster_table WHERE georid=1 or georid=2; SDO_GEOR.GETCELLVALUE(GEORASTER,0,100,100,'') -------------------------------------------------------------------------------- SDO_NUMBER_ARRAY(181, 163, 159) SDO_NUMBER_ARRAY(60, 80, 90) 2 rows selected. -- In the results of the next SELECT statement, note: -- 151=181-0.5*60 -- 123=163-0.5*80 -- 114=159-0.5*90 SELECT sdo_geor.getcellvalue(georaster,0,100,100,'') FROM georaster_table WHERE georid =17; SDO_GEOR.GETCELLVALUE(GEORASTER,0,100,100,'') -------------------------------------------------------------------------------- SDO_NUMBER_ARRAY(151, 123 114) 1 row selected.
例5-11 数学的操作(3)
例5-11では、2つの3レイヤーの入力GeoRasterオブジェクトに対して減算操作を適用し、新しいGeoRasterオブジェクトを生成します。例には、前と後の値を示すためにSDO_GEOR.getCellValueファンクションに対する複数のコールも含まれます。
SELECT sdo_geor.getcellvalue(georaster,0,10,10,'0-2') FROM georaster_table WHERE georid=1 OR georid=5 ORDER BY georid;
SDO_GEOR.GETCELLVALUE(GEORASTER,0,10,10,'0-2')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(88, 137, 32)
SDO_NUMBER_ARRAY(98, 147, 42)
2 rows selected.
SELECT sdo_geor.getcellvalue(georaster,0,100,100,'0-2') FROM georaster_table WHERE georid=1 OR georid=5 ORDER BY georid;
SDO_GEOR.GETCELLVALUE(GEORASTER,0,100,100,'0-2')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(181, 163, 159)
SDO_NUMBER_ARRAY(191, 173, 169)
2 rows selected.
DECLARE
geor0 SDO_GEORASTER;
geor SDO_GEORASTER;
geor1 SDO_GEORASTER;
BEGIN
SELECT georaster INTO geor FROM georaster_table WHERE georid = 1;
SELECT georaster INTO geor0 FROM georaster_table WHERE georid = 5;
INSERT into georaster_table values (6, sdo_geor.init('rdt_1', 6)) returning georaster into geor1;
sdo_geor_ra.rasterMathOp(geor0,geor,null,sdo_geor_ra.OPERATOR_SUBTRACT,null,geor1);
UPDATE georaster_table SET georaster = geor1 WHERE georid = 6;
COMMIT;
END;
/
PL/SQL procedure successfully completed.
SELECT sdo_geor.getcellvalue(georaster,0,10,10,'0-2') FROM georaster_table WHERE georid=6;
SDO_GEOR.GETCELLVALUE(GEORASTER,0,10,10,'0-2')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(10, 10, 10)
1 row selected.
SELECT sdo_geor.getcellvalue(georaster,0,100,100,'0-2') FROM georaster_table WHERE georid=6;
SDO_GEOR.GETCELLVALUE(GEORASTER,0,100,100,'0-2')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(10, 10, 10)
1 row selected.
親トピック: ラスター代数および分析