5.3 セル値ベースの条件付き更新(編集)
条件に基づいてラスター・セル値を更新できます。
この項では、セル値ベースのラスター更新について説明し、空間ベースのラスター更新については説明しません(2つのタイプの更新については、「GeoRasterセル・データの問合せおよび更新」を参照してください)。
条件に基づいてラスター・セル値を更新するには、SDO_GEOR_RA.rasterUpdateプロシージャを使用して適切なcondition
およびvals
パラメータを指定します。
condition
パラメータではブール式の配列を指定し、vals
パラメータでは計算式の各配列の配列を指定します。(「ラスター代数言語」のラスター代数操作の説明を参照してください。)各セルで、condition
がTRUE
の場合、そのセル値はvals
配列の対応する計算式の結果に更新されます。
例5-7 セル値ベースの更新
例5-7では、更新されるGeoRasterオブジェクトが3つのバンドを持つイメージであり、SDO_GEOR_RA.rasterUpdateプロシージャのコールによって次のことを実行すると仮定します。
-
ピクセルについてabs(first_band_value - second_band_value)=48および(third_band_value - second_band_value=-101)である場合、3つのバンド値はそれぞれ(123,54,89)に更新されます。
-
ピクセルについて(2*first_band_value - second_band_value/3)=108である場合、3つのバンド値はそれぞれ(98,56,123)に更新されます。
例5-7には、前と後の値を示すためにSDO_GEOR.getCellValueファンクションに対する複数のコールも含まれます。
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. SELECT sdo_geor.getcellvalue(georaster,0,130,130,'') FROM georaster_table WHERE georid =1; SDO_GEOR.GETCELLVALUE(GEORASTER,0,130,130,'') -------------------------------------------------------------------------------- SDO_NUMBER_ARRAY(64, 60, 48) 1 row selected. SELECT sdo_geor.getcellvalue(georaster,0,230,230,'') FROM georaster_table WHERE georid =1; SDO_GEOR.GETCELLVALUE(GEORASTER,0,230,230,'') -------------------------------------------------------------------------------- SDO_NUMBER_ARRAY(11,11, 11) 1 row selected. DECLARE geor SDO_GEORASTER; geor1 SDO_GEORASTER; BEGIN SELECT georaster into geor FROM georaster_table WHERE georid = 1; sdo_geor_ra.rasterUpdate(geor,0,SDO_STRING2_ARRAY('(abs({0}-{1})=48)&({2}-{1}=-101)','2*{0}-{1}/3=108'),SDO_STRING2_ARRAYSET(SDO_STRING2_ARRAY('123','54','89'),SDO_STRING2_ARRAY('98','56','123'))); END; / PL/SQL procedure successfully completed. show errors; No errors. -- This pixel gets updated because it meets the first condition. SELECT sdo_geor.getcellvalue(georaster,0,30,30,'') FROM georaster_table WHERE georid =1; SDO_GEOR.GETCELLVALUE(GEORASTER,0,30,30,'') -------------------------------------------------------------------------------- SDO_NUMBER_ARRAY(123, 54, 89) 1 row selected. --This pixel gets updated because it meets the second condition. SELECT sdo_geor.getcellvalue(georaster,0,130,130,'') FROM georaster_table WHERE georid=1; SDO_GEOR.GETCELLVALUE(GEORASTER,0,130,130,'') -------------------------------------------------------------------------------- SDO_NUMBER_ARRAY(98, 56, 123) 1 row selected. -- This pixel keeps its original values because it does not meet any condition -- in the "condition" array. SELECT sdo_geor.getcellvalue(georaster,0,230,230,'') FROM georaster_table WHERE georid =1; SDO_GEOR.GETCELLVALUE(GEORASTER,0,230,230,'') -------------------------------------------------------------------------------- SDO_NUMBER_ARRAY(11,11, 11) 1 row selected.
例5-8 nodataパラメータを使用したセル値ベースの更新
例5-8は、基本的に例5-7と同じですが、すべてのNODATAピクセルで入力GeoRasterオブジェクトからの元の値を出力GeoRasterオブジェクトで維持するように、nodata
パラメータ値が'TRUE'
に設定されています。
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. SELECT sdo_geor.getcellvalue(georaster,0,130,130,'') FROM georaster_table WHERE georid =1; SDO_GEOR.GETCELLVALUE(GEORASTER,0,130,130,'') -------------------------------------------------------------------------------- SDO_NUMBER_ARRAY(64, 60, 48) 1 row selected. SELECT sdo_geor.getcellvalue(georaster,0,230,230,'') FROM georaster_table WHERE georid =1; SDO_GEOR.GETCELLVALUE(GEORASTER,0,230,230,'') -------------------------------------------------------------------------------- SDO_NUMBER_ARRAY(11,11, 11) 1 row selected. DECLARE geor SDO_GEORASTER; geor1 SDO_GEORASTER; BEGIN SELECT georaster into geor FROM georaster_table WHERE georid = 1; sdo_geor.addNODATA(geor, 1,88); sdo_geor_ra.rasterUpdate(geor,0,SDO_STRING2_ARRAY('(abs({0}-{1})=48)&({2}-{1}=-101)','2*{0}-{1}/3=108'),SDO_STRING2_ARRAYSET(SDO_STRING2_ARRAY('123','54','89'),SDO_STRING2_ARRAY('98','56','123')),null,'true'); END; / PL/SQL procedure successfully completed. -- This pixel keeps its original values because it is a NODATA pixel. 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 gets updated because it meets the second condition. SELECT sdo_geor.getcellvalue(georaster,0,130,130,'') FROM georaster_table WHERE georid=1; SDO_GEOR.GETCELLVALUE(GEORASTER,0,130,130,'') -------------------------------------------------------------------------------- SDO_NUMBER_ARRAY(98, 56, 123) 1 row selected.
親トピック: ラスター代数および分析