6.18 仮想モザイク

仮想モザイクでは、1つの大規模な仮想化されたモザイク・イメージとして一連のGeoRasterイメージが扱われます。

一部のアプリケーションでは、イメージのコレクションをモザイク処理して1つの物理モザイクにする必要はないか、推奨されません。たとえば、モザイクを個別に格納する十分なディスク領域がない場合や、単にディスク領域を節約する場合です。別の例としては、同じデータ・セットの同一の2つのコピーを維持せずに、元のデータ・セット(DEMデータ・セットなど)を現状のまま格納するが、このデータ・セットに対してシームレスに問合せを実行する場合があげられます。また別の例としては、ソース・イメージをモザイク処理するときに、同じ領域に異なる処理ルールとモザイク処理ルールを適用する場合があげられます(物理モザイクにはこのような柔軟性はありません)。

このような場合、GeoRasterイメージのセットを1つの大きいGeoRasterイメージにモザイク処理してそれをGeoRaster表に格納するかわりに、仮想モザイクを作成できます。仮想モザイクでは、GeoRasterイメージのセットは、GeoRaster表には格納されず、1つの大規模な仮想化されたモザイク・イメージとして扱われます。

GeoRasterでは、仮想モザイクは、1つのGeoRasterオブジェクトの場合と同様に扱われる1つ以上のGeoRaster表またはビューに基づく、幾何補正の有無を問わない地理参照されたGeoRasterオブジェクトの大規模コレクションとして定義されます。仮想モザイクのピラミッドはサポートされます。仮想モザイクには、無制限の数のイメージを含むことが可能で、GeoRasterデータベース全体を仮想モザイクとして扱うことができます。対象領域(サブセット化またはクロッピング)に基づいて仮想モザイクを問い合せる1つのコールを発行し、クロッピングされたイメージが異なる解像度を持つ異なる座標系に配置されるようにリクエストできます。問合せプロセス中に、ユーザー・リクエストに基づいて、共通ポイント・ルールを使用したリサンプリングおよびモザイク処理のオンザフライ変換が内部的および自動的に実行されます。

仮想モザイクを定義する方法は次のとおりです。

仮想モザイクの定義方法にかかわらず、GeoRaster表のGeoRasterオブジェクトには生成または設定されたspatialExtent属性が含まれる必要があり、そうでない場合、SDO_GEOR_AGGR.getMosaicSubsetおよびSDO_GEOR_AGGR.mosaicSubsetプロシージャによって空のLOBロケータまたは空のGeoRasterオブジェクトが戻されます。一般的な使用方法で最高の問合せパフォーマンスを実現するため、あらかじめ常にspatialExtent属性に対して空間索引を作成する必要があります。

仮想モザイクを定義した後、次のプロシージャを使用してそれを問い合せるか、処理できます。

  • SDO_GEOR_AGGR.getMosaicSubsetは、仮想モザイクに対してオンザフライ問合せを実行します。

    仮想化されたモザイク・イメージの任意の部分の空間問合せで、SDO_GEOR_AGGR.getMosaicSubsetプロシージャは、問合せ対象領域に対して動的にモザイク操作を実行し、物理的に格納されたモザイク・イメージをサブセット化する場合と同様に、必要な結果をBLOBでオンザフライで戻します。

  • SDO_GEOR_AGGR.mosaicSubsetは、モザイク処理されたサブセットをGeoRasterオブジェクトとしてデータベースに格納します。

    SDO_GEOR_AGGR.mosaicSubsetプロシージャは、問合せ対象領域に対してモザイク操作を実行し、必要な結果を別のGeoRasterオブジェクトに永続的に格納します。

仮想モザイクを使用する場合の典型的なワークフローは、「アプリケーションでの仮想モザイクの使用」「大規模な仮想モザイクに関する特別な考慮事項」および関連トピック「MIN_X_RES$およびMAX_X_RES$を使用した問合せパフォーマンスの向上」を参照してください。

6.18.1 GeoRaster表のいずれか1つまたはリストとしての仮想モザイク

仮想モザイクは、1つのGeoRaster表として、またはGeoRaster表のリストとして定義できます。アプリケーションでは、各表とそのGeoRaster列を指定します。このアプローチでは、それらのGeoRaster表に含まれる指定されたGeoRaster列のすべてのGeoRasterオブジェクトが、仮想モザイクの一部となります。

