4 GeoRasterのデータ問合せおよび操作

この章では、いくつかの重要なGeoRasterのデータ問合せおよび操作を実行する方法について説明します。一般的なGeoRasterのデータ問合せおよび操作には、説明されているほとんどまたはすべての操作が関係します。

「GeoRasterのデータベース作成および管理」の操作も参照してください。

このマニュアルの他の章では、高度なトピックについて説明し(「ラスター代数および分析」および「イメージ処理および仮想モザイク」)、GeoRaster PL/SQLパッケージに関する詳細なリファレンス情報を提供しています(「SDO_GEORパッケージのリファレンス」「SDO_GEOR_ADMINパッケージのリファレンス」「SDO_GEOR_AGGRパッケージのリファレンス」「SDO_GEOR_RAパッケージのリファレンス」および「SDO_GEOR_UTLパッケージのリファレンス」)。

トピック:

4.1 GeoRasterオブジェクトの問合せと検索

GeoRaster表は、ID番号、名前、タイムスタンプ、文字列形式での独自の説明など、様々な列を持つことのできる通常のリレーショナル表です。これらの列には索引を付けることができ、GeoRasterオブジェクトは、このマニュアルの多くの例で示しているとおり、標準的なデータベースの索引付けおよび問合せの文を使用して問い合せることが可能です。

GeoRaster表に空間索引が付けられると(「GeoRasterオブジェクトの索引付け」を参照)、ジオメトリも使用してGeoRasterオブジェクトの問合せまたは検索を迅速に行うことができます。たとえば、次の例に示すとおり、特定の地域内のすべてのイメージ(通常は数百以上)を検出して、イメージごとに完全なピラミッドを生成できます。

例4-1 GeoRasterオブジェクトの検索およびそれらのピラミッドの生成

DECLARE
  type curtype is ref cursor;
  my_cursor curtype;
  stmt varchar2(1000);
  tid     number;
  gr    sdo_georaster;
  gm  sdo_geometry;
BEGIN
  -- 1. Define the query area in EPSG 4326 (WGS84) coordinate system
  gm := sdo_geometry(2003, 4326, null,
              sdo_elem_info_array(1,1003,3),
              sdo_ordinate_array(5,6,30,30));
 
  -- 2. Define the query statement on the GeoRaster table (city_images)using the given geometry
  stmt := 'select id from city_images t ' ||
    'where sdo_inside(t.image.spatialextent, :1)=''TRUE''';
 
  -- 3. Spatially query all images INSIDE the query area 
  --    and generate full pyramids for each of the images
  open my_cursor for stmt using gm;
  loop
    fetch my_cursor into tid;
    exit when my_cursor%NOTFOUND;
    -- retrieve the image to generate the pyramids
    select image into gr from city_images where id = tid for update;
    sdo_geor.generatePyramid(gr, 'resampling=bilinear', null, ‘parallel=4’);
    update city_images set image=gr
       where id = tid;
    commit; 
  end loop;
  close my_cursor;
END;

このようなブロックをPL/SQLプロシージャにまとめてデータベースに格納し、そのストアド・プロシージャを直接コールすることもできます。これらの機能によって、複雑なプロセスを編成し、データベース管理タスクを自動化できます。

4.2 ラスター記憶域の変更と最適化

ラスター・ブロック・サイズ、セル深度、インターリーブ・タイプなど、ラスター・イメージ・データを格納する方法(または将来格納する方法)の一部を変更または指定できます。このような柔軟性により、ラスター・データ記憶域形式を最適化してディスク領域を節約し、アプリケーションのパフォーマンスを向上できます。

GeoRasterオブジェクトをロードおよび処理して別のGeoRasterオブジェクトを作成するには、GeoRaster PL/SQLサブプログラムを使用して記憶域パラメータを指定できます。つまり、SDO_GEOR.importFromSDO_GEOR.subsetSDO_GEOR.rectifySDO_GEOR_AGGR.appendSDO_GEOR.mergeLayersSDO_GEOR.createTemplateSDO_GEOR_RA.rasterMathOpSDO_GEOR_AGGR.mosaicSubsetなどのファンクションまたはプロシージャをコールするときに、出力形式を指定できます。既存のGeoRasterオブジェクトに対してこのような変更を直接行うことはできませんが、SDO_GEOR.changeFormatCopyプロシージャを使用し、storageParamパラメータとともに必要な記憶域パラメータ値を指定して、既存のGeoRasterオブジェクトのコピーを作成できます。

結果のGeoRasterオブジェクトのstorageParamパラメータは、ユーザーが決定するデータ・サイズ、次元サイズ、アプリケーション・ニーズなどの要素に基づいている必要があります。ただし、各GeoRasterオブジェクトで最小限の埋込みスペースのみが使用され、アプリケーション要件が引き続き満たされるように、ブロック・サイズは、GeoRasterオブジェクトの次元サイズとユーザーが必要とする目的の出力に基づいて自動的に最適化することもできます。ラスター次元サイズおよび必要なブロック化サイズによっては、埋込みによって記憶域を消費する可能性があるため、GeoRasterプロシージャをコールする場合、出力GeoRasterのためにblocking=OPTIMALPADDING(storageParamパラメータ内)を指定することを常に考慮する必要があります。

詳細は、特に表1-1「記憶域パラメータ」を参照してください。最適な埋込みの適用例は、「記憶域パラメータ」の最後にあるPL/SQL例および「ブロック化および最適な埋込みを使用したロード」のGDAL例を参照してください

4.3 GeoRasterオブジェクトのコピー

