5 ラスター代数および分析

この章では、ラスター代数言語(PL/SQL式と代数式)および関連するラスター操作(条件付き問合せ、セル値ベースの更新または編集、数学的操作、分類、オンザフライ統計分析、論理演算、地図的モデリングでのそれらの適用など)について説明します。

内容は次のとおりです。

5.1 ラスター代数言語

ラスター代数は、ラスター・データ分析とGISモデリングで一般的に使用されます。GeoRasterでは、GeoRasterラスター代数言語によってラスター代数がサポートされます。

GeoRasterラスター代数言語は、Oracle PL/SQL言語の拡張です。PL/SQLでは、変数と定数の宣言、一般的な数式、基本ファンクション、文およびプログラミング機能が提供されます。GeoRasterでは、ラスター代数式言語と、ラスター・レイヤー操作のためのラスター代数ファンクションのセットが提供されます。ラスター代数式言語には、一般算術、キャスト、論理および関係演算子が含まれ、それらの任意の組合せを使用できます。ラスター代数ファンクションでは、式の使用が可能で、1つ以上のGeoRasterオブジェクトの1つ以上のラスター・レイヤーに対するセル値ベースの条件付き問合せ、数学的モデリング、分類操作、およびセル値ベースの更新または編集がサポートされます。

PL/SQL言語とGeoRaster代数式およびファンクションのこの組合せによって、ラスター分析を代数式として定義するための簡単で強力な方法が提供されるため、ユーザーは、ラスター・データに代数ファンクションを簡単に適用して新しい結果を導出できます。たとえば、単純なラスター操作で同じ次元サイズを持つ2つ以上のラスター・レイヤーを使用して、代数操作(加算、減算など)の使用によって新しいラスター・レイヤーを生成することや、高度なラスター操作を使用して衛星イメージの複数のバンドから正規化植生指標(NDVI)を生成することができます。

GeoRasterでは、ラスター代数のローカル操作がサポートされるため、ラスター代数操作は個々のラスター・セルまたはピクセルを対象に動作します。

次に、GeoRasterラスター代数式言語の定義を示します。

<arithmeticExpr> ::=
                <unaryArithmeticExpr>
              | <binaryArithmeticExpr>
              | <functionalArithmeticExpr>
              | <conditionalExpr>
              | <castingExpr>
              | <booleanExpr>
              | <constantNumber>
              | <identifier>
              | ( <arithmeticExpr> )

<unaryArithmeticExpr> ::=
                ( <unaryArithmeticOp> <arithmeticExpr> ) 

<unaryArithmeticOp> ::=                  
                +
              | -

<binaryArithmeticExpr> ::=
                <arithmeticExpr> <binaryArithmeticOp> <arithmeticExpr> 

<binaryArithmeticOp> ::=
                +
              | -
              | *
              | /
              | %

<functionalArithmeticExpr> ::=
                <statisticalFunction> ( )
              | <numericFunction_with_1_param> ( <arithmeticExpr> )
              | <numericFunction_with_2_param> ( <arithmeticExpr> , <arithmeticExpr> )
              | <numericFunction_with_3_param> ( <arithmeticExpr> , <arithmeticExpr> , <arithmeticExpr> )

<statisticalFunction> ::=
                min
              | max
              | mean
              | median
              | std
              | minority
              | majority
              | sum
              | variety

<numericFunction_with_1_param> ::=
                abs
              | sqrt
              | exp
              | exp2
              | exp10
              | log
              | ln
              | log2
              | sin
              | cos
              | tan
              | sinh
              | cosh
              | tanh
              | arcsin
              | arccos
              | arctan
              | arcsinh
              | arccosh
              | arctanh
              | ceil
              | floor
              | factorial

<numericFunction_with_2_param> ::=
                power
              | max2
              | min2

<numericFunction_with_3_param> ::=
                max3
              | min3

<conditionalExpr> ::=
          <conditionalFunction> ( <booleanExpr> , <arithmeticExpr> , <arithmeticExpr> )

<conditionalFunction> ::=
                condition
 
<castingExpr> ::=
                <castingFunction> ( <arithmeticExpr> )

<castingFunction> ::=  
                castint
              | castonebit               
              | casttwobit
              | castfourbit
              | casteightbit
              | castBoolean

<booleanExpr> ::=
                <unaryBooleanExpr>
              | <binaryBooleanExpr>
              | ( <booleanExpr> )

<unaryBooleanExpr> ::=
                <unaryBooleanOp> <booleanExpr>

<unaryBooleanOp> ::=
                !

<binaryBooleanExpr> ::=
                <booleanExpr> <binaryBooleanOp> <booleanExpr>
              | <arithmeticExpr> <comparisonOp> <arithmeticExpr>

<binaryBooleanOp> ::=
                &
              | |
              | ^   

<comparisonOp> ::=
                =
              | <
              | >
              | >=
              | <=
              | !=
                   
<constantNumber> ::=
                <double number>

<identifier> ::=
                { <ID> , <band> }
              | { <band> }

<ID> ::=
                <integer number>

<band> ::=
                <integer number>