例6-25では、GeoRaster表のリスト(GRTAB1、GRTAB2およびGRTAB3で、これらは「大規模イメージのモザイク処理」のGRTABと同じ定義を持ちます)で仮想モザイク処理のためのソース・イメージを指定します。

例6-25 GeoRaster表のリストとしての仮想モザイク

DECLARE
  lb blob;
  cropArea sdo_geometry;
  outArea  sdo_geometry := null;
  outWin   sdo_number_array:=null;
  resolutions sdo_number_array;
BEGIN
    dbms_lob.createTemporary(lb, TRUE);
 
     cropArea :=  sdo_geometry(2003, 32610, null,                 
                    sdo_elem_info_array(1, 1003, 3), 
                    sdo_ordinate_array(399180, 4247820, 
                                       496140,4353900) );
      resolutions := sdo_number_array(30, 30);
     sdo_geor_aggr.getMosaicSubset('grtab1, grtab2, grtab3', 
                 'grobj, grobj, grobj', 
                 0, 32610, null, null, cropArea,
                 null, null, null, resolutions, null, 
                 'commonPointRule = end, nodata=true', 
                 lb, outArea, outWin);
    dbms_lob.freeTemporary(lb);
    if outWin is not null then
        dbms_output.put_line('output window: (' || outWin(1) || ',' || outWin(2) ||', ' || outWin(3) || ', ' || outWin(4) || ')');
    end if;
END;
/

6.18.2 GeoRaster列を含むビューとしての仮想モザイク

仮想モザイクは、GeoRaster列を含む1つのデータベース・ビューとして定義できます。アプリケーションでは、ビュー名とそのGeoRaster列を指定します。このアプローチでは、ビューに含まれる指定されたGeoRaster列のすべてのGeoRasterオブジェクトが、仮想モザイクの一部となります。このアプローチでは、空間索引や他の任意の関連索引を使用して、任意の数のGeoRaster表から複雑な方法で仮想モザイクのイメージを選択できます。

仮想モザイクは、GeoRasterビューとGeoRaster表を組み合せたリストとして定義することも可能です。

仮想モザイクをデータベース・ビューとして定義する場合、そのビューは問合せ時にgeorasterTableNamesパラメータで指定できます。例6-26では、ビューとして定義された仮想モザイクを問い合せます。この例では、問合せによって、イメージが作成時刻に基づいてソートされ、重複する領域での結果となるモザイクに対して最新のイメージが選択されることに注意してください。

例6-26 仮想モザイクのためのGeoRaster表に対するビューの使用

Create or replace view grview as select * from (
       Select grobj, last_update from grtab1 where cloud_cover=0 union all
       Select grobj, last_update from grtab2 where cloud_cover=0 union all
       Select grobj, last_update from grtab3 ) order by last_update;

DECLARE
  lb blob;
  cropArea sdo_geometry;
  outArea  sdo_geometry := null;
  outWin   sdo_number_array:=null;
  resolutions sdo_number_array;
BEGIN
    dbms_lob.createTemporary(lb, TRUE);
 
     cropArea :=  sdo_geometry(2003, 32610, null,                 
                    sdo_elem_info_array(1, 1003, 3), 
                    sdo_ordinate_array(399180, 4247820, 
                                       496140,4353900) );
      resolutions := sdo_number_array(30, 30);
     sdo_geor_aggr.getMosaicSubset('grview', 'grobj', 
                 0, 32610, null, null, cropArea,
                 null, null, null, resolutions, null, 
                 'commonPointRule = end, nodata=true', 
                 lb, outArea, outWin);
    dbms_lob.freeTemporary(lb);
    if outWin is not null then
        dbms_output.put_line('output window: (' || outWin(1) || ',' || outWin(2) ||', ' || outWin(3) || ', ' || outWin(4) || ')');
    end if;
END;
/

6.18.3 SQL問合せ文またはカーソルとしての仮想モザイク