GeoRasterオブジェクトをコピーするには、そのオブジェクトを空のGeoRasterオブジェクトにコピーするか、既存の有効なGeoRasterオブジェクトを上書きする必要があります。(空のGeoRasterオブジェクトの詳細は、「空白のGeoRasterオブジェクトと空のGeoRasterオブジェクト」を参照してください)。ソースGeoRasterオブジェクトと同一のコピーを作成するには、SDO_GEOR.copyプロシージャを使用します。記憶域形式の変更を伴うコピーを作成するには、SDO_GEOR.changeFormatCopyプロシージャ(「ラスター記憶域の変更と最適化」を参照)を使用します。

空のGeoRasterオブジェクトを使用してGeoRasterオブジェクトをコピーするには、次の手順を実行します。

  1. 空のGeoRasterオブジェクトを初期化して宛先表に挿入し、その空のGeoRasterオブジェクトを戻します。

  2. SDO_GEOR.copyまたはSDO_GEOR.changeFormatCopyプロシージャを使用して、戻された空のGeoRasterオブジェクトに適切なGeoRasterオブジェクトをコピーします。

  3. UPDATE文を使用して、コピーしたGeoRasterオブジェクトが宛先表のGeoRaster列に含まれるように宛先表の目的の行を更新します。

  4. トランザクションのコミットの準備ができたら、COMMIT文を使用します。

空のGeoRasterオブジェクトを使用したコピー方法の例は、「SDO_GEORパッケージのリファレンス」SDO_GEOR.copyプロシージャの例を参照してください。

既存のGeoRasterオブジェクトを上書き(置換)してGeoRasterオブジェクトをコピーするには、次の手順を実行します。

  1. 更新する既存のGeoRasterオブジェクトを選択します。
  2. SDO_GEOR.copyまたはSDO_GEOR.changeFormatCopyプロシージャを使用して、選択したGeoRasterオブジェクトを既存の有効なGeoRasterオブジェクトにコピーするか、または空のGeoRasterオブジェクトにコピーします。
  3. UPDATE文を使用して、コピーしたGeoRasterオブジェクトが宛先表のGeoRaster列に含まれるように宛先表の目的の行を更新します。
  4. トランザクションのコミットの準備ができたら、COMMIT文を使用します。

既存のGeoRasterオブジェクトを置き換えるため、および記憶域形式を変更するためのコピーの例は、「SDO_GEORパッケージのリファレンス」SDO_GEOR.changeFormatCopyプロシージャの例を参照してください。

パラレルでのコピーおよびサブセット化は、SDO_GEOR_AGGR.mosaicSubsetプロシージャでサポートされます。パラレル・コピーおよび形式変更コピーは、「パラレル圧縮、コピーおよびサブセット化」例6-24を参照してください。

4.4 ポリゴンのクリップを使用したGeoRasterオブジェクトのサブセット化

GeoRasterを使用する場合、サブセット化は、ラスターの空間クロッピング、ラスター・レイヤーの抽出または複製あるいは両方の同時実行を意味します。サブセット化を実行するには、SDO_GEOR.subsetプロシージャを使用します。たとえば、このプロシージャをコールして一部の領域をクロッピングしたり、GeoRasterオブジェクトのいくつかのレイヤーのサブセットを取得したり、レイヤーを複製したり、結果のオブジェクトの記憶域パラメータ(ブロック、インターリーブなど)を指定したり、ポリゴンのクリップを実行したりすることもできます。

例は、「SDO_GEOR.subset」リファレンス・トピックを参照してください。

また、SDO_GEOR_AGGR.mosaicSubsetプロシージャを使用して、並列性を使用したサブセット化を実行できます(「パラレル圧縮、コピーおよびサブセット化」を参照)。

4.5 GeoRasterメタデータの問合せおよび更新

GeoRasterオブジェクトのメタデータを問い合せ、そのメタデータの多くの属性を更新できます。

多くのファンクション(ほとんどのファンクションは名前がget で始まる)を使用すると、メタデータおよび補助情報(SDO_GEOR.getTotalLayerNumberSDO_GEOR.hasPseudoColorなど)を問い合せることができます。

いくつかのサブプログラム(ほとんどのサブプログラムは名前がset で始まる)を使用すると、メタデータおよび補助情報(SDO_GEOR.setSRSSDO_GEOR.setColorMapなど)を更新できます。

getファンクションの多くには、名前がsetで始まる、対応するプロシージャが存在します。これらのプロシージャは、メタデータ属性の値を設定、変更または削除します。ほとんどのsetプロシージャでは、そのプロシージャがメタデータ属性の値を変更するように設計されている場合、メタデータ属性の値を削除するには、その属性値にNULLを指定します。たとえば、GeoRasterオブジェクトのレイヤーのビン表を削除するには、SDO_GEOR.setBinTableプロシージャをコールして、tableNameパラメータにNULLを指定します。ただし、ほとんどの場合、関連する他の属性に対してはNULL値は指定できません。たとえば、SDO_GEOR.setBinTableプロシージャへのコールでlayerNumberパラメータにNULLを指定することはできません。

次の推奨事項、要件および制限事項に注意してください。

  • ほとんどのGeoRasterメタデータは、XMLTypeのメソッドまたはXML固有のSQLファンクション(extractなど)を使用して取得でき、XQuery Updateを使用して変更することもできます。ただし、取得または変更するメタデータ属性に対応するGeoRasterのgetまたはsetサブプログラムが存在する場合、XMLTypeインタフェースではなくGeoRasterサブプログラムを使用してください。これは、GeoRasterサブプログラムでは、すべての変更が実行前に検証されるためです。XMLTypeのメソッドまたはXML固有のSQLファンクションをコールしてメタデータを更新する場合は、トランザクションをコミットする前にGeoRasterオブジェクトを検証する必要があります。

  • メタデータを直接NULLに設定しないでください。

  • GeoRasterオブジェクトのrasterType属性は直接更新しないでください(かわりに、SDO_GEOR.setRasterTypeプロシージャをコールします)。

  • ラスター・データ表の名前を変更する場合は、SDO_GEOR_UTL.renameRDTプロシージャを使用します。

  • 通常は、GeoRasterオブジェクトの属性を直接更新しないでください(spatialExtent属性を除く)。

  • GeoRasterオブジェクトのメタデータまたはセル・データ(あるいはその両方)を更新した後で、データベース・トランザクションをコミットする前に、SQL UPDATE文をコールしてGeoRasterオブジェクトを更新する必要があります(「コミット前のGeoRasterオブジェクトの更新」を参照)。