式言語の代数演算子(+、-、*、/など)の優先順位は、一般的な表記規則に従います。ただし、式が間違って解釈される可能性がある場合は、カッコを使用して解釈の意図を明確化する必要があります。

booleanExprは、GeoRasterラスター代数式言語に定義されているとおり、arithmeticExprとして使用できます。この場合、booleanExprTRUEFALSEの評価結果は、それぞれ数値の1と0に変換されます。

式のidentifierは、GeoRasterオブジェクトのラスター・レイヤーを示します。これは、1つのband番号か(関連するGeoRasterオブジェクトが1つのみの場合)、または(ID, band)のペアです(IDは式のGeoRasterオブジェクトのいずれかを示し、bandはそのGeoRasterオブジェクトの特定のレイヤーを示します)。この言語のband番号は、セル空間のバンド次元に沿ったレイヤーの座標番号を示すため、常に0(ゼロ)から開始します。GeoRaster ID番号は常に0(ゼロ)から始まります。

次のプロシージャによって、ラスター代数操作の主なサポートが提供されます。

  • SDO_GEOR_RA.rasterMathOpは、数学的操作またはモデリングを実行するarithmeticExpr、論理演算を実行するconditionalExprbooleanExprおよび統計分析を実行するstatisticalFunctionを使用します。

  • SDO_GEOR_RA.findCellsは、booleanExpr条件に基づいてセルを検索またはマスクします。

  • SDO_GEOR_RA.classifyは、arithmeticExprをセルに適用してからラスターをセグメント化します。

  • SDO_GEOR_RA.rasterUpdateは、異なるbooleanExpr条件に基づいてラスターのセル値を更新します。

  • SDO_GEOR_RA.diffおよびSDO_GEOR_RA.overは、式を使用せずに論理演算を実行します。

  • SDO_GEOR_RA.stackおよび他の多数のサブプログラムは、統計分析を実行するか、統計を生成します。

これらのラスター代数ファンクションは、1つ以上のGeoRasterオブジェクトから多くのレイヤーを取得してそれらのレイヤーにbooleanExpr式またはarithmeticExpr式(あるいはその両方)を適用し、特定の代数計算またはモデリングを実行して新しいGeoRasterオブジェクトを出力します。式は、この項で前述した構文に基づいて、いずれかの方法で定義できます。

ノート:

すべてのラスター代数ファンクションでは、ラスター・レイヤーが相互に重複し、同じ次元サイズと解像度を持つか(それらが地理参照される場合)、同じ次元サイズを持つ必要があります(それらが地理参照されない場合)。2つ以上のGeoRasterオブジェクトにラスター代数操作を適用する前に、SDO_GEOR_RA.isOverlapファンクションを使用して、GeoRasterオブジェクトが同じサイズであり、同じ土地を対象範囲としているかどうかを判別できます。

ラスターおよびイメージ・データベースは、通常、非常に大きくなります。そのようなデータベースを問い合せて処理することは、計算集中型の操作です。パフォーマンスを向上するため、すべてのGeoRasterラスター代数ファンクションはパラレル化されます。マルチCPUまたはマルチコア・サーバーを使用する場合、パラレル処理を適用することを常に検討してください。

5.1.1 ラスター代数式の例

この項には、ラスター代数式を定義する方法を示した例が含まれます。

例5-1 比較(>)に基づくピクセルの検出