ビューを作成するかわりに、データベースからGeoRasterオブジェクトのコレクションを選択するSQL文または実行時データベース・カーソルとして仮想モザイクを定義できます。アプリケーションでは、SQL文からカーソルを作成して、そのカーソルを仮想モザイクとして使用します。この定義では、カーソルのすべてのGeoRasterオブジェクトが仮想モザイクの一部となります。このアプローチでは、任意の数のGeoRaster表から複雑な方法で仮想モザイクのイメージを選択できます。ただし、空間索引は、このタイプの仮想モザイクに対する問合せで自動的に使用されません。空間索引を利用するには、SQL文に対する問合せウィンドウを直接使用して動的に空間問合せ条件を追加し、その問合せウィンドウのすべてのイメージをより迅速に特定できるようにします。

SDO_GEOR_AGGR.getMosaicSubsetおよびSDO_GEOR_AGGR.mosaicSubsetプロシージャは、仮想モザイクとしてGeoRasterオブジェクトのカーソルを取得します(例6-27を参照)。この例では、問合せによって、イメージが作成時刻に基づいてソートされ、重複する領域での結果となるモザイクに対して最新のイメージが選択されることに注意してください。表に多くのGeoRasterオブジェクトが存在する場合に最高のパフォーマンスを実現するため、カーソルの問合せでは、空間問合せウィンドウを使用して、前述の段落に記載されている無関係のGeoRasterオブジェクトを除外する必要があります。

例6-27 仮想モザイクのためのカーソルの使用

DECLARE
  lb blob;
  outArea  sdo_geometry := null;
  outWin   sdo_number_array:=null;
  resolutions sdo_number_array;
  mosaic_stmt  varchar2(1000);
  condition        varchar2(1000);
BEGIN
    dbms_lob.createTemporary(lb, TRUE);
 
    resolutions := sdo_number_array(30, 30);
 
   -- Define the query window (cropArea)
   cropArea := sdo_geometry(2003, 32610, null, 
                           sdo_elem_info_array(1, 1003, 3), 
                           sdo_ordinate_array(399180, 4247820, 496140,4353900) );
 
    -- Define the virtual mosaic
    mosaic_stmt := 'select grobj from (select grobj, last_update from grtab1 ' ||
                   'where cloud_cover=0  union all select grobj, last_update from grtab2 ' ||
                   'where cloud_cover=0) t ';
 
   -- Apply filtering using the query window (cropArea) to speed up query performance
    condition := 'where sdo_anyinteract(t.grobj.spatialExtent,:1) = ''true'' ' ||
                 ' order by last_update'; 
 
   -- Open the virtual mosaic for query
    open cur for mosaic_stmt || condition using cropArea;
 
   -- Query the virtual mosaic (make sure the cropArea used here is the same
   -- as the one used at opening the cursor)
    sdo_geor_aggr.getMosaicSubset(cur, 
                 0, 32610, null, null, cropArea,
                 null, null, null, resolutions, null, 
                 'commonPointRule=end, nodata=true', 
                 lb, outArea, outWin);
    dbms_lob.freeTemporary(lb);
    close cur;
    if outWin is not null then
        dbms_output.put_line('output window: (' || outWin(1) || ',' || outWin(2) ||', ' || outWin(3) || ', ' || outWin(4) || ')');
    end if;
END;
/

6.18.4 アプリケーションでの仮想モザイクの使用

仮想モザイクは、イメージ提供エンジンとして、他の様々なアプリケーション・シナリオで使用できます。仮想モザイクの定義は、文字列または他の形式として個別にアプリケーションによって格納できます。主な問合せプロシージャのSDO_GEOR_AGGR.getMosaicSubsetおよびSDO_GEOR_AGGR.mosaicSubset以外に、GeoRasterでは、SDO_GEOR_AGGRパッケージでアプリケーション開発に役立つ他のサブプログラムを提供しています。