4.6 GeoRasterセル・データの問合せおよび更新

処理および視覚化のためのGeoRasterオブジェクトのセル(ピクセル)・データを問い合せる場合、1つのセル(ピクセル)、セルの範囲、またはGeoRasterオブジェクトのラスター全体のラスター・データを問い合せることができます。

  • SDO_GEOR.getCellValueは、指定した場所の1つ以上のレイヤーまたはバンドのセル値を戻します。

  • SDO_GEOR.getCellValuesは、配列の1つ以上のセルのセル値を戻します。

  • SDO_GEOR.evaluateDoubleは、指定された内挿方法を使用することで、隣接するセルの値に基づいて直接の場所を評価し、その場所に指定されたバンドまたはレイヤーのラスター値(倍精度の数値)を戻します。(詳細は、「セル値の内挿」を参照してください。)

  • SDO_GEOR.evaluateDoublesは、指定された内挿方法を使用することで複数の場所を評価し、それらの場所の指定されたバンドまたはレイヤーのラスター値(倍精度の数値)を戻します。

  • SDO_GEOR.getRasterSubsetは、(矩形ウィンドウまたはクリップ・ポリゴン・ジオメトリ、レイヤーまたはバンド番号、およびピラミッド・レベルで指定された) GeoRasterオブジェクトの厳密なサブセットのすべてのセルが含まれる、単一のBLOBオブジェクトまたは単一のインメモリーSDO_NUMBER_ARRAYオブジェクトを作成します。このBLOBオブジェクトまたはSDO_NUMBER_ARRAYオブジェクトにはラスター・セルのみが含まれ、関連するメタデータは含まれません。

  • SDO_GEOR.getRasterDataは、GeoRasterオブジェクトの、指定されたピラミッド・レベルのすべてのセルが含まれる、単一のBLOBオブジェクトを作成します。このBLOBオブジェクトにはラスター・セルのみが含まれ、関連するメタデータは含まれません。

  • SDO_GEOR.getRasterBlocksは、指定されたウィンドウの内部に存在するか、またはそのウィンドウの境界に接するすべてのイメージ・データが含まれるオブジェクトを戻します。具体的には、指定されたピラミッド・レベルで、指定されたウィンドウの内部に存在するか、またはそのウィンドウの境界に接するすべてのブロックを識別する、SDO_RASTERSETコレクション型のオブジェクトを戻します。

  • SDO_GEOR.reprojectは、ある投影座標系から別の投影座標系にGeoRasterオブジェクト全体を変換するのみでなく、問合せ結果を異なる座標系にオンザフライで直接変換することで、SDO_GEOR.getRasterSubsetと同じ機能を組み入れることができます。

  • SDO_GEOR.rectifyは、問合せウィンドウに基づいて、地理参照されるGeoRasterオブジェクトの全部または一部に対して再投影、幾何補正またはオルソ補正を実行します。結果のオブジェクトは、新しいGeoRasterオブジェクト(永続記憶域目的)またはBLOB (一時使用目的)のいずれかです。

  • SDO_GEOR_RA.findCellsは、GeoRasterラスター代数言語を使用して、セル値に基づいて新しいGeoRasterオブジェクトを生成します。(詳細は、「セル値ベースの条件付き問合せ」を参照してください。)

  • SDO_GEOR_AGGR.mosaicSubsetは、複数のGeoRasterオブジェクトを1つのGeoRasterオブジェクトにモザイク処理します。

  • SDO_GEOR_AGGR.getMosaicSubsetは、仮想モザイクを問い合せて、モザイク処理されたサブセットをオンザフライで戻します。

  • SDO_GEOR.getBitmapMaskSDO_GEOR.getBitmapMaskSubsetSDO_GEOR.getBitmapMaskValueおよびSDO_GEOR.getBitmapMaskValuesにより、完全なラスター、ウィンドウまたは単一のセルに基づいてビットマップ・マスクを問い合せることができます。

SDO_GEOR.exportToプロシージャを使用して、ラスター・イメージの全体または一部を、BLOBオブジェクト(バイナリ・イメージ形式)または指定したファイル形式タイプのファイルにエクスポートすることもできます。

ラスター更新には、空間ベースとセル値ベースという2つのタイプがあります。

  • 空間ベースのラスター更新では、単一値または別のGeoRasterオブジェクトを使用して、指定したウィンドウ内でGeoRasterオブジェクトのラスター・データを完全に更新できます。

    指定したウィンドウ内のラスター・セルの値を単一の値に更新または変更するには、SDO_GEOR.changeCellValueプロシージャを使用します。行/.列配列または複数点のジオメトリで指定されたラスター・セルの値を新しい値に変更するには、SDO_GEOR.changeCellValuesプロシージャを使用できます。SDO_GEOR.updateRasterプロシージャをコールすると、指定した領域の指定したピラミッド(1つのGeoRasterオブジェクトの重複部分)を、別のGeoRasterオブジェクトの指定したピラミッドと指定したバンドまたはレイヤーで更新できます。SDO_GEOR.changeCellValueおよびSDO_GEOR.updateRasterプロシージャでは、元のラスター・データ(ピラミッド・レベル0)を含むすべてのピラミッド・レベルがサポートされます。

    SDO_GEOR_AGGR.appendプロシージャを使用して、新しいイメージで既存のイメージを更新することもできます(「イメージの追加」を参照)。

  • セル値ベースのラスター更新では、GeoRasterラスター代数言語を使用して、セル値に基づいてGeoRasterオブジェクトのラスター・データを更新できます。

    SDO_GEOR_RA.rasterUpdateは、conditionsパラメータに指定されたブール文字列に基づいて、指定されたGeoRasterオブジェクトからセルを選択し、valsパラメータに指定された式文字列を計算して対応するセル値を更新します。conditionsおよびvalsパラメータは、両方ともラスター代数言語を使用して複雑な式にすることができます。(詳細は、「セル値ベースの条件付き更新(編集)」を参照してください。)