例5-1では、代数式の'{1}>200'で定義された条件に一致するすべてのピクセルを検出します(プロシージャに含まれるGeoRasterオブジェクトは1つのみであるため、{1}は2番目のレイヤーのセル値を示し({0}は1番目のレイヤーに対応します)、'{1}>200'は2番目のレイヤー値が200より大きいピクセルを意味します。この例では、ソースGeoRasterオブジェクトに2つ以上のレイヤーが存在すると仮定します。

DECLARE 
  geor       MDSYS.SDO_GEORASTER;
  geor1      MDSYS.SDO_GEORASTER;
BEGIN
  select georaster into geor from georaster_table where georid = 1;
  select georaster into geor1 from georaster_table where georid = 5 for update;
  sdo_geor_ra.findcells(geor, '{1}>200','blocking=optimalpadding, blocking=true, blocksize=(512,512,3)',geor1);
  update georaster_table set georaster = geor1 where georid = 5;
  commit;
END;
/

例5-2 式配列に基づくGeoRasterオブジェクトの生成

例5-2では、代数式配列のSDO_STRING2_ARRAY('{0,0}-0.5*{1,0}','{0,1}-0.5*{1,1}','{0,2}-0.5*{1,2}')に基づいて、2つの入力GeoRasterオブジェクトのgeorおよびgeor1から新しいGeoRasterオブジェクトのgeor2を生成します。この例では、2つのソースGeoRasterオブジェクトが3つのバンドを持つイメージであると仮定します。

DECLARE
  geor       MDSYS.SDO_GEORASTER;
  geor1      MDSYS.SDO_GEORASTER;
  geor2      MDSYS.SDO_GEORASTER;
  geo_array  MDSYS.SDO_GEORASTER_ARRAY;
BEGIN
  select georaster into geor from georaster_table where georid = 1;
  select georaster into geor1 from georaster_table where georid = 2;
  insert into georaster_table values (17, sdo_geor.init('rdt_1', 17)) returning georaster into geor2;
  geo_array:=MDSYS.SDO_GEORASTER_ARRAY(geor,geor1);
  sdo_geor_ra.rasterMathOp(geo_array,SDO_STRING2_ARRAY('{0,0}-0.5*{1,0}','{0,1}-0.5*{1,1}','{0,2}-0.5*{1,2}'),null,geor2);
  update georaster_table set georaster = geor2 where georid = 17;
  commit;
END;
/

例5-2の代数式配列の内容は次のとおりです。

  • {0,0}は、第1入力GeoRasterオブジェクトgeorのバンド0のセル値を示します。

  • {0,1}は、第1入力GeoRasterオブジェクトgeorのバンド1のセル値を示します。

  • {0,2}は、第1入力GeoRasterオブジェクトgeorのバンド2のセル値を示します。

  • {1,0}は、第2入力GeoRasterオブジェクトgeor1のバンド0のセル値を示します。

  • {1,1}は、第2入力GeoRasterオブジェクトgeor1のバンド1のセル値を示します。

  • {1,2}は、第2入力GeoRasterオブジェクトgeor1のバンド2のセル値を示します。

例5-2で、ターゲットGeoRasterオブジェクトのgeor2は3つのバンドを持ちます。

  • ターゲットGeoRasterオブジェクトgeor2のバンド0のセル値は、{0,0}-0.5*{1,0}です。

  • ターゲットGeoRasterオブジェクトgeor2のバンド1のセル値は、{0,1}-0.5*{1,1}です。

  • ターゲットGeoRasterオブジェクトgeor2のバンド2のセル値は、{0,2}-0.5*{1,2}です。

例5-3 式配列に基づくGeoRasterオブジェクトの更新

例5-3では、代数式配列のSDO_STRING2_ARRAY('(abs({0}-{1})=48)&({2}-{1}=-101)','2*{0}-{1}/3=108')に基づいて、入力GeoRasterオブジェクトのセル値を更新します。この例では、ソースGeoRasterオブジェクトに3つのレイヤーが存在すると仮定します。

DECLARE
  geor       MDSYS.SDO_GEORASTER;
  geor1      MDSYS.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;
/

例5-3では、ピクセルごとに次の処理が実行されます。

  • (abs({0}-{1})=48)&({2}-{1}=-101)がtrueの場合、3つのレイヤーのセル値は('123','54','89')に更新されます。

  • 2*{0}-{1}/3=108がtrueの場合、3つのレイヤーのセル値は('98','56','123')に更新されます。

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;
/

5.3 セル値ベースの条件付き更新(編集)

条件に基づいてラスター・セル値を更新できます。

この項では、セル値ベースのラスター更新について説明し、空間ベースのラスター更新については説明しません(2つのタイプの更新については、「GeoRasterセル・データの問合せおよび更新」を参照してください)。

条件に基づいてラスター・セル値を更新するには、SDO_GEOR_RA.rasterUpdateプロシージャを使用して適切なconditionおよびvalsパラメータを指定します。

conditionパラメータではブール式の配列を指定し、valsパラメータでは計算式の各配列の配列を指定します。(「ラスター代数言語」のラスター代数操作の説明を参照してください。)各セルで、conditionTRUEの場合、そのセル値は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.

5.4 数学的操作

ラスター代数の主な用途は、ソースの異なるラスター・レイヤーに数学的モデルを適用することです。

1つ以上のGeoRasterオブジェクトの1つ以上のレイヤーに数学的操作を適用して新しいGeoRasterオブジェクトを生成するには、SDO_GEOR_RA.rasterMathOpプロシージャを使用します。

このプロシージャのほとんどの形式では、operationパラメータで、出力GeoRasterオブジェクトのラスター・セル値を計算するために使用するarithmeticExpr文字列の配列を指定します。配列の各要素は、出力GeoRasterオブジェクトのレイヤーに対応します。

例5-8で実行したように、booleanExprarithmeticExprとしても使用できることに注意してください。

例5-9 数学的操作(1)

例5-9では、SDO_GEOR_RA.rasterMathOpプロシージャをコールして3レイヤーのソースGeoRasterオブジェクトから6レイヤーの新しいGeoRasterオブジェクトを生成し、次のルールに従ってターゲットGeoRasterオブジェクトのセル値を計算します。

  • ターゲットGeoRasterオブジェクトの最初の3つのレイヤーのセル値は、ソースGeoRasterオブジェクトの対応するレイヤーの値から10を引いた値に等しくなります。

  • ターゲットGeoRasterオブジェクトの最後の3つのレイヤーのセル値は、それぞれソースGeoRasterオブジェクトの最初の3つのレイヤーの値に等しくなります。

DECLARE
  geor   SDO_GEORASTER;
  geor1  SDO_GEORASTER;
  geor2  SDO_GEORASTER;
BEGIN
  SELECT georaster INTO geor FROM georaster_table WHERE georid = 1;
  INSERT into georaster_table values (16, sdo_geor.init('rdt_1', 16)) returning georaster into geor1;
  sdo_geor_ra.rasterMathOp(geor,SDO_STRING2_ARRAY('{0,0}-10','{0,1}-10','{0,2}-10','{0,0}','{0,1}','{0,2}'),null,geor1);
  UPDATE georaster_table SET georaster = geor1 WHERE georid = 16;
  COMMIT;
END;
/
 
PL/SQL procedure successfully completed.
 
SELECT sdo_geor.getcellvalue(georaster,0,100,100,'') FROM georaster_table WHERE georid=1;
 
SDO_GEOR.GETCELLVALUE(GEORASTER,0,100,100,'')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(181, 163, 159)
 
1 row selected.
 
--  In the results of the next SELECT statement, note:
--  171=181-10
--  153=163-10
--  149=159-10
--  181=181
--  163=163
--  159=159
SELECT sdo_geor.getcellvalue(georaster,0,100,100,'') FROM georaster_table WHERE georid =16;
SDO_GEOR.GETCELLVALUE(GEORASTER,0,100,100,'')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(171, 153, 149, 181, 163, 159)
 
1 row selected.

例5-10 数学的操作(2)

例5-10では、2要素のGeoRaster配列(2つの3レイヤーのソースGeoRasterオブジェクトを含む)に対して操作を適用し、3レイヤーの新しいGeoRasterオブジェクトを生成します。

DECLARE
  geor       SDO_GEORASTER;
  geor1      SDO_GEORASTER;
  geor2      SDO_GEORASTER;
  geo_array  SDO_GEORASTER_ARRAY;
BEGIN
  SELECT georaster INTO geor FROM georaster_table WHERE georid = 1;
  SELECT georaster INTO geor2 FROM georaster_table WHERE georid = 2;
  INSERT into georaster_table values (17, sdo_geor.init('rdt_1', 17)) returning georaster into geor1;
  geo_array:=SDO_GEORASTER_ARRAY(geor,geor2);
  sdo_geor_ra.rasterMathOp(geo_array,SDO_STRING2_ARRAY('{0,0}-0.5*{1,0}','{0,1}-0.5*{1,1}','{0,2}-0.5*{1,2}'),null,geor1,'false',null,'parallel=4');
  UPDATE georaster_table SET georaster = geor1 WHERE georid = 17;
  COMMIT;
END;
/
 
PL/SQL procedure successfully completed.
 
SELECT sdo_geor.getcellvalue(georaster,0,100,100,'') FROM georaster_table WHERE georid=1 or georid=2;
 
SDO_GEOR.GETCELLVALUE(GEORASTER,0,100,100,'')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(181, 163, 159)
SDO_NUMBER_ARRAY(60, 80, 90)
 
2 rows selected.
 
-- In the results of the next SELECT statement, note:
-- 151=181-0.5*60
-- 123=163-0.5*80
-- 114=159-0.5*90
SELECT sdo_geor.getcellvalue(georaster,0,100,100,'') FROM georaster_table WHERE georid =17;

SDO_GEOR.GETCELLVALUE(GEORASTER,0,100,100,'')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(151, 123 114)
 
1 row selected.

例5-11 数学的操作(3)

例5-11では、2つの3レイヤーの入力GeoRasterオブジェクトに対して減算操作を適用し、新しいGeoRasterオブジェクトを生成します。例には、前と後の値を示すためにSDO_GEOR.getCellValueファンクションに対する複数のコールも含まれます。

SELECT sdo_geor.getcellvalue(georaster,0,10,10,'0-2') FROM georaster_table WHERE georid=1 OR georid=5 ORDER BY georid;
 
SDO_GEOR.GETCELLVALUE(GEORASTER,0,10,10,'0-2')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(88, 137, 32)
SDO_NUMBER_ARRAY(98, 147, 42)
 
2 rows selected.
 
SELECT sdo_geor.getcellvalue(georaster,0,100,100,'0-2') FROM georaster_table WHERE georid=1 OR georid=5 ORDER BY georid;
 
SDO_GEOR.GETCELLVALUE(GEORASTER,0,100,100,'0-2')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(181, 163, 159)
SDO_NUMBER_ARRAY(191, 173, 169)
 
2 rows selected.
 
DECLARE
  geor0  SDO_GEORASTER;
  geor   SDO_GEORASTER;
  geor1  SDO_GEORASTER;
BEGIN
  SELECT georaster INTO geor FROM georaster_table WHERE georid = 1;
  SELECT georaster INTO geor0 FROM georaster_table WHERE georid = 5;
  INSERT into georaster_table values (6, sdo_geor.init('rdt_1', 6)) returning georaster into geor1;
  sdo_geor_ra.rasterMathOp(geor0,geor,null,sdo_geor_ra.OPERATOR_SUBTRACT,null,geor1);
  UPDATE georaster_table SET georaster = geor1 WHERE georid = 6;
  COMMIT;
END;
/
 
PL/SQL procedure successfully completed.
 
SELECT sdo_geor.getcellvalue(georaster,0,10,10,'0-2') FROM georaster_table WHERE georid=6;
 
SDO_GEOR.GETCELLVALUE(GEORASTER,0,10,10,'0-2')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(10, 10, 10)
 
1 row selected.
 
SELECT sdo_geor.getcellvalue(georaster,0,100,100,'0-2') FROM georaster_table WHERE georid=6;
 
SDO_GEOR.GETCELLVALUE(GEORASTER,0,100,100,'0-2')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(10, 10, 10)
 
1 row selected.

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.

5.6 統計操作

1つ以上のGeoRasterオブジェクトの1つ以上のレイヤーの統計操作を適用するには、次のタイプの操作を使用できます。

5.6.1 オンザフライ統計分析

多くのアプリケーションで統計分析が必要です。GeoRasterでは、GeoRasterオブジェクトの完全な統計値または個別の統計値(最小値、最大値、平均値、中央値、最頻値および標準偏差値)を動的に(オンザフライで)計算する統計分析ファンクションが提供されます。これは、ヒストグラムの生成やGeoRasterオブジェクト・メタデータの更新を行うことなく実行できます。

これらのサブプログラムでは、バンドごとに、指定したバンド番号の集計に基づいてピラミッドがサポートされます。各サブプログラムは、SDO_NUMBER_ARRAYオブジェクトまたは数値を戻します。

これらのオンザフライ統計計算サブプログラムの説明および例は、次のリファレンス情報を参照してください。

これらのサブプログラムでは、GeoRasterオブジェクト・メタデータの統計データを設定してSDO_NUMBER_ARRAYオブジェクトのかわりにTRUEまたはFALSEの文字列値を戻す一部の形式のSDO_GEOR.generateStatisticsを除き、GeoRasterのメタデータは変更されません。

GeoRasterは、入力GeoRasterオブジェクトの特定のウィンドウ内のセルおよびサブセルに対して面積で重み付けした統計平均値を計算し、GeoRasterオブジェクトに格納される数値標高モデル(DEM)で表される3次元(3D)の表面積を計算する統計分析ファンクションも提供します。これらのオンザフライ統計計算ファンクションの説明および例は、次のリファレンス情報を参照してください。

これらの2つのファンクションは、不規則なポリゴンのクリップおよびサブセルの計算をサポートするため、非常に正確な結果を示します。

5.6.2 スタック統計分析

スタック統計分析は、各セルの統計値のいずれか(max、min、median、std、sum、minority、majorityまたはdiversity)を計算して、1つ以上のGeoRasterオブジェクトの1つ以上のレイヤーから新しい1レイヤーのGeoRasteオブジェクトを生成します。

スタック統計分析を実行するには、次のオプションがあります。

  • SDO_GEOR_RA.stackプロシージャを使用します。

    このオプションはより直感的で、(特に多数のレイヤーを使用するGeoRasterオブジェクトに対して)ラスター代数式の作成が必要ありません。すべてのレイヤーのかわりにレイヤーのリストを指定できます。

  • SDO_GEOR_RA.rasterMathOpプロシージャを使用します。

    このオプションはより柔軟性があり強力であるため、より複雑な統計分析を実行できます。

例5-14 SDO_GEOR_RA.stackの使用

この例は、スタック統計分析を実行する最初のオプションを使用します。SDO_GEOR_RA.stackプロシージャをコールして、2つの3レイヤーのソースGeoRasterオブジェクトのレイヤー2および5の最大値(max)を計算して、新しいGeoRasterオブジェクトを生成します。

DECLARE
  geor       MDSYS.SDO_GEORASTER;
  geor1      MDSYS.SDO_GEORASTER;
  geor2      MDSYS.SDO_GEORASTER;
  geom       mdsys.sdo_geometry;
BEGIN
  geom:= sdo_geometry(2003,82394, NULL,
                      sdo_elem_info_array(1, 1003, 1),
                      sdo_ordinate_array(20283.775, 1011087.9,
                                         18783.775, 1008687.9,
                                         21783.775, 1008687.9,
                                         22683.775+0.001, 1009587.9+0.001,
                                         20283.775, 1011087.9));
  select georaster into geor from georaster_table where georid = 100;
  select georaster into geor2 from georaster_table where georid = 102;
  select georaster into geor1 from georaster_table where georid = 101 for update;
  sdo_geor_ra.stack(SDO_GEORASTER_ARRAY(geor,geor2),geom,SDO_NUMBER_ARRAY(2,5),'max',null,geor1,'false',0,'TRUE');
  update georaster_table set georaster = geor1 where georid = 101;
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(121, 66, 181)
 
1 row selected.

SELECT sdo_geor.getcellvalue(georaster,0,100,100,'') FROM georaster_table WHERE georid=102;
 
SDO_GEOR.GETCELLVALUE(GEORASTER,0,100,100,'')
--------------------------------------------------------------------------------
SDO_NUMBER_ARRAY(33, 55, 56)
 
1 row selected.

--  In the results of the next SELECT statement, note:
--  max(181,56)  ==>  181

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)
 
