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.