5.5 分類操作

分類(セグメント化)操作をソースGeoRasterオブジェクトに適用して、新しいオブジェクトを生成できます。

ソースGeoRasterオブジェクトに単純な分類操作を適用し、指定に基づいて新しいGeoRasterオブジェクトを生成するには、SDO_GEOR_RA.classifyプロシージャを使用してexpressionrangeArrayおよびvalueArrayパラメータを指定します。この分類手順は、セグメント化と呼ぶこともできます。

expressionパラメータは、rangeArrayパラメータに定義された値の範囲にマップするための値を計算するために使用します。rangeArrayパラメータでは、セル値を分類するための範囲を定義する数値配列を指定しますが、この配列には1つ以上の要素を含める必要があります。valueArrayパラメータは、各範囲のターゲット・セル値を定義する数値配列で、その大きさはrangeArrayに1を加えた大きさである必要があります。

例5-12 分類

例5-12では、SDO_GEOR_RA.classifyプロシージャをコールして入力GeoRasterオブジェクトの1番目のバンドの値にセグメント化操作を適用します。この例では、GeoRasterオブジェクトがイメージであると仮定します。

DECLARE
  geor       SDO_GEORASTER;
  geor1      SDO_GEORASTER;
  rangeArray SDO_NUMBER_ARRAY;
  valueArray SDO_NUMBER_ARRAY;
BEGIN
  rangeArray:=sdo_number_array(70,80,90,100,110,120,130,140,150,160,170,180);
  valueArray:=sdo_number_array(70,80,90,100,110,120,130,140,150,160,170,180,190);
  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.classify(geor,'{0}',rangeArray,valueArray,null,geor1);
  UPDATE georaster_table SET georaster = geor1 WHERE georid = 5;
  COMMIT;
END;
/
 
PL/SQL procedure successfully completed.
 
-- In the next statement, the target value is 90 because the value of the
-- first band of source GeoRaster object is 88, which is between 80 and 90.
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(90)
 
2 rows selected.
 
-- In the next statement, the target value is 190 because the value of the
-- first band of source GeoRaster object is 242, which is greater than 180.
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(190)
 
2 rows selected.

例5-13 nodataおよびnodataValueパラメータを使用した分類

例5-13では、SDO_GEOR_RA.classifyプロシージャをコールして、ソースGeoRasterオブジェクトの1番目のレイヤーの値にセグメント化操作を適用し、すべてのNODATAピクセルのNODATA値がターゲットGeoRasterオブジェクトで5に設定されるように、nodataパラメータを'TRUE'に、nodataValueパラメータを5に設定します。

DECLARE
  geor       SDO_GEORASTER;
  geor1      SDO_GEORASTER;
  rangeArray SDO_NUMEBR_ARRAY;
  valueArray SDO_NUMEBR_ARRAY;
BEGIN
  rangeArray:=sdo_number_array(70,80,90,100,110,120,130,140,150,160,170,180);
  valueArray:=sdo_number_array(70,80,90,100,110,120,130,140,150,160,170,180,190);
  SELECT georaster INTO geor FROM georaster_table WHERE georid = 1;
  sdo_geor.addNODATA(geor, 2,136);
  INSERT into georaster_table values (5, sdo_geor.init('rdt_1', 5)) returning georaster into geor1;
  sdo_geor_ra.classify(geor,'{0}',rangeArray,valueArray,null,geor1,'true',5);
  UPDATE georaster_table SET georaster = geor1 WHERE georid = 5;
END;
/
 
PL/SQL procedure successfully completed.
 
-- In the next statement, the target value of the cell is 5 because the value
-- of the second layer of the input GeoRaster object is 136, which is nodata.
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(5)
 
2 rows selected.