1 row selected.

例5-15 SDO_GEOR_RA.rasterMathOpの使用

この例は、スタック統計分析を実行する2番目のオプションを使用します。統計操作(max)を指定するsdo_GEOR_RA.rasterMathOpをコールして、前述の例と類似した操作を実行します。ただし、この例はすべてのレイヤーに適用されます。

DECLARE
  geor       MDSYS.SDO_GEORASTER;
  geor1      MDSYS.SDO_GEORASTER;
  geor2      MDSYS.SDO_GEORASTER;
  geo_array  MDSYS.SDO_GEORASTER_ARRAY;
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;
  geo_array:=MDSYS.SDO_GEORASTER_ARRAY(geor,geor1);
  sdo_geor_ra.rasterMathOp(geo_array,SDO_STRING2_ARRAY('max()'),null,geor2);
  update georaster_table set georaster = geor2 where georid = 102;
  commit;
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:
-- max(181,163,159,181,122,159)  ==> 181

SELECT sdo_geor.getcellvalue(georaster,0,100,100,'') FROM georaster_table WHERE georid =102;
 SDO_GEOR.GETCELLVALUE(GEORASTER,0,100,100,'')
 --------------------------------------------------------------------------------
 SDO_NUMBER_ARRAY(181) 
1 row selected. 

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.

