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.