SDO_GEOR_AGGR.validateForMosaicSubsetSDO_GEOR_AGGR.getMosaicExtentおよびSDO_GEOR_AGGR.getMosaicResolutionsをアプリケーションでコールして、仮想モザイクが有効であり、空間問合せが仮想モザイク内に含まれることを確認できます。次のステップでは、アプリケーションの仮想モザイクで使用可能なワークフローについて説明します。

  1. 仮想モザイクを定義します。たとえば:
    Create or replace view grview as select * from (
    Select grobj, last_update from grtab1 where cloud_cover=0 union all
    Select grobj, last_update from grtab2 where cloud_cover=0 union all
    Select grobj, last_update from grtab3 ) order by last_update;
    

    表GRTAB1、GRTAB2およびGRTAB3は、「大規模イメージのモザイク処理」のGRTABと同じ定義を使用して作成され、これらの表で、GeoRasterオブジェクトのspatialExtent属性に対してOracle Spatialの空間索引が作成されています。

  2. 仮想モザイクのデータ・セットを検証します。たとえば:
    EXECUTE SDO_GEOR_AGGR.validateForMosaicSubset('grview', 'grobj', OUTSRID, OUTResolutions);
    

    詳細な検証情報が必要な場合、検証エラー表を作成してコールに渡すことができます。詳細は、SDO_GEOR_AGGR.validateForMosaicSubsetのリファレンスの項を参照してください。

  3. 仮想モザイクの空間エクステントを取得します。たとえば:
    SELECT SDO_GEOR_AGGR.getMosaicExtent('grview', 'grobj', OUTSRID) from dual;
    
  4. 既存のソース・イメージの解像度の範囲を取得します。たとえば:
    SELECT SDO_GEOR_AGGR.getMosaicResolutions('grview', 'grobj', 'unit=meter') from dual;
    

    解像度の範囲は、すべてのピラミッド・レベルを含むソース・イメージの最小および最大の解像度を反映しています。

  5. 前述の2つのステップで取得された情報に基づいて、アプリケーション・リクエストに応じて空間問合せウィンドウのcropAreaおよびOUTResolutionsを渡し、仮想モザイクのサブセットを取得して、オプションで異なるリサンプリング・メソッド、異なる共通ポイント・ルール、空間NODATA処理およびカラー・バランスを適用します。たとえば:
    SDO_GEOR_AGGR.getMosaicSubset('grview', 'grobj', null, OUTSRID, null, null,
      cropArea, null, null, null, OUTResolutions, null, 
      'commonPointRule=end, nodata=true', lb, outArea, outWin);
    

    OUTResolutionsはソース・イメージの解像度の範囲内に含まれる必要があることに注意してください。OUTResolutionsが、指定したピラミッド・レベルのソース・イメージの解像度と同じである場合、ピラミッド・データは出力モザイクで使用されますが、それ以外の場合、ソース・イメージはターゲットの解像度にスケール変更されます。

    通常のアプリケーションは、このステップを繰り返し適用し、イメージ表示やイメージ配布などの目的で同じ仮想モザイクに対して異なる対象領域を問い合せます。

6.18.5 大規模な仮想モザイクに関する特別な考慮事項

仮想モザイクには、数個のイメージを含めることができますが、何万または何千万ものイメージを含めることも可能です。SDO_GEOR_AGGR.getMosaicSubsetSDO_GEOR_AGGR.mosaicSubsetの両方で、cropAreaに接するかまたはその内部にあるすべてのイメージの仮想モザイクを(ネイティブ空間索引を使用して)自動的に検索し、それらのイメージおよびピラミッドの解像度を確認できます。cropAreaに接するかまたはその内部にあり、リクエストされた解像度に近い解像度を持つそれらのイメージまたは適切なピラミッド・レベルが、モザイク処理プロセスで使用されます。つまり、ソース・イメージとそのピラミッドの構成は、結果の品質と問合せパフォーマンス全体にとって非常に重要になります。

ガイドラインは、リクエストされた解像度のリクエストされたクロッピング領域に含まれる異なるソース・イメージまたはそのピラミッドから、小さいイメージをあまり多く取得しないようにすることです。

限られた数のみのイメージを含む小さい仮想モザイクでは、ソース・イメージごとに完全なピラミッドが生成され、ほとんどのアプリケーションで良好な問合せパフォーマンスが実現します。

多数のイメージ(数百を超えるイメージ)を含む大規模な領域では、アプリケーションによって、ソース・イメージごとに一定数のピラミッド・レベルのみを生成し、それらの最上位のピラミッドを新しいGeoRasterオブジェクトにモザイク処理して、それらのモザイクのピラミッドを生成できます。大規模なWebビジュアライゼーション・プロジェクトの場合、ソース解像度のすべてのイメージと、より低い解像度レベルのすべてのイメージは、それらに対して構築されたピラミッドなしでGeoRasterオブジェクトとして格納される可能性があります。