5.8 ラスター・データのスケール変更およびオフセット設定

ラスター・データのスケール変更およびオフセット設定の操作を実行できます。

ラスター代数には、地図的モデリング(「地図的モデリング」を参照)、植生指標計算(「植生指標計算」を参照)、タッセルド・キャップ変換(「タッセルド・キャップ変換」を参照)などの多くのアプリケーションがあります。この章および「イメージ処理および仮想モザイク」の各トピックでは、GeoRasterラスター代数のサンプル・アプリケーションについていくつか説明します。

例5-20 フィートからメートルへのDEMデータの変換

GeoRasterオブジェクトのセル値は、特定の単位によって空間オブジェクトの量的属性を表すことがあります。たとえば、DEM GeoRasterオブジェクトの標高データは、フィート単位になることがあります。アプリケーションでは、幾何補正などの操作で標高をメートルなどの別の単位に変換する必要があります。ラスター代数を使用して、DEMデータのスケールをフィートからメートルに変更(単位変換)できます(例5-20を参照)。

DECLARE 
  geor1    SDO_GEORASTER;
  geor2    SDO_GEORASTER;
BEGIN
  --Source GeoRaster object with a single DEM layer
  select georaster into geor1 from georaster_table where georid = 1;
  --To store the output DEM layer
  select georaster into geor2 from georaster_table where georid = 2 for update;
  --Scale elevation from feet to meters using the unit factor
  sdo_geor_ra.rasterMathOp(geor1,SDO_STRING2_ARRAY('{0} * 0.3048'),null,geor2);
  --Commit changes to the output georaster object
  update georaster_table set georaster = geor2 where georid = 2;
  commit;
