5.7 論理演算
ラスター代数の主な用途は、ソースの異なるラスター・レイヤーに論理モデルを適用することです。つまり、新しいGeoRasterオブジェクトを生成するために1つ以上のGeoRasterオブジェクトから1つ以上のレイヤーの論理演算を適用できます。
論理演算を適用するには、演算式とともにラスター代数プロシージャを使用できます。これは、より柔軟性があり強力で、一部の複雑なラスター論理演算に主に使用されます。または、直接的で複雑な論理式の作成を必要としないラスター代数プロシージャのみを使用できます。ただし、ラスター代数プロシージャのみを使用する(つまり、論理式を使用しない)と制限があるため、一部の特定のラスター論理操作に主に使用されます。
5.7.1 論理式を使用したラスター代数プロシージャの使用
GeoRaster論理式は、条件式、ブール式または両方を使用できます。単項および二項ブール演算子(!、&、|、^)および比較演算子(=、<、>、<=、>=、!=)の組合せを使用できます。
ラスター・データの論理式を適用するには、SDO_GEOR_RAパッケージで定義されているラスター代数プロシージャを使用し、作成された論理式とともに適切なパラメータを指定する必要があります。
例5-16 複数の条件演算子を含むSDO_GEOR_RA.rasterMathOpの使用
この例では、次の疑似コードに示されている論理を実装して、3バンドのラスター・データのセグメント化を実装します。
if ( (layer1 < 100)
& (layer2< 1000)
& (layer3< 500))
then output = 10
elsif ( (layer1 < 200)
& (layer2< 2000)
& (layer3< 1000))
then output = 20
elsif ( (layer1 < 300)
& (layer2< 3000)
& (layer3< 1500))
then output = 30
elsif ( (layer1 < 400)
& (layer2< 4000)
& (layer3< 2000))
then output = 40
elsif ( (layer1 < 500)
& (layer2< 5000)
& (layer3< 2500))
then output = 50
else
output = 0
例では、次のようにSDO_GEOR_RA.rasterMathOpプロシージャをコールします
DECLARE
geor SDO_GEORASTER;
geor1 SDO_GEORASTER;
mycursor sys_refcursor;
expr varchar2(1024);
BEGIN
select georaster into geor from georaster_table where georid = 100;
select georaster into geor1 from georaster_table where georid = 101 for update;
--construct logical expression
expr :='condition((({0}<100)&({1}<1000)&({2}<500)),'||
'10,'||
'condition((({0}<200)&({1}<2000)&({2}<1000)),'||
'20,'||
'condition((({0}<300)&({1}<3000)&({2}<1500)),'||
'30,'||
'condition((({0}<400)&({1}<4000)&({2}<2000)),'||
'40,'||
'condition((({0}<500)&({1}<5000)&({2}<2500)),'||
'50,'||
'0)'||
')'||
')'||
')'||
')';
sdo_geor_ra.rasterMathOp(geor, sdo_string2_array(expr),null, geor1, 'true', 0, 'parallel=4');
update georaster_table set georaster = geor1 where georid = 101;
commit;
END;
/
例5-17 1つの条件演算子を含むSDO_GEOR_RA.rasterMathOpの使用
この例では、統計ファンクションおよび算術操作を使用して、次の疑似コードで示されている単純な論理を実装します。
if (sum()>min()*3)
then
output = sqrt(layer0+layer2)
else
output = layer1*1.5
例では、次のようにSDO_GEOR_RA.rasterMathOpプロシージャをコールします
DECLARE
geor SDO_GEORASTER;
geor1 SDO_GEORASTER;
mycursor sys_refcursor;
expr varchar2(1024);
BEGIN
select georaster into geor from georaster_table where georid = 100;
select georaster into geor1 from georaster_table where georid = 101 for update;
--construct logical expression
expr :='condition(sum()>min()*3,sqrt({0}+{2}),{1}*1.5)';
sdo_geor_ra.rasterMathOp(geor, sdo_string2_array(expr),null, geor1, 'true', 0, 'parallel=4');
update georaster_table set georaster = geor1 where georid = 101;
commit;
END;
/
親トピック: 論理演算
5.7.2 ラスター代数ファンクションのみの使用
ラスター代数ファンクションのみを使用して論理演算を実行するには、次のオプションがあります
-
SDO_GEOR_RA.diffプロシージャを使用します。
たとえば、ラスターAのセル値がラスターBのセル値と異なる場合、ラスターAのセル値が戻されます。セル値が同じ場合、値0(ゼロ)が戻されます。
-
SDO_GEOR_RA.overプロシージャを使用します。
たとえば、ラスターAのセル値が0(ゼロ)と等しくない場合、ラスターAのセル値が戻されます。ラスターAのセル値が0(ゼロ)と等しい場合、ラスターBのセル値が戻されます。
例5-18 SDO_GEOR_RA.diffの使用
この例では、SDO_GEOR_RA.diffプロシージャをコールして、2つの3レイヤーのソースGeoRasterオブジェクトから新しいGeoRasterオブジェクトを生成します。
DECLARE
geor SDO_GEORASTER;
geor1 SDO_GEORASTER;
geor2 SDO_GEORASTER;
geom sdo_geometry;
BEGIN
select georaster into geor from georaster_table where georid = 100;
select georaster into geor1 from georaster_table where georid = 101;
select georaster into geor2 from georaster_table where georid = 102 for update;
geom:=null;
sdo_geor_ra.diff(geor,geor1,geom,null,geor2);
update georaster_table set georaster = geor2 where georid = 102;
END;
/
PL/SQL procedure successfully completed.
SELECT sdo_geor.getcellvalue(georaster,0,100,100,'') FROM georaster_table WHERE georid=100;
SDO_GEOR.GETCELLVALUE(GEORASTER,0,100,100,'')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(181, 163, 159)
1 row selected.
SELECT sdo_geor.getcellvalue(georaster,0,100,100,'') FROM georaster_table WHERE georid=101;
SDO_GEOR.GETCELLVALUE(GEORASTER,0,100,100,'')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(181, 122, 159)
1 row selected.
-- In the results of the next SELECT statement, note:
-- 181 =181 ==> 0
-- 163!=122 ==> 163
-- 159 =159 ==> 0
SELECT sdo_geor.getcellvalue(georaster,0,100,100,'') FROM georaster_table WHERE georid =102;
SDO_GEOR.GETCELLVALUE(GEORASTER,0,100,100,'')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(0, 163, 0)
1 row selected.
例5-19 SDO_GEOR_RA.overの使用
この例では、SDO_GEOR_RA.overプロシージャをコールして、2つの3レイヤーのソースGeoRasterオブジェクトから新しいGeoRasterオブジェクトを生成します。
DECLARE
geor SDO_GEORASTER;
geor1 SDO_GEORASTER;
geor2 SDO_GEORASTER;
geom sdo_geometry;
BEGIN
select georaster into geor from georaster_table where georid = 102;
select georaster into geor1 from georaster_table where georid = 101;
select georaster into geor2 from georaster_table where georid = 100 for update;
geom:=null;
sdo_geor_ra.over(geor,geor1,geom,null,geor2);
update georaster_table set georaster = geor2 where georid = 100;
END;
/
PL/SQL procedure successfully completed.
SELECT sdo_geor.getcellvalue(georaster,0,100,100,'') FROM georaster_table WHERE georid=102;
SDO_GEOR.GETCELLVALUE(GEORASTER,0,100,100,'')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(0, 163, 0)
1 row selected.
SELECT sdo_geor.getcellvalue(georaster,0,100,100,'') FROM georaster_table WHERE georid=101;
SDO_GEOR.GETCELLVALUE(GEORASTER,0,100,100,'')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(181, 122, 159)
1 row selected.
-- In the results of the next SELECT statement, note:
-- 0 =0 ==> 181 result from georid=101
-- 163!=0 ==> 163 result from georid=102
-- 0 =0 ==> 159 result from georid=101
SELECT sdo_geor.getcellvalue(georaster,0,100,100,'') FROM georaster_table WHERE georid =100;
SDO_GEOR.GETCELLVALUE(GEORASTER,0,100,100,'')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(181, 163, 159)
1 row selected.
親トピック: 論理演算