プライマリ・コンテンツに移動
Oracle® Spatial and Graph GeoRaster開発者ガイド
12cリリース1 (12.1)
B72468-06
目次へ移動
目次
索引へ移動
索引

前
次

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

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

この章の内容は次のとおりです。

4.1 ラスター代数言語

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

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

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

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

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

arithmeticExpr:
                unaryArithmeticExpr
              | binaryArithmeticExpr
              | functionArithmeticExpr
              | booleanExpr
              | castingExpr
              | constantNumber
              | identifier
              | (arithmeticExpr)
booleanExpr:
                unaryBooleanExpr
              | binaryBooleanExpr
              | arithmeticExpr comparisonOp arithmeticExpr
              | (booleanExpr)
unaryArithmeticExpr:
                (arithmeticUnaryOp arithmeticExpr)
binaryArithmeticExpr:
                arithmeticExpr  arithmeticBinaryOp arithmeticExpr
functionArithmeticExpr:
                numericFunction (arithmeticExpr)
 
castingExpr:
              rangeType(arithmeticExpr)
unaryBooleanExpr:
                booleanUnaryOp booleanExpr
binaryBooleanExpr:
                booleanExpr booleanBinaryOp booleanExpr
arithmeticBinaryOp:
                +
              | -
              | *
              | /
comparisonOp:
                 =
              |  <
              |  >
              | >=
              | <=
              | !=
arithmeticUnaryOp:
                +
              | -
booleanBinaryOp:
                &
              | |
booleanUnaryOp:
                !
rangeType:
               castint
              | castonebit
              | casttwobit
              | castfourbit
              | casteightbit
numericFunction:
                abs
              | sqrt
              | exp
              | log
              | ln
              | sin
              | cos
              | tan
              | sinh
              | cosh
              | tanh
              | arcsin
              | arccos
              | arctan
              | ceil
              | floor
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(ゼロ)から開始します。

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

  • SDO_GEOR_RA.rasterMathOpは、arithmeticExprを使用して数学的操作またはモデリングを実行します。

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

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

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

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

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

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

4.1.1 ラスター代数式の例

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

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

例4-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=true, blocksize=(256,256,3)',geor1);
  update georaster_table set georaster = geor1 where georid = 5;
  commit;
END;
/

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

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

例4-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のセル値を示します。

例4-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}です。

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

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

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

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

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

4.2 セル値ベースの条件付き問合せ

ラスターに対する空間ベースの問合せでの使用に加え(SDO_GEOR.getRasterSubsetの使用など)、分析およびアプリケーション・モデリングではセル値ベースの問合せが特に便利です。セル値ベースの条件付き問合せを実行し、指定した条件に基づいて新しいGeoRasterオブジェクトを生成するには、SDO_GEOR_RA.findCellsプロシージャを使用して適切なconditionパラメータを指定します。

conditionパラメータでは、有効なbooleanExpr値(「ラスター代数言語」を参照)を指定する必要があります。プロシージャは、ソースGeoRasterオブジェクトの各セルに対してbooleanExprを計算します。結果がTRUEの場合、元のセル値が出力GeoRasterオブジェクトに維持され、結果がFALSEの場合、bgValuesを使用して出力GeoRasterオブジェクトのセル値が入力されます。これは、マスキング操作と考えることもできます。

例4-4 条件付き問合せ

例4-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=true, blocksize=(256,256,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)

例4-5 nodataパラメータを使用した条件付き問合せ

例4-5は、基本的に例4-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.
 

例4-6 parallelParamを使用した条件付き問合せ

例4-6では、次の条件をすべて満たすすべてのピクセルを検出します。

  • 1番目のバンドのセル値が(100,200)の間にあります。

  • 2番目のバンドのセル値が[50,250]の間にあります。

  • 3番目のバンドのセル値が100を超えます。

また、parallelParam'parallel=4'と指定されているため、例4-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;
/

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

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

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

conditionパラメータではブール式の配列を指定し、valsパラメータでは計算式の各配列の配列を指定します。(「ラスター代数言語」のラスター代数操作の説明を参照してください。)各セルで、conditionTRUEの場合、そのセル値はvals配列の対応する計算式の結果に更新されます。

例4-7 セル値ベースの更新

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

例4-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.

例4-8 nodataパラメータを使用したセル値ベースの更新

例4-8は、基本的に例4-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.

4.4 数学的操作

ラスター代数の主な用途は、ソースの異なるラスター・レイヤーに数学的モデルを適用することです。1つ以上のGeoRasterオブジェクトの1つ以上のレイヤーに数学的操作を適用して新しいGeoRasterオブジェクトを生成するには、SDO_GEOR_RA.rasterMathOpプロシージャを使用します。

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

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

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

例4-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.

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

例4-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.

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

例4-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.

4.5 分類操作

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

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

例4-12 分類

例4-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.

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

例4-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.

4.6 オンザフライ統計分析

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

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

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

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

動的に生成される統計データを使用するアプリケーションについては、「 イメージのストレッチ」例5-11を参照してください。

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

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

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

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

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

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

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

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

例4-14例4-15の操作は組み合せて1つの単純な手順にできます(例4-16を参照)。

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

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

ラスター・データのキャストによって、あるデータ型から別のデータ型にセル値がマップされます。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]であると仮定します。例4-17を使用して、10の異なるクラスへのラスターの線形セグメント化を実行できます(それぞれが、castint演算子の使用によって、10の倍数のセル値(0, 10, 20, …, 90)を持ちます)。この操作によって、すべてのセル値が、最も近い小さい方の10の倍数にキャストされます(たとえば、60から69のすべての数は、60にキャストされます)。

例4-17 ラスターの線形セグメント化

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

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

4.9 地図的モデリング

ラスター代数は、地図的モデリングに広く使用され、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

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

例4-18 地図的モデリング

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 := '((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))';
  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;
/

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