空間ベースまたはラスター・セル値ベースの更新を実行するときに、GeoRasterオブジェクトにすでに統計が設定されている場合、ラスター更新プロシージャの実行後に統計は自動的に削除または更新されません。必要に応じて、ユーザーが統計を削除または再生成する必要があります。

注意:

入力されたGeoRasterオブジェクトのデータに対して追加または上書きするプロシージャを使用する場合は、元のGeoRasterオブジェクトをコピーし、そのコピーしたオブジェクトに対してプロシージャを使用してください。プロシージャの結果を確認してから、必要に応じて元のGeoRasterオブジェクトを廃棄します。

ラスター・データ表の名前、GeoRasterオブジェクトの属性、または他の任意のメタデータを変更する場合、「GeoRasterメタデータの問合せおよび更新」に記載されている推奨事項、要件および制限事項を参照してください。

GeoRasterオブジェクトのメタデータまたはセル・データ(あるいはその両方)を更新した後で、データベース・トランザクションをコミットする前に、SQL UPDATE文をコールしてGeoRasterオブジェクトを更新する必要があります(「コミット前のGeoRasterオブジェクトの更新」を参照)。

4.7 セル値の内挿

GeoRasterオブジェクトは、グリッド範囲です。グリッド範囲を評価する操作は、グリッド内挿(セル間またはセル内の点位置にセル値を内挿する方法)とも呼ばれます。GeoRasterでのこの操作は、ラスターの任意の点を評価してその場所の倍精度数値を戻すSDO_GEOR.evaluateDoubleファンクションによって実行されます。6つの異なる内挿方法(「リサンプリングおよび内挿」のリストを参照)のいずれかを使用して評価を実行できます。たとえば、GeoRasterオブジェクトがDEMレイヤーの場合、次の例を使用して、ランダムな点の位置の評価を検出できます。

SELECT SDO_GEOR.evaluateDouble(a.georaster, 0, 
    SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(112.704, 41.917, NULL),
                 NULL, NULL),
    '1', 
    'interpolationMethod=BILINEAR') 
  FROM georaster_table a WHERE raster_name='myDEM';

'interpolationMethod=NN'を使用してSDO_GEOR.evaluateDoubleをコールすると、GeoRasterオブジェクトは別個のラスターとして扱われ、前述の例は、セル内の異なる点の場所で同じ値(セル値)を戻すSDO_GEOR.getCellValueをコールした場合と同じになります。この場合(特に1つのバンドのセル値のみを問い合せる場合)、かわりにSDO_GEOR.getCellValueを直接コールできます。他の内挿方法では、ラスターが連続面として扱われ、セル内の異なる点の場所で異なる値が戻される可能性があります。

4.8 GeoRasterオブジェクトの処理および分析

GeoRasterデータには、内部ラスター記憶域形式の変更、サブセット化(クロッピング)、スケール変更、回転、マスキング、ストレッチ、フィルタリング、覆い焼き、(ある座標系から別の座標系への)再投影、幾何補正、オルソ補正、ワーピング、モザイク処理、追加、およびピラミッドの生成など、GeoRasterデータに対して様々なラスターおよびイメージ処理操作を実行できます。GeoRasterでは、仮想モザイクもサポートされます。関連するサブプログラムには、SDO_GEOR.changeFormatCopySDO_GEOR.subsetSDO_GEOR.reprojectSDO_GEOR.rectifySDO_GEOR.generatePyramidSDO_GEOR.deletePyramidSDO_GEOR.scaleCopySDO_GEOR.mergeLayersSDO_GEOR_AGGR.mosaicSubsetSDO_GEOR_AGGR.getMosaicSubsetおよびSDO_GEOR_AGGR.appendが含まれます。詳細な説明は、「イメージ処理および仮想モザイク」「SDO_GEORパッケージのリファレンス」および「SDO_GEOR_AGGRパッケージのリファレンス」を参照してください。

ラスター・セル値ベースの代数的操作や地図的モデリングおよび分析については、GeoRasterによって、ラスター代数言語(PL/SQL式と代数式)および関連するラスター操作(条件付き問合せ(SDO_GEOR_RA.findCells)、セル値ベースの更新または編集(SDO_GEOR_RA.rasterUpdate)、論理および数学的操作(SDO_GEOR_RA.rasterMathOp)、イメージおよびラスターのセグメント化(SDO_GEOR_RA.classify)など)がサポートされます。SDO_GEOR.generateStatisticsファンクションでは、ポリゴンベースの統計およびヒストグラム生成がサポートされます。SDO_GEOR.generateStatisticsMaxSDO_GEOR.generateStatisticsMeanSDO_GEOR.generateStatisticsMedianSDO_GEOR.generateStatisticsMinSDO_GEOR.generateStatisticsModeおよびSDO_GEOR.generateStatisticsSTDの各オンザフライ・ファンクションでは、GeoRasterオブジェクトまたはそのレイヤーの対話型統計分析がサポートされます。詳細は、「ラスター代数および分析」および「SDO_GEOR_RAパッケージのリファレンス」を参照してください。

例および説明は、「GeoRasterのPL/SQLおよびJavaデモ・ファイル」に記載されているGeoRaster PL/SQLデモ・ファイルも参照してください。