END;
/

例5-21 ジオイド高によるDEMのオフセット

GeoRasterオブジェクトのセル・データは、状況によっては処理を続行するために定数によってオフセットする必要があります。たとえば、DEMレイヤーは、楕円体高度ではなく海抜高度を表すことがあります。RPCモデルによって地理参照されるRAWイメージをオルソ補正するには、楕円体高度が必要です。例5-21では、ジオイド高で海抜DEMをオフセットし、楕円体DEMを生成します。

DECLARE 
  geor1    SDO_GEORASTER;
  geor2    SDO_GEORASTER;
BEGIN
  --Source GeoRaster object with a single orthometric DEM layer
  select georaster into geor1 from georaster_table where georid = 1;
  --To store the output DEM layer
  select georaster into geor2 from georaster_table where georid = 2 for update;
  --Offset elevation by geoid height to get ellipsoidal elevation
  sdo_geor_ra.rasterMathOp(geor1,SDO_STRING2_ARRAY('{0} - 28.8'),null,geor2);
  --Commit changes to the output GeoRaster object
  update georaster_table set georaster = geor2 where georid = 2;
  commit;
END;
/

例5-22 変換(スケール変更)およびオフセット設定

例5-20例5-21の操作は組み合せて1つの単純なステップにできます(例5-22を参照)。

DECLARE 
  geor1    SDO_GEORASTER;
  geor2    SDO_GEORASTER;
BEGIN
  --Source GeoRaster object with a single DEM layer
  select georaster into geor1 from georaster_table where georid = 1;
  --To store the output DEM layer
  select georaster into geor2 from georaster_table where georid = 2 for update;
  --Scale elevation from feet to meters and offset elevation by geoid height
  sdo_geor_ra.rasterMathOp(geor1,SDO_STRING2_ARRAY('{0} * 0.3048 - 28.8'),null,geor2);
  --Commit changes to the output georaster object
  update georaster_table set georaster = geor2 where georid = 2;
  commit;
END;
/

5.9 ラスター・データのキャスト

ラスター・データのキャストによって、あるデータ型から別のデータ型にセル値がマップされます。