これらの場合(多数のイメージや大規模Web視覚化)、各ソース・イメージが小さく、仮想モザイク内に多くの解像度レベルが存在すると、低い解像度レベルに対する問合せには、高い解像度レベルの多くの不要なイメージに対するメタデータ解像度の問合せが含まれるため、問合せが遅くなります。パフォーマンスを向上するには、アプリケーションで多くの仮想モザイクを定義し、そのそれぞれに特定の解像度または数個の解像度レベルのイメージのみをすべて含めます。次に、アプリケーションで、最初のステップとしてリクエストされた解像度に基づいて1つ以上の適切な仮想モザイクを検出し、選択したそれらの仮想モザイクにのみ空間問合せを実行します。このアプローチによって、パフォーマンスが大幅に向上する可能性があります。

前述の考慮事項に加え、同じ領域に対して多くの異なる解像度レベルが含まれる問合せの詳細は、「MIN_X_RES$およびMAX_X_RES$を使用した問合せパフォーマンスの向上」を参照してください。

6.18.5.1 MIN_X_RES$およびMAX_X_RES$を使用した問合せパフォーマンスの向上

同じ領域に多くの異なる解像度レベルが含まれる場合に(複数の仮想モザイクを定義すること以外で)仮想モザイクの問合せを高速化するより一般的なソリューションは、GeoRaster表またはビューの解像度範囲の列(MIN_X_RES$ and MAX_X_RES$)を使用することです。仮想モザイクのGeoRaster表でこれらの列(NUMBERデータ型)を定義して、ソースGeoRasterオブジェクトの最小および最大の空間解像度の値をそれぞれ指定する必要があります。これらの列を追加して適切な解像度データを移入したら、SDO_GEOR_AGGR.getMosaicSubsetプロシージャによって、これらの列に格納されている解像度の範囲を使用して(georasterTableNamesパラメータ付きの形式を使用している場合)、outResolutionsパラメータで指定されているリクエストされた解像度ではないソースGeoRasterオブジェクトを除外します。これによって、cropAreaの各GeoRasterオブジェクトのメタデータの解析が回避されるため、パフォーマンスが大幅に向上します。

このアプローチを使用するには、次のステップを実行します。

  1. 列MIN_X_RES$およびMAX_X_RES$をGeoRaster表に追加します。たとえば:
    ALTER TABLE georaster_table ADD (MIN_X_RES$ number, MAX_X_RES$ number);
    
  2. MIN_X_RES$列に移入します。たとえば:
    UPDATE georaster_table t 
      SET min_x_res$ = (select column_value from the
        (select sdo_geor.generateSpatialResolutions(t.georaster, null,
        t.georaster.spatialextent.sdo_srid) from dual)
      WHERE rownum=1);
  3. MAX_X_RES$列に移入します。たとえば:
    UPDATE georaster_table t 
      max_x_res$ = min_x_res$ * power(2, sdo_geor.getPyramidMaxLevel(t.georaster));
    
  4. オプションとして、表に多数のソース・イメージが含まれている場合は、解像度範囲の列に索引を作成します。
    CREATE INDEX georaster_table_res_idx ON georaster_table(MIN_X_RES$, MAX_X_RES$);

仮想モザイクをビューとして定義する場合、ビューにも2つの列を含める必要があります。たとえば、例6-26のビュー定義は、次のように変更する必要があります。

Create or replace view grview as select * from ( 
       Select grobj, min_x_res$, max_x_res$, last_update from grtab1 where cloud_cover=0 union all
       Select grobj, min_x_res$, max_x_res$, last_update from grtab2 where cloud_cover=0 union all 
       Select grobj, min_x_res$, max_x_res$, last_update from grtab3 ) 
       order by last_update;

この項の説明に従って仮想モザイクを定義した後、アプリケーションでは、他のすべての仮想モザイクと同じ方法でそれを問い合せて使用できますが、多くの解像度レベルを含む大規模な仮想モザイクではパフォーマンスが向上します。詳細は、SDO_GEOR_AGGR.getMosaicSubsetおよびSDO_GEOR_AGGR.mosaicSubsetのリファレンスの項を参照してください。