4.9 GeoRaster操作の進行状況の監視およびレポート

GeoRasterでは、多くの操作の実行の進行状況を監視およびレポートできます(「GeoRasterでの操作の進行状況のレポート」のリストを参照)。次に、操作の進行状況をレポートする場合の基本手順を示します。

  1. SDO_GEOR_UTL.createReportTableプロシージャを使用して、適切なユーザーのスキーマにレポート表を作成します。(これは、操作を監視する前に1回コールする必要があります。)

    EXECUTE SDO_GEOR_UTL.createReportTable;
    
  2. 操作を実行および監視するユーザー・セッションで、次のアクションを実行します。

    1. SDO_GEOR_UTL.enableReportを使用して監視を有効化します。(後でステータス・レポートを取得するために、このプロシージャをコールする必要があります。)

      EXECUTE SDO_GEOR_UTL.enableReport;
      
    2. オプションで、SDO_GEOR_UTL.setClientIDを使用してクライアントIDを設定します。クライアントIDを使用して、操作を実行するユーザー・セッションを識別します。このプロシージャがコールされない場合、クライアントIDはデフォルトでSQLセッションIDになります。次に例を示します。

      EXECUTE SDO_GEOR_UTL.setClientID(100);
      
    3. オプションで、SDO_GEOR_UTL.setSeqIDを使用して順序IDを設定します。順序IDを使用して、同じSQLセッション内の繰返し操作を識別します。このプロシージャがコールされない場合、順序IDはデフォルトで0になります。次に例を示します。

      EXECUTE SDO_GEOR_UTL.setSeqID(1);
      
    4. 監視対象の操作を実行します。次に例を示します。

      -- Generate pyramid for georid=6. The progress of this generatePyramid call 
      -- can be monitored by step 3.
      DECLARE
        gr sdo_georaster;
      BEGIN
         SELECT georaster INTO gr 
          FROM georaster_table WHERE georid = 6 FOR UPDATE;
        sdo_geor.generatePyramid(gr, 'rLevel=5, resampling=NN');
        UPDATE georaster_table SET georaster = gr WHERE georid = 6;
         COMMIT;
      END;
      /
      
    5. オプションで、監視対象の追加操作ごとに、手順cおよびdを繰り返します。次に例を示します。

      EXECUTE SDO_GEOR_UTL.setSeqID(2);
      -- Generate pyramid for georid=7. The progress of this generatePyramid call
      -- can be monitored by step 3.
      DECLARE
        gr sdo_georaster;
      BEGIN
         SELECT georaster INTO gr 
          FROM georaster_table WHERE georid = 7 FOR UPDATE;
        sdo_geor.generatePyramid(gr, 'rLevel=5, resampling=NN');
        UPDATE georaster_table SET georaster = gr WHERE georid = 7;
         COMMIT;
      END;
      /
      
    6. オプションで、SDO_GEOR_UTL.disableReportを使用して監視を無効化します。このプロシージャがコールされない場合、監視はユーザー・セッションの終了時に自動的に停止します。

      EXECUTE SDO_GEOR_UTL.disableReport;
      
  3. 同じユーザーの別のセッションから、実行ステータス・レポートを取得します。

    クライアントIDおよび順序IDによって識別される特定の操作の進行状況を取得するには、SDO_GEOR_UTL.getProgressファンクションを使用します。このファンクションは、完了の割合を反映した0から1の間の数値として進行状況を戻します。たとえば、次の問合せは、操作が55%完了したことを示しています。

    SELECT sdo_geor_utl.getProgress(100, 2) progress FROM DUAL;
     
    PROGRESS
    --------
        0.55
     
    1 row selected.
    

    クライアントIDおよび順序IDによって識別される特定の操作のステータス・レポートを取得するには、SDO_GEOR_UTL.getStatusReportファンクションを使用します。このファンクションは、操作の進行状況とその他の情報を記述した文字列の配列を戻します。次に例を示します。

    -- Check the status of the generatePyramid on georid=6
    SELECT sdo_geor_utl.getStatusReport(100, 1) FROM DUAL;
    SDO_GEOR_UTL.GETSTATUSREPORT(100,1)
    -----------------------------------------------------------------------------
    SDO_STRING2_ARRAY('31-OCT-11 02.20.04.854558 PM', 'GeneratePyramid', 'RDT:RDT_1', 'RID:6', '100% complete', 'operation completed')
     
    1 row selected.
    
    -- Check the status of the generatePyramid on georid=7
    SELECT sdo_geor_utl.getStatusReport(100, 2) FROM DUAL;
     
    SDO_GEOR_UTL.GETSTATUSREPORT(100,2)
    -----------------------------------------------------------------------------
    SDO_STRING2_ARRAY('31-OCT-11 02.20.08.854558 PM', 'GeneratePyramid', 'RDT:RDT_1', 'RID:7', '55% complete', 'operation completed')
     
    1 row selected.
    

    監視対象のすべての操作のステータスを取得するには、次の文を入力します。

    SELECT * from the (select sdo_geor_utl.getAllStatusReport() FROM DUAL); 
    COLUMN_VALUE
    ------------------------------------------------------------------------------
    SDO_STRING2_ARRAY('Client:100', 'Sequence:1', '31-OCT-11 02.20.04.854558 PM', 'GeneratePyramid', 'RDT:RDT_1', 'RID:6', '100% complete', 'operation completed')
    SDO_STRING2_ARRAY('Client:100', 'Sequence:2', '31-OCT-11 02.20.08.854558 PM', 'GeneratePyramid', 'RDT:RDT_1', 'RID:7', '55% complete', NULL)
     
    2 rows selected.
    

レポート表を消去または削除する必要がある場合、それぞれSDO_GEOR_UTL.clearReportTableまたはSDO_GEOR_UTL.dropReportTableプロシージャを使用します。