GeoRasterには、2つのタイプのキャスト操作があり、一方では操作のstorageParamパラメータでcellDepthキーワードを使用し、他方ではGeoRasterラスター代数のcastingExpr操作を使用します。(castingExprarithmeticExpr操作の1つです(「ラスター代数言語」を参照))。

ラスター・データの結果を新しいGeoRasterオブジェクトに格納する操作を適用するたびに、その操作のstorageParamパラメータでcellDepthキーワードを使用できます。(cellDepthキーワードとその値については、表1-1を参照してください。)cellDepthが指定されている場合、ターゲットGeoRasterオブジェクトがそのcellDepth値を使用して作成され、ラスター・セル・データは自動的にその格納用のcellDepth値にキャストされます。ソース・データがセル深度の下限で、結果のデータがセル深度の上限である場合、storageParamパラメータでcellDepthを直接使用してキャストを実行できます。この場合、キャストは透過的で高速です。

ただし、セル深度の上限のデータに対してセル深度の下限を指定すると、storageParamパラメータでcellDepthキーワードを使用してセル深度を変更した場合にデータの消失または変更が発生し、精度や品質が低下する可能性があります。精度と確度を詳細に制御するには、ラスター代数のキャスト演算子のcastingExprを使用します。

たとえば、32BIT_REALのセル深度を持つラスターがあり、値の範囲が[0.0, 100.0]であると仮定します。例5-23を使用して、10の異なるクラスへのラスターの線形セグメント化を実行できます(それぞれが、castint演算子の使用によって、10の倍数のセル値(0, 10, 20, …, 90)を持ちます)。この操作によって、すべてのセル値が、最も近い小さい方の10の倍数にキャストされます(たとえば、60から69のすべての数は、60にキャストされます)。

例5-23 ラスターの線形セグメント化

DECLARE 
  geor1    SDO_GEORASTER;
  geor2    SDO_GEORASTER;
BEGIN
  --Source georaster object with cell value range [0.0,100.0) 
  select georaster into geor1 from georaster_table where georid = 1;
  --Target georaster object to store the output layer
  select georaster into geor2 from georaster_table where georid = 2 for update;
  --Linearly segment the source raster into 10 classes and store in 8BIT cell depth
  sdo_geor_ra.rasterMathOp(geor1,
    SDO_STRING2_ARRAY('(castint({0}/10)*10'),
    'celldepth=8BIT',
    geor2);
  --Commit changes to the output georaster object
  update georaster_table set georaster = geor2 where georid = 2;
  commit;
END;
/

例5-23に示すとおり、storageParamパラメータでのcellDepthキーワードの使用とラスター代数のキャスト演算子を組み合せることで、適切で簡潔な方法で結果を正しく計算して格納できます。例5-23で、出力セル値は90以下の整数であるため、結果のラスターは(32BIT_REALのかわりに)記憶域を節約できる8BITのセル深度を使用して格納できます。

5.10 地図的モデリング

ラスター代数は、地図的モデリングに広く使用され、GISシステムの必須の構成要素と考えられます。PL/SQLとラスター代数の式およびファンクションを使用して、事実上無制限のサイズの多数のラスターおよびイメージを対象に地図的モデリングを実行できます。

たとえば、山火事の評価の地図的モデリング・プロセスでは、標高、傾斜、方位、温度、湿度などの情報を一連のラスター・レイヤーから取得し、1つずつセルを評価して結果のラスター地図を作成できます(この地図はさらに主題地図を作成するために分類できます)。ラスター・レイヤーのオーバーレイ技術を使用した変更分析、用地選定、適合性分析、気候モデリングおよび油田評価は、他の典型的な地図的モデリング・プロセスです。これらの場合、状況に応じて算術、関係および論理演算子を組み合せる必要があります。

架空の地図的モデルに7つの異なるラスター・レイヤーが含まれ、次のような式があり、モデリングの結果はセル値として0および1を持つラスター地図であると仮定します。

output = 1 if ( (100 < layer1 <= 500) 
                & (layer2 == 3 or layer2 == 10) 
                & ( (layer3+layer4) * log(Layer5) / sqrt(layer5) ) >= layer6) 
                || (layer7 != 1) ) 
                is TRUE and
         0 if otherwise

例5-24は、GeoRasterで前述の地図的モデルを実行してその結果をビットマップとして格納する方法を示しています。

例5-24 地図的モデリング

DECLARE 
  geor       SDO_GEORASTER;
  geor1      SDO_GEORASTER;
  mycursor   sys_refcursor;
  expr       varchar2(1024);
