5.2 セル値ベースの条件付き問合せ

セル値ベースの条件付き問合せを使用すると、指定された条件に基づいて新しいGeoRasterオブジェクトを生成できます。

ラスターに対する空間ベースの問合せでの使用に加え(SDO_GEOR.getRasterSubsetの使用など)、分析およびアプリケーション・モデリングではセル値ベースの問合せが特に便利です。セル値ベースの条件付き問合せを実行し、指定した条件に基づいて新しいGeoRasterオブジェクトを生成するには、SDO_GEOR_RA.findCellsプロシージャを使用して適切なconditionパラメータを指定します。

conditionパラメータでは、有効なbooleanExpr値(「ラスター代数言語」を参照)を指定する必要があります。プロシージャは、ソースGeoRasterオブジェクトの各セルに対してbooleanExprを計算します。結果がTRUEの場合、元のセル値が出力GeoRasterオブジェクトに維持され、結果がFALSEの場合、bgValuesを使用して出力GeoRasterオブジェクトのセル値が入力されます。これは、マスキング操作と考えることもできます。

例5-4 条件付き問合せ

例5-4では、SDO_GEOR_RA.findCellsプロシージャをコールして、2番目のバンドの値が200より大きいすべてのピクセルを検出します。bgValuesパラメータが指定されていないため、値0が背景値として使用され、条件がfalseになるすべてのピクセルが入力されます。この例では、ソースGeoRasterオブジェクトが3つ以上のバンドを持つイメージであると仮定します。

DECLARE
  geor   SDO_GEORASTER;
  geor1  SDO_GEORASTER;
BEGIN
  SELECT georaster INTO geor FROM georaster_table WHERE georid = 1;
  INSERT into georaster_table values (5, sdo_geor.init('rdt_1', 5)) returning georaster into geor1;
  sdo_geor_ra.findcells(geor, '{ 1 }>200', 'blocking=optimalpadding, blocksize=(512,512,3)', geor1);
  UPDATE georaster_table set georaster = geor1 WHERE georid = 5;
  COMMIT;
END;
/
 
-- This pixel is set to (0,0,0) because the cell value of the
-- second band is 136, which is not greater than 200.
SELECT sdo_geor.getcellvalue(georaster,0,30,30,'') FROM georaster_table WHERE georid =1 OR georid=5 ORDER BY georid;
SDO_GEOR.GETCELLVALUE(GEORASTER,0,30,30,'')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(88, 136, 35)
SDO_NUMBER_ARRAY(0, 0, 0)
 
2 rows selected.
 
-- This pixel keeps the original values because the cell value
-- of the second band is greater than 200.
SELECT sdo_geor.getcellvalue(georaster,0,132,116,'') FROM georaster_table WHERE georid =1 OR georid=5 ORDER BY georid;
 
SDO_GEOR.GETCELLVALUE(GEORASTER,0,132,116,'')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(242, 225, 233)
SDO_NUMBER_ARRAY(242, 225, 233)
 
2 rows selected.
 
-- This pixel keeps the original values because the cell value
-- of the second band is greater than 200.
SELECT sdo_geor.getcellvalue(georaster,0,261,185,'') FROM georaster_table WHERE georid =1 OR georid=5 ORDER BY georid;
 
SDO_GEOR.GETCELLVALUE(GEORASTER,0,261,185,'')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(255, 214, 2)
SDO_NUMBER_ARRAY(255, 214, 2)

例5-5 nodataパラメータを使用した条件付き問合せ

例5-5は、基本的に例5-4と同じですが、すべてのNODATAピクセルで入力GeoRasterオブジェクトからの元の値を出力GeoRasterオブジェクトで維持するように、nodataパラメータ値が'TRUE'に設定されています。

DECLARE
  geor   SDO_GEORASTER;
  geor1  SDO_GEORASTER;
BEGIN
  SELECT georaster INTO geor FROM georaster_table WHERE georid = 1;
  INSERT into georaster_table values (5, sdo_geor.init('rdt_1', 5)) returning georaster into geor1;
  sdo_geor_ra.findcells(geor, '{ 1 }>200', null, geor1, null, 'TRUE');
  UPDATE georaster_table set georaster = geor1 WHERE georid = 5;
  COMMIT;
END;
/
 
SELECT sdo_geor.getcellvalue(georaster,0,30,30,'') FROM georaster_table WHERE georid =1;
SDO_GEOR.GETCELLVALUE(GEORASTER,0,30,30,'')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(88, 136, 35)
 
1 row selected.
 
-- This pixel keeps its original cell values because it is nodata, even though
-- the cell value of the second band is not greater than 200.
SELECT sdo_geor.getcellvalue(georaster,0,30,30,'') FROM georaster_table WHERE georid=5;
 
SDO_GEOR.GETCELLVALUE(GEORASTER,0,30,30,'')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(88, 136, 35)
 
1 row selected.
 

例5-6 parallelParamを使用した条件付き問合せ

例5-6では、次の条件をすべて満たすすべてのピクセルを検出します。

  • 1番目のバンドのセル値が(100,200)の間にあります。

  • 2番目のバンドのセル値が[50,250]の間にあります。

  • 3番目のバンドのセル値が100を超えます。

また、parallelParam'parallel=4'と指定されているため、例5-6のプロシージャは4つのプロセスを使用してパラレルに実行されます。

DECLARE 
  geor   SDO_GEORASTER;
  geor1  SDO_GEORASTER;
BEGIN
   SELECT georaster INTO geor FROM georaster_table WHERE georid = 2;
   INSERT into georaster_table values (10, sdo_geor.init('rdt_1', 10)) returning georaster into geor1;
   sdo_geor_ra.findcells(geor,'({1}>=50)&({1}<=250)&({0}>100)&({0}<200)&{2}>100) ',null,geor1,null,'false','parallel=4');
   UPDATE georaster_table SET georaster = geor1 WHERE georid = 10;
   COMMIT;
END;
/