EXECUTE SDO_GEOR_UTL.clearReportTable;
-- or:
EXECUTE SDO_GEOR_UTL.dropReportTable;

4.10 GeoRasterオブジェクトの圧縮と解凍

JPEG-F、DEFLATEまたはJPEG 2000圧縮を使用してGeoRasterオブジェクトを圧縮することによって、GeoRasterオブジェクトに必要な記憶域を縮小できます。圧縮されたGeoRasterオブジェクトは解凍できます。ただし圧縮されていない(解凍されている)GeoRasterオブジェクト上で実行できるすべてのGeoRaster操作は、圧縮されたGeoRasterオブジェクトで実行できるため、解凍はすべてのGeoRaster操作で必須ではありません。

JPEG-FおよびDEFLATEの場合、GeoRasterオブジェクトを圧縮または解凍するには、SDO_GEOR.changeFormatCopyプロシージャや、別のGeoRasterオブジェクトを作成するためにGeoRasterオブジェクトをロードして処理するその他の多数のプロシージャ(SDO_GEOR.importFromSDO_GEOR.mosaicSDO_GEOR.scaleCopySDO_GEOR.subset、ラスター代数(SDO_GEOR_RA)プロシージャ、SDO_GEOR_AGGR.mosaicSubsetなど)のstorageParamパラメータで、compressionキーワードを使用します。(JPEG-FおよびDEFLATE圧縮の場合、GeoRasterオブジェクトを圧縮および解凍するための個別のプロシージャはありません。)

JPEG 2000の場合、SDO_GEOR.compressJP2およびSDO_GEOR.decompressJP2プロシージャを使用して、GeoRastrerオブジェクトを圧縮および解凍します。ほとんどの他のプロシージャおよびファンクション(SDO_GEOR.changeCellValueSDO_GEOR.reprojectsdo_geor.scaleScopyおよびsdo_geor.mosaicを除く)は、操作の実行中にJP2圧縮したGeoRasterオブジェクトを内部的に解凍できます。

GeoRasterの圧縮および解凍の詳細は、「圧縮と解凍」を参照してください(サード・パーティの圧縮ソリューションのサポート情報は、「圧縮に使用するサード・パーティのプラグイン」を参照)。

また、GeoRasterオブジェクトにJPEG-FまたはDEFLATE圧縮を使用する場合、いくつかの特別な使用上の考慮事項があります。

  • 大きいGeoRasterオブジェクトを圧縮してそれに対して完全なピラミッドを作成する場合、最初に圧縮されていないGeoRasterオブジェクトに対してピラミッドを生成し、次に圧縮を適用した方が高速です。

  • 大規模なモザイク処理の場合、最初に圧縮を適用せずにモザイク処理を行い、次にピラミッドを生成してから圧縮を適用した方が高速です。

  • 一部の操作では、GeoRasterは一時表領域を使用してデータの圧縮と解凍を行うため、GeoRasterユーザーに一時表領域を追加することは、パフォーマンスのために必須です(「GeoRasterユーザーに対する一時表領域の追加」を参照)。

JPEGおよびDEFLATEのパラレル圧縮と解凍は、再フォーマットが不要な場合、parallelキーワード(storageParamパラメータ内)を使用して、SDO_GEOR.changeFormatCopyプロシージャでサポートされます。また、SDO_GEOR_AGGR.mosaicSubsetプロシージャをコールできます。これにより、パラレル化した圧縮または解凍を実行中にラスター形式を変更する場合にパフォーマンスが向上します。パラレル圧縮および解凍には、パフォーマンスの大幅な向上という効果があり、これはイメージが大きいときに特に役立ちます。「パラレル圧縮、コピーおよびサブセット化」例6-23を参照してください

圧縮済のGeoRasterオブジェクトを保存する場合は、ユーザー用の一時表領域を必ず作成してください。詳細は、「GeoRasterユーザーに対する一時表領域の追加」を参照してください。

4.11 GeoRasterオブジェクトの削除およびGeoRaster表とRDTのアクションの実行

GeoRasterでは、GeoRasterメタデータと、GeoRaster表とラスター・データ表(RDT)間の関係が自動的に維持されます。したがって、ほとんどの操作で、関連する従来のSQL文を使用できます。

  • GeoRasterオブジェクトを削除するには、DELETE文を使用してオブジェクトを含む行を削除します(DELETE FROM geor_table WHERE ...;など)。

    GeoRasterオブジェクトがGeoRaster表から削除されると、RDTに格納されているすべての関連ラスター・データも自動的に削除されます。ラスター・データ表の行を直接挿入または削除しないでください。

  • GeoRaster表を削除するには、DROP文を使用します(DROP geor_table;など)。

    GeoRaster表が削除されると、削除されたGeoRaster表のGeoRasterオブジェクトに関連付けられているすべてのラスター・データも自動的に削除されます。

  • GeoRaster表名を変更するには、RENAME文(RENAME geor_table1 TO geor_table2;など)を使用します。

  • 表にGeoRaster列を追加するには、ALTER TABLE文を使用します。

    ただし、ALTER TABLE文を使用して1つ以上のGeoRaster列を追加する場合は、SDO_GEOR_UTL.createDMLTriggerプロシージャをコールして、追加された各GeoRaster列にDMLトリガーを作成する必要があります。次に例を示します。

    ALTER TABLE geor_table ADD (image SDO_GEORASTER);  
    CALL sdo_geor_utl.createdmltrigger('GEOR_TABLE','IMAGE');)
    
  • 表のGeoRaster列を削除するには、ALTER TABLE文(ALTER TABLE geor_table DROP COLUMN image;など)を使用します。

    注意: GeoRaster列を削除すると、その列のすべてのGeoRasterオブジェクトが削除されます。

  • RDTを削除するには、最初にそのRDTを参照しているすべてのGeoRasterオブジェクトを削除する必要があり、その後でRDTに対してDROP文を使用できます。

    RDTの削除を試行する前に、RDTを参照しているすべてのGeoRasterオブジェクトを削除しないと、例外が発生します。

  • RDTの名前を変更するにはSDO_GEOR_UTL.renameRDTプロシージャを使用します。

