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
として使用できます。この場合、booleanExpr
のTRUE
とFALSE
の評価結果は、それぞれ数値の1と0に変換されます。
式のidentifier
は、GeoRasterオブジェクトのラスター・レイヤーを示します。これは、1つのband
番号か(関連するGeoRasterオブジェクトが1つのみの場合)、または(ID
, band
)のペアです(ID
は式のGeoRasterオブジェクトのいずれかを示し、bandはそのGeoRasterオブジェクトの特定のレイヤーを示します)。この言語のband
番号は、セル空間のバンド次元に沿ったレイヤーの座標番号を示すため、常に0(ゼロ)から開始します。GeoRaster ID番号は常に0(ゼロ)から始まります。
次のプロシージャによって、ラスター代数操作の主なサポートが提供されます。
-
SDO_GEOR_RA.rasterMathOpは、数学的操作またはモデリングを実行する
arithmeticExpr
、論理演算を実行するconditionalExpr
とbooleanExpr
および統計分析を実行する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')
に更新されます。
親トピック: ラスター代数言語