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')に更新されます。