4.12 クロススキーマ操作の実行

すべてのGeoRaster操作は、現行の接続スキーマ以外のスキーマに定義されているGeoRasterオブジェクトに対して機能できます。つまり、GeoRasterは、クロススキーマのアクセス、更新および処理を完全にサポートします。

詳細は、「GeoRasterにおけるクロススキーマのサポート」を参照してください。

例4-2 クロススキーマ・コピー操作

次の例では、USER2は、USER1からイメージのコピーを作成し、USER2スキーマに格納します。USER1がGEORASTER_TABLE表を所有し、USER2がG_TABLE表を所有していると仮定します。

--connect to user1 and grant permissons to user2
--assume user1 stores the image in georaster_table and the image’s RDT table is rdt_1 
conn user1/pswd1
 grant select on georaster_table to user2;
grant select on rdt_1 to user2;

--connect to user2 and make a copy of a georaster from user1
conn user2/pswd2
SQL> DECLARE
   gr1 sdo_georaster;
   gr2 sdo_georaster;
BEGIN
   --select the image from georaster_table in user1
   select georaster into gr1 from user1.georaster_table where georid = 100;
   -- the copy is to be stored in g_table in user2, assuming the georaster object is already initiated
   select geor into gr2 from g_table where id = 1 for update;
   sdo_geor.changeFormatCopy(gr1, 'blocking=OPTIMALPADDING blocksize=(512,512,3) interleaving=BIP', gr2);
   update g_table set geor=gr2 where id=1;
   commit;
END;
/ 

例4-3 クロススキーマ・ラスター代数およびコピー操作

次の例では、USER2は、USER1スキーマのイメージのラスター代数操作を実行し、USER1に結果を格納します。USER1がGEORASTER_TABLEおよびG_TABLE表の両方を所有していると仮定します。既存のイメージはGEORASTER_TABLEに存在し、イメージのラスター・データ表はRDT_1です。結果のイメージはG_TABLEに格納され、そのラスター・データ表はRDT_2です。

--connect to user1 and grant permissons to user2
conn user1/pswd1
grant select on georaster_table to user2;
grant select on rdt_1 to user2;
grant select, update, insert, delete on g_table to user2;
grant select, update, insert, delete on rdt_2 to user2;

--connect to user2 and run a raster algebra operation on an image in user1 
conn user2/pswd2
DECLARE
   gr1 sdo_georaster;
   gr2 sdo_georaster;
BEGIN
   --select the image from georaster_table in user1
   select georaster into gr1 from user1.georaster_table where georid = 100;
   -- the result is to be stored in g_table in user1, assuming the georaster object is already initiated
   select geor into gr2 from user1.g_table where id = 1 for update;
   sdo_geor_ra.rasterMathOp(gr1,sdo_string2_array('{0}','{1}','{2}'), 'blocking=OPTIMALPADDING blocksize=(512,512,3) interleaving=BIP',gr2);
   update user1.g_table set geor=gr2 where id=1;
   commit;
END;
/

4.13 パフォーマンスを向上するためのメモリーの管理

GeoRasterには、ラスター(LOB)データの読取りおよび書込みを行うための独自のバッファ・システムがあります。このシステムは、Oracle Databaseバッファ・システムと別個になります。次の表に、GeoRasterオブジェクトのすべてのI/O操作に使用するGeoRasterバッファ・システムを構成するために使用できるパラメータを示します。

表4-1 GeoRasterバッファリング・パラメータ

パラメータ名 説明 デフォルト値
MemMaxSize 各GeoRasterオブジェクトのGeoRasterバッファリングに使用できるメモリーの上限サイズ。 17MB
MemReadBlockSize ラスター・データをキャッシュするための読取り操作の内部データ・ブロック・サイズ。 32KB
MemWriteBlockSize ラスター・データをキャッシュするための読取り/書込み操作の内部データ・ブロック・サイズ。 64KB

次のPL/SQLサブプログラムを使用して、これらのパラメータの値を取得および設定できます。

パラメータがPL/SQLを使用して設定されるため、値はデータベース・セッションの期間中に定義されます。後続のセッションで、パラメータにデフォルト以外の値を使用する場合、適切なプロシージャを使用して設定する必要があります。

通常は、パラメータに大きい値を使用すると、GeoRaster I/O操作のパフォーマンスが向上します。特定の考慮事項およびガイドラインは次のとおりです。

  • 追加のメモリーを割り当てると(MemMaxSizeを増やす)、ディスク・アクセスが減少します。理想として、十分に大きいメモリーを割り当ててGeoRasterオブジェクト全体を保持すると、パフォーマンスが大幅に向上します。ただし、Oracle Databaseでは複数のユーザーおよび同時アクセスが可能であるため、そのような環境でのバランスの取れたメモリーの割当てを行う必要があります。

  • 読取りブロック・サイズを増やすと(MemReadBlockSizeを増やす)、OCI LOB読取り操作の数が減少するため、パフォーマンスが向上します。ただし、操作におけるソースおよびターゲットGeoRasterオブジェクト間の異なるインターリーブのために、MemReadBlockSize値でGeoRasterオブジェクト全体を保持できない場合、読取りブロック・サイズが大きすぎて頻繁な読取りブロック・ページインおよびページアウト操作が発生するため、パフォーマンスが低下します。
  • ほとんどすべてのGeoRaster操作は書込み駆動型です。そのため、書込みブロック・サイズを増やすと(MemWriteBlockSizeを増やす)、OCI LOB書込み操作の数が減少し、パフォーマンスが向上します。