BEGIN
  --7 source GeoRaster objects, each of which contains one source layer in the order of 1 to 7
  OPEN mycursor FOR
    select georaster from georaster_table where georid >0 and georid <=7 order by georid;
  --Output GeoRaster object to contain the result
  insert into georaster_table (georid, georaster) values (8, sdo_geor.init('RDT_1',8))
    returning georaster into geor1;
  --Modeling using arithmeticExpr, booleanExpr, and rasterMathOp 
  expr := 
   'condition(
         ( (100<{0,0}) & ({0,0}<=500) )
           & ( ({1,0}=3) | ({1,0}=10) )
           & ( ( ( ({2,0}+{3,0}) * log({4,0} ) / sqrt({4,0}) ) >= {5,0} ) | ({6,0}!=1) 
         ),
         1,
         0)';
  sdo_geor_ra.rasterMathOp(mycursor, sdo_string2_array(expr), 
                           'celldepth=1BIT', geor1, 'true', 0, 'parallel=4');
  update georaster_table set georaster = geor1 where georid = 8;
  commit;
END;
/

例5-24のプロセスでは、NODATAを考慮し、1つ以上のソース・レイヤーのNODATAセルである任意のセルに0(ゼロ)を割り当てます。これは、データベース・サーバーの複数のCPUを利用してパフォーマンスを向上するために、4つのプロセスにパラレル化されます。

5.11 地形モデリングおよび分析

入力GeoRasterオブジェクトからのデータを使用して、地形モデリングおよび分析を実行できます。

SDO_GEOR_GDAL.demプロシージャは、入力GeoRasterオブジェクトからのデータを使用して、指定されたprocessingパラメータに基づいて出力を生成します。入力GeoRasterオブジェクトは通常は数値標高モデルとなり、processing値はhillshadeslopeaspectcolor-reliefroughnessなどの値になります。

例5-25 hillshade

processingパラメータ値がhillshadeの場合、プロシージャは隣接する地域よりも高い地域の影を表すグレースケール・イメージを生成し、日光の視覚効果を模倣します。

この例では、陰影起伏イメージを作成します。

DECLARE
  gr1 sdo_georaster;
  gr2 sdo_georaster;
BEGIN
  select raster into gr1 from imagery where id = 1;
  delete from imagery where id = 2;
  insert into imagery values(2, sdo_geor.init('imagery_rdt',2))
         returning raster into gr2;
  sdo_geor_gdal.dem(gr1, gr2, 'hillshade');
  update imagery set raster = gr2 where id = 2;
  commit;
END;
/

例5-26 slope

プロシージャは、入力ラスターの標高値に基づいて傾斜または方位ラスターを生成できます。その場合、出力ピクセル値によって視覚的にすぐれた出力は生成されませんが、土地利用および土地配分分析に使用される可能性のある便利なラスター表面が生成されます。たとえば、傾斜や日当たりの角度(方位)に基づいてワイン生産に適した地域を定義するために使用できる場合があります。

次の例では、ラスター標高データから生成された傾斜を表すラスターを作成します。結果のピクセル値は、デフォルトの度数出力ではなくパーセンテージで表されます。

DECLARE
  gr1 sdo_georaster;
  gr3 sdo_georaster;
BEGIN
  select raster into gr1 from imagery where id = 1;
  delete from imagery where id = 3;
  insert into imagery values(3, sdo_geor.init('imagery_rdt', 3))
         returning raster into gr3;
  sdo_geor_gdal.dem(gr1, gr3, 'slope', 'slopevalue=percent');
  update imagery set raster = gr3 where id = 3;
  commit;
END;
/

例5-27 aspect

この例では、ラスター標高データから生成された方位を表すラスターを作成します。平坦な地域を表すピクセルは、デフォルトの-9999ではなく値0になります。

DECLARE
  gr1 sdo_georaster;
  gr4 sdo_georaster;
BEGIN
  select raster into gr1 from imagery where id = 1;
  delete from imagery where id = 4;
  insert into imagery values(4, sdo_geor.init('imagery_rdt', 4))
         returning raster into gr4;
  sdo_geor_gdal.dem(gr1, gr4, 'aspect', 'zeroforflat=yes');
  update imagery set raster = gr4 where id = 4;
  commit;
END;
/

例5-28 color-relief

この例では、ファイルcolorfile.txtを使用してラスター標高データから生成されたカラー・レリーフを表すラスターを作成します。この例では、colorfile.txtファイルには次の標高パーセント、赤、緑、青の値が含まれます。

0%  180   0 255
10%  70   0 255
20%   0  70 255
30%   0 180 255
40%   0 255 180
50%   0 255  70
60%  70 255   0
70% 180 255   0
80% 255 180   0
90% 255  70   0
nv    0   0   0
DECLARE
  gr1 sdo_georaster;
  gr5 sdo_georaster;
BEGIN
  select raster into gr1 from imagery where id = 1;
  delete from imagery where id = 5;
  insert into imagery values(5, sdo_geor.init('imagery_rdt', 5))
         returning raster into gr5;
  sdo_geor_gdal.dem(inGeoRaster    => gr1,
                    outGeoRaster   => gr5, 
                    processing     => 'color-relief', 
                    colorDirectory => 'mydir’,
                    colorFilename  => 'colorfile.txt');
  update imagery set raster = gr5 where id = 5;
  commit;
END;
/

これらの例に示されている操作に加えて、DEM GeoRasterオブジェクトからTerrain Ruggedness Index (TRI)マップ、Topographic Position Index (TPI)マップおよび粗さマップを生成する手順を使用できます。