4.14 コミット前のGeoRasterオブジェクトの更新

GeoRasterのセル・データまたはメタデータを挿入、更新、再フォーマット、圧縮、解凍または削除するデータベース・トランザクションをコミットする前に、SQL UPDATE文を使用してGeoRasterオブジェクトを更新する必要があります。セル・データの変更後にGeoRasterオブジェクトを更新しないと、無効なGeoRasterオブジェクト、ダングリング・ラスター・データ、および一貫性のないメタデータの1つ以上が発生する可能性があります。GeoRasterメタデータの変更後にGeoRasterオブジェクトを更新しないと、メタデータの変更は反映されません。

トランザクションをコミットしないでロールバックする場合は、UPDATE文は必要ありません。

例4-4では、UPDATE文はSDO_GEOR.changeFormatCopyプロシージャのコールの後およびCOMMIT文の前に必要です。

例4-4 コミット前のGeoRasterオブジェクトの更新

DECLARE
    gr1 sdo_georaster;
    gr2 sdo_georaster;
BEGIN
    SELECT georaster INTO gr2 from georaster_table WHERE georid=11 FOR UPDATE;
    SELECT georaster INTO gr1 from georaster_table WHERE georid=1;
    sdo_geor.changeFormatCopy(gr1, 'blocksize=(2048,2048)', gr2);
    UPDATE georaster_table SET georaster=gr2 WHERE georid=11;
    COMMIT;
END;
/

4.15 ループのGeoRasterオブジェクトの更新

複数のGeoRasterオブジェクトを更新する場合、通常カーソルが使用されます。ただし、ループのGeoRaster操作がパラレル化可能であるか、各UPDATE文の実行後にCOMMIT文が実行される場合、カーソルのSQL問合せには、ループ内のコミットでFOR UPDATE句を使用したカーソルが無効になるため、FOR UPDATE句を使用できません。

例4-5 パラレル処理を有効化したループのGeoRasterオブジェクトの更新

次の例では、ピラミッドが表のすべてのGeoRasterオブジェクトに生成されました。各更新の実行後に明示的なコミットが実行され、SDO_GEOR.generatePyramidプロシージャのパラレル処理が有効化されます(parallel=4)。FOR UPDATE句を使用したGeoRasterオブジェクトの問合せは、カーソル問合せ文ではなくループ内で実行されます。

DECLARE
    gr1 sdo_georaster;
BEGIN
    FOR rec in (SELECT georid FROM georaster_table ORDER BY georid) LOOP
      SELECT georaster INTO gr1 FROM georaster_table WHERE georid=rec.georid FOR UPDATE;
      sdo_geor.generatePyramid(gr1, 'rlevel=5, resampling=bilinear', null, 'parallel=4');
      UPDATE georaster_table SET georaster=gr1 WHERE georid=rec.georid;
      COMMIT;
    END LOOP;
 END;
/

例4-6 パラレル処理を有効化しないループのGeoRasterオブジェクトの更新

ループのGeoRaster操作が(この例で示されているように)パラレル化可能でない場合、各更新の実行後にCOMMITを実行するかわりに、FOR UPDATE句を使用したカーソルの無効化を回避するため、カーソル・ループの外部でCOMMIT文を実行できます。例ではNODATAを表のすべてのGeoRasterオブジェクトに追加することにも注意してください。

BEGIN
FOR rec in (SELECT georid, georaster FROM georaster_table FOR UPDATE)
    LOOP
      sdo_geor.addNODATA(rec.georaster, 0, 0);
      UPDATE georaster_table SET georaster=rec.georaster 
        WHERE georid=rec.georid;
END LOOP;
COMMIT;
 END;
/

4.16 テンプレート関連のサブプログラムを使用したGeoRasterアプリケーションの開発

SDO_GEOR.createTemplateおよびSDO_GEOR.getRasterBlockLocatorサブプログラムを使用すると、Oracle XMLType、GeoRaster XMLスキーマおよびOracle BLOBを直接操作せずにGeoRasterメタデータとバイナリ・ラスター・データの読取りおよび書込みを行うことで、GeoRasterアプリケーション(GeoRasterオブジェクトを処理するETLツールやイメージ処理システムなど)を開発できます。

新しいGeoRasterオブジェクトを作成(「新しいGeoRasterオブジェクトの作成」を参照)すると、SDO_GEOR.createTemplateファンクションを使用して、ラスター型、次元サイズ、ULTCoordinate、セル深度、インターリーブ・タイプ、ブロック化とブロック・サイズ、ピラミッド・リサンプリング・メソッドと縮小レベル、圧縮方法と圧縮品質などの基本情報をGeoRasterオブジェクトのメタデータに移入できます。このファンクションでは、オプションで、正しい行数および空のBLOBを含むラスター・ブロックで構成される行データをラスター・データ表に移入できます。

SDO_GEOR.createTemplateファンクションにより生成されるXMLメタデータは、GeoRasterメタデータのスキーマに準拠します。そのため、他のGeoRasterサブプログラムを使用してメタデータの問合せや更新を行うことができます(「GeoRasterメタデータの問合せおよび更新」を参照)。

SDO_GEOR.getRasterBlockLocatorプロシージャを使用すると、ピラミッド・レベルとブロック番号を指定することでラスター・ブロックのロケータを取得できます。ラスター・ブロックのロケータを取得したら、OCIまたはJava JDBC LOBインタフェースを使用してバイナリ・ラスター・データの読取りおよび書込みを行うことができます。(SDO_GEOR.getRasterBlockLocatorプロシージャは、それ自体ではLOBデータの読取りや処理を行いません。)この方法を使用するには、ラスター・データの物理記憶域(「GeoRasterの物理記憶域」を参照)を理解しておく必要があり、BLOBの読取りおよび書込みの前に必要に応じてデータの圧縮と解凍を行う必要があります。