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

前
次

5 イメージ処理および仮想モザイク

この章では、GCP地理参照、再投影、幾何補正、オルソ補正、イメージのスケール変更、ストレッチ、マスキング、イメージのセグメント化、NDVI計算、タッセルド・キャップ変換、イメージの追加、バンドのマージ、大規模な拡張イメージ・モザイク処理などの高度なイメージ処理機能について説明します。

この章では、大規模なイメージ・データベースとそれに対するオンザフライ空間問合せのコンテキスト内における仮想モザイクの概念および適用についても説明します。

この章の操作は、地理空間イメージ(特に衛星によるRAWイメージや航空写真)を処理するために最もよく使用されます。ただし、これらの操作は、GeoRasterラスター代数と同様にすべてのラスター・データ型に適用されます。

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

5.1 高度な地理参照

GeoRasterでは、空間参照機能は空間参照システム(SRS)または地理参照と呼ばれます(これは地理または地理空間スキームに関連する場合としない場合があります)。地理参照は、GeoRasterの主要機能であり、地理空間イメージおよびグリッド・ラスター・データに対する空間問合せおよび操作の基盤です。SRSモデルの詳細は、「地理参照」を参照してください。

GeoRasterでは、座標系に関連付けられていない地理空間イメージ以外のイメージ、美術写真、および多次元配列がサポートされます。これらのイメージおよびラスターでは、通常は地理参照の必要はありませんが、ほとんどのGeoRaster操作(ピラミッド化、スケール変更、サブセット化、バンドのマージ、ストレッチ、代数操作など)はそれらに対して動作します。この場合、ラスターのセル空間座標(行、列およびバンド)を使用してピクセル(セル)をアドレッシングします。

地理に関連しないユーザー定義の座標系(新しいSRID)を作成することも可能で、そのSRIDをラスターのモデル座標系として使用できます。その後、そのSRIDを基準としてこれらのラスターを空間参照できます(SRSメタデータ構成要素がこれらのラスターごとに作成されます)。これを行うことで、各ラスターが空間参照され、そのユーザー定義のモデル座標系にともに配置されます。関連するすべてのラスターでこれを行った後、GeoRaster操作は、地理座標系を基準に地理参照する場合と同様にそれらのラスターで動作します。たとえば、ある芸術家が壁に描いた巨大な壁画があり、その壁の多数の高解像度写真を異なるタイルとして撮り、それらをまとめて貼り合せるとします。タイル・イメージを空間参照し、GeoRasterのモザイク処理機能を使用して貼合せを行うことができます。

新しい座標系を定義しない場合でも、セル空間にイメージをともに配置できます。つまり、イメージを同じ座標系に配置してモザイク処理できるように、SDO_GEOR.setULTCoordinateプロシージャをコールしてイメージ用に異なるULT座標を設定できます。

保持しているほとんどの地理空間イメージおよびラスター・ファイルは、通常、すでに他のソフトウェア・ツールによって地理参照されているため、それらには地理参照情報が付属している可能性があります。そのような場合、地理参照情報は、ラスターとともに直接ロードするか、後でSDO_GEOR.importFromSDO_GEOR.setSRS、GeoRasterローダー・ツール、GDAL、または他のサード・パーティETLツールを使用してロードできます。詳細は、「GeoRasterツール: ビューア、ローダー、エクスポータ」および「GeoRasterオブジェクトの地理参照」を参照してください。

地理空間イメージに空間参照情報が含まれない場合、GeoRasterの地上基準点(GCP)サポートを使用してイメージを地理参照できます。GCPは、リモート・センシング・システムによって自動的に、または後から手動で収集します。GCP情報のないイメージの場合、GeoRasterの視覚化ツールを使用してGeoRasterオブジェクトのGCPを収集できます。GCPの詳細は、「地上基準点(GCP)地理参照モデル」を参照してください。

GCPを入手した後で、それらをGeoRasterメタデータに格納する場合、SDO_GEOR.getGCPGeorefModelファンクションおよびSDO_GEOR.setGCPGeorefModelプロシージャを使用してGCPベースの地理参照モードを取得および設定できます。GCPのみを取得、設定および編集するには、SDO_GEOR.getControlPoint ファンクションと、SDO_GEOR.setControlPointおよびSDO_GEOR.deleteControlPoint プロシージャを使用します。GCPは、SDO_GEOR.georeferenceをコールすると、GeoRasterメタデータにも格納できます。

ジオメトリ・モデルのみを取得および設定するには、SDO_GEOR.getGCPGeorefMethodファンクションおよびSDO_GEOR.setGCPGeorefMethodプロシージャを使用します。GeoRasterでは、チェック・ポイント(pointType = 2)も格納できますが、それらは基準点(pointType = 1)と同じように処理および操作されます(ただし、チェック・ポイントは、SDO_GEOR.georeferenceがGCPとともにコールされたときにSRS係数を作成するために使用されません)。

GeoRasterオブジェクトに格納されているか、格納されていない地上基準点(GCP)があり、関数フィッティング地理参照モデルを計算する場合、SDO_GEOR.georeferenceプロシージャをコールしてソリューションを検出します。関数フィッティング地理参照モデルでは、すべての係数をGeoRaster SRSに格納し、セル空間とモデル空間の間で座標変換が可能になります。GCPを使用して関数フィッティング地理参照モデルを生成するには、適切なジオメトリ・モデルを指定する必要があります。SDO_GEOR.georeferenceによってサポートされる特定のジオメトリ・モデルは、アフィン変換、二次多項式、三次多項式、DLT、二次有理およびRPCです。これらのモデルの詳細は、「関数フィッティング地理参照モデル」を参照してください。

例5-1 GCP地理参照モデルの設定

たとえば、平面領域のランドサット・イメージがあり、それを地理参照する場合、二次多項式ジオメトリ・モデルを選択できます。この目的で、9つのGCP (この場合6つ以上のGCP)と3つのチェック・ポイントを収集済の場合、GCPを設定して、例5-1のコードを使用してGeoRasterのメタデータにそれらを格納できます。

DECLARE
   gr1         sdo_georaster;
   georefModel SDO_GEOR_GCPGEOREFTYPE;
   GCPs        SDO_GEOR_GCP_COLLECTION;
BEGIN
   SELECT georaster INTO gr1 from georaster_table WHERE georid=1 FOR UPDATE;
   GCPs := SDO_GEOR_GCP_COLLECTION( 
                 SDO_GEOR_GCP('1', '', 1, 
                      2, sdo_number_array(25, 73),
                      2, sdo_number_array(237036.9, 897987.2),
                      NULL, NULL),
                 SDO_GEOR_GCP('2', '', 1, 
                      2, sdo_number_array(100, 459),
                      2, sdo_number_array(237229.6, 897949.7),
                      NULL, NULL),
                 SDO_GEOR_GCP('3', '', 1, 
                      2, sdo_number_array(362, 77),
                      2, sdo_number_array(237038.9, 897818.8),
                      NULL, NULL),
                 SDO_GEOR_GCP('4', '', 1, 
                       2, sdo_number_array(478, 402),
                       2, sdo_number_array(237201.06, 897760.56),
                       NULL, NULL),
                 SDO_GEOR_GCP('5', '', 1, 
                       2, sdo_number_array(167, 64),
                       2, sdo_number_array(237032.02, 897916.26),
                       NULL, NULL),
                 SDO_GEOR_GCP('6', '', 1, 
                       2, sdo_number_array(101, 257),
                       2, sdo_number_array(237128.9, 897949.3),
                       NULL, NULL),
                 SDO_GEOR_GCP('7', '', 1, 
                       2, sdo_number_array(235, 501),
                       2, sdo_number_array(237250.9, 897882.2),
                       NULL, NULL),
                 SDO_GEOR_GCP('8', '', 1, 
                       2, sdo_number_array(423, 214),
                       2, sdo_number_array(237107.3, 897788.0),
                       NULL, NULL),
                 SDO_GEOR_GCP('9', '', 1, 
                       2, sdo_number_array(127, 178),
                       2, sdo_number_array(237089.0, 897936.5),
                       NULL, NULL),
                 SDO_GEOR_GCP('10', '', 2, 
                       2, sdo_number_array(131, 425),
                       2, sdo_number_array(237212.8, 897934.2),
                       NULL, NULL),
                 SDO_GEOR_GCP('11', '', 2, 
                       2, sdo_number_array(299, 111),
                       2, sdo_number_array(237055.7, 897850.4),
                       NULL, NULL),
                 SDO_GEOR_GCP('12', '', 2, 
                       2, sdo_number_array(329, 253),
                       2, sdo_number_array(237126.9,897835.4), 
                       NULL, NULL) );
   georefModel := SDO_GEOR_GCPGEOREFTYPE('QuadraticPolynomial', GCPs.count, GCPs, NULL);
   -- Set and store the GCP georeference model into the GeoRaster object's metadata
   sdo_geor.setGCPGeorefModel(gr1, georefModel);
   UPDATE georaster_table SET georaster=gr1 WHERE georid=1;
   COMMIT;
END;
/

例5-2 GCPを使用した関数フィッティング・モデルの生成

例5-1のコードを使用した後、例5-2のコードを使用して関数フィッティング・モデルの係数を生成できます。

DECLARE
   gr1  sdo_georaster;
   rms  sdo_number_array;
BEGIN
   SELECT georaster INTO gr1 from georaster_table WHERE georid=1 FOR UPDATE;
   -- georeference the image using the GCPs stored in the image's metadata
   rms := sdo_geor.georeference(gr1, null, 26986, 0, 'TRUE'); 
   UPDATE georaster_table SET georaster=gr1 WHERE georid=1;
   COMMIT;
END;
/

例5-1および例5-2の手順は、GeoRasterオブジェクトのメタデータにGCPを事前設定することなく、組み合せることができます(「SDO_GEORパッケージのリファレンス」SDO_GEOR.georeferenceの例を参照)。例5-2SDO_GEOR.georeferenceで戻される値の配列には、各GCPのRMS値と残差が含まれます。これらを使用して、ソリューションの精度を調査し、不適切なGCPを識別できます。精度に不満がある場合、すべてのGCPを再チェックしてそれらが正確であることを確認し、必要に応じて別のGCPを追加してから、1つ以上のスクリプトを再度実行します。

GeoRasterのGCPサポートでは、任意の地理空間イメージおよびラスターも空間参照できます。

地理空間イメージを地理参照した後、幾何補正、再投影、モザイク処理の適用や、異なる座標系のジオメトリ・ポリゴンを使用したラスターの空間問合せおよびサブセット化などで、それらのイメージを処理できます。

5.2 イメージの再投影

イメージの再投影は、イメージをあるSRS (空間参照システム、または座標系)から別のSRSに変換するプロセスです。再投影は、2つ以上のオブジェクトを結合する一定のGeoRaster操作では特に便利です(この場合、すべてのGeoRasterオブジェクトを同じSRSに含める必要があるため)。

GeoRasterの基本的な再投影は、SDO_GEOR.reprojectプロシージャによって実行されますが、ソースGeoRaster SRIDは、出力SRIDとは異なっている必要があります。

例5-3 イメージの再投影

例5-3では、SRID 4326のGeoRasterオブジェクトにロードされているラスター・イメージを再投影しますが、以前にSRID 23619で格納された他のイメージと同じSRIDを持つように再投影する必要があります。

DECLARE
  gr1 sdo_georaster;
  gr2 sdo_georaster;
BEGIN
  select raster into gr1 from georaster_load_table where georid = 10;
  delete from georaster_table where georid = 54;
  insert into georaster_table 
         values(54,'reprojected', sdo_geor.init()) 
         returning georaster into gr2;
  sdo_geor.reproject(inGeoRaster   => gr1,
                     pyramidLevel  => 0,
                     cropArea      => null,
                     layerNumbers  => null,
                     resampleParam => 'resampling=BILINEAR',
                     storageParam  => null,
                     outSRID       => 32619,
                     outGeoraster  => gr2);
  update georaster_table set georaster = gr2 where georid = 54;
  commit;
END;

同じ操作は、SDO_GEOR.rectifyプロシージャでも実行可能で、同様の結果が生成されます。SDO_GEOR.rectifyプロシージャでは、SDO_GEOR.reprojectより多くの機能と柔軟性が提供されます(たとえば、入力および出力のSRIDを同じにすることができ、ユーザーは出力の正確な解像度を指定できます(「イメージの幾何補正」を参照))。

GeoRasterオブジェクトにSRSが関連付けられていない場合、その地理参照と幾何補正のプロセスの詳細は、「GeoRasterオブジェクトの地理参照」および「イメージの幾何補正」を参照してください。

パラレル再投影は、SDO_GEOR_AGGR.mosaicSubsetプロシージャでサポートされます。「パラレル圧縮、コピー、サブセット化、再投影および幾何補正」例5-23を参照してください。

5.3 イメージの幾何補正

地上のリモート・センサーから取得されるほとんどのラスター・データは、通常、地形を原因とするひずみ、計器の視野角、および地球の不規則な形状の影響を受けます。この項で説明するイメージの幾何補正は、イメージを変換してそのひずみを低減するプロセスです。

幾何補正は、SDO_GEOR.rectifyプロシージャによって実行されますが、ソースGeoRasterオブジェクトには1つ以上の関数フィッティング地理参照モデルが必要です。つまり、イメージは幾何補正する必要はありませんが、メタデータに地理参照情報を保持する必要があります(「GeoRasterオブジェクトの地理参照」を参照)。

SDO_GEOR.rectifyプロシージャでは、ソースGeoRasterオブジェクトで使用可能な情報を使用して、出力GeoRasterの空間エクステント、次元およびSRIDを自動的に確立でき、ユーザーも適切なパラメータを使用して異なる値を指定できます。

例5-4 イメージの幾何補正

例5-3では、GeoRasterにロードされてからGCPを使用して地理参照されている航空イメージを幾何補正します(「高度な地理参照」を参照)。イメージは、出力GeoRasterオブジェクトが既存のGeoRasterオブジェクトと同じSRSおよび解像度となるように幾何補正されます。イメージは、既存のGeoRasterオブジェクトの領域に制限されます(ピクセルは既存のGeoRasterオブジェクトに完全に沿って配置される必要があります)。

DECLARE
  gr_src sdo_georaster;
  gr_ref sdo_georaster;
  gr_out sdo_georaster;
BEGIN
  select raster into gr_src from georaster_load_table where georid = 15;
  select raster into gr_ref from georaster_table where georid = 1;
  delete from georaster_table where georid = 2;
  insert into georaster_table 
         values(2, 'rectified', sdo_geor.init()) 
         returning georaster into gr_out;
  sdo_geor.rectify(inGeoRaster      => gr_src,
                   pyramidLevel     => null,
                   elevationParam   => null,
                   dem              => null,
                   outSRID          => sdo_geor.getModelSRID(gr_ref),
                   outModelCoordLoc => null,
                   cropArea         => sdo_geor.generateSpatialExtent(gr_ref),
                   polygonClip      => null,
                   layerNumbers     => null,
                   outResolutions   => sdo_geor.getSpatialResolutions(gr_ref),
                   resolutionUnit   => 'unit=meters',
                   referencePoint   => sdo_geor.getModelCoordinate(gr_ref,
                                       0, sdo_number_array(-0.5,-0.5)),
                   resampleParam    => null,
                   storageParam     => null,
                   outGeoraster     => gr_out);
  update georaster_table set georaster = gr_out where georid = 2;
  commit;
END;

幾何補正の出力は、標高に関する情報がSDO_GEOR.rectifyプロシージャに渡されると大幅に改善される可能性があります。(標高の詳細は、「イメージのオルソ補正」を参照してください。)

パラレル幾何補正は、SDO_GEOR_AGGR.mosaicSubsetプロシージャでサポートされます。「パラレル圧縮、コピー、サブセット化、再投影および幾何補正」例5-23を参照してください。

5.4 イメージのオルソ補正

オルソ補正は、地球の標高、地形および形状に関する情報を使用して出力幾何補正イメージの品質を向上する幾何補正変換プロセスです。Oracle GeoRasterでは、高さの平均値またはDEMを使用した単一のイメージ・オルソ補正がサポートされます。

オルソ補正は、SDO_GEOR.rectifyプロシージャによって実行されますが、ソースGeoRasterには3D SRSが必要です。SDO_GEOR.rectifyプロシージャは、領域の平均の高さまたは詳細な数値標高モデル(DEM)を使用してオルソ補正を実行できます。

関連項目:

5.4.1 平均の高さを使用したオルソ補正

数値標高モデル(DEM)を使用したGeoRasterオブジェクトは、オルソ補正のオプションです。比較的平坦な地形では、3D SRSと高さの平均値を組み合せれば、通常、ソース・イメージのひずみを修正するために十分です。

例5-5 平均の高さを使用したオルソ補正

例5-5に、平均の高さを使用したオルソ補正を示します。この例の場合、ソース・イメージは、RPCを使用してDigitalGlobeから取得できました。DEMは使用できませんでしたが、領域の平均の標高は、1748.0mであるとわかっています。

DECLARE
  gr_src  sdo_georaster;
  gr_out  sdo_georaster;
BEGIN
  select georaster into gr_src from georaster_table where georid = 1;
  delete from georaster_table where georid = 3;
  insert into georaster_table values(3, 'orthorectified without DEM',
         sdo_geor.init('rdt_4',3)) 
         returning georaster into gr_out;
  sdo_geor.rectify(inGeoRaster      => gr_src,
                   pyramidLevel     => null,
                   elevationParam   => 'average=1748.8',
                   dem              => null,
                   outSRID          => 32613,
                   outModelCoordLoc => null,
                   cropArea         => null,
                   polygonClip      => null,
                   layerNumbers     => null,
                   outResolutions   => null,
                   resolutionUnit   => null,
                   referencePoint   => null,
                   resampleParam    => 'resampling=AVERAGE4',
                   storageParam     => null,
                   outGeoraster     => gr_out);
  update georaster_table set georaster = gr_out where georid = 3;
  commit;
END;

例5-5では、demパラメータはNULLで、elevationParamの平均の標高はSRSと同じ単位である必要があります。また、elevationParamでは、offsetおよびscaleキーワードは、DEMが指定されている場合にのみ関連するため、指定されていません

5.4.2 DEMを使用したオルソ補正

数値標高モデル(DEM)・レイヤーの使用によって、幾何補正プロセスの精度が向上するため、より高品質な出力GeoRasterオブジェクトが生成されます。

DEMを使用したオルソ補正では、ソースGeoRasterに3D SRSが必要です。DEMは、すべてのターゲット出力領域を対象とし、出力と同じSRIDである必要があります。DEMの解像度は、出力GeoRasterオブジェクトの予測される解像度とほぼ同じである必要があります。

DEMを使用したオルソ補正では、elevationParamaverageキーワードはオプションで、指定しない場合、プロシージャでは、ターゲット領域のDEMから抽出されたサンプル値に基づいて標高値が評価されます。

elevationParamoffsetおよびscaleの値は、DEMからの値を変更するために使用できます。たとえば、scaleは、DEM値がソースGeoRaster SRSの単位とは異なる単位である場合の単位変換に使用でき、offsetはジオイド補正や他のオフセット設定を実行するために使用できます。ただし、これらの指定では、GeoRasterオブジェクトのDEM値に変更が適用されません。かわりの方法は、オルソ補正の前にDEMデータにスケール変更およびオフセット設定を適用して、DEM値を事前処理することです(「ラスター・データのスケール変更およびオフセット設定」を参照)。

例5-6 DEMを使用したオルソ補正

例5-6の例では、DEMを使用してオルソ補正を実行します。DEMは、出力GeoRasterの解像度に近似している解像度のすべての出力領域を対象とします。DEM値はm単位ですが、ソース・イメージSRSはフィート単位です。約-15.3mの該当領域に対するジオイド補正もあります。

DECLARE
  gr_src  sdo_georaster;
  gr_dem  sdo_georaster;
  gr_out  sdo_georaster;
BEGIN
  select georaster into gr_src from georaster_table where georid = 1;
  select georaster into gr_dem from georaster_table where georid = 5;
  delete from georaster_table where georid = 6;
  insert into georaster_table values(5, 'orthorectified with DEM',
         sdo_geor.init('rdt_4',6)) 
         returning georaster into gr_out;
  sdo_geor.rectify(inGeoRaster      => gr_src,
                   pyramidLevel     => null,
                   elevationParam   => 'average=1748.8 offset=-15.3',
                   dem              => gr_dem,
                   outSRID          => 32613,
                   outModelCoordLoc => null,
                   cropArea         => null,
                   polygonClip      => null,
                   layerNumbers     => null,
                   outResolutions   => null,
                   resolutionUnit   => null,
                   referencePoint   => null,
                   resampleParam    => 'resampling=BILINEAR',
                   storageParam     => null,
                   outGeoraster     => gr_out);
  update georaster_table set georaster = gr_out where georid = 6;
  commit;
END;

例5-7 クロッピング済のDEMを使用したオルソ補正

通常、DEMは、ターゲット領域よりずっと大きい領域を対象とし、解像度は出力GeoRasterオブジェクトのターゲット解像度よりも粗くなります。このDEMをそのまま使用すると、品質の低いオルソ補正になります。この一般的な問題に対するソリューションは、ターゲット領域までDEMをクロッピングし、目的の解像度になるまでそのスケールを変更することです(例5-7を参照)。この例では、SDO_GEOR.rectifyプロシージャを使用して、低解像度DEM GeoRasterオブジェクトを、SDO_GEOR.rectifyプロシージャに対する2番目のコールによって生成されるオルソ補正済GeoRasterオブジェクトと同じ解像度を持つ2番目のDEM GeoRasterオブジェクトに変換します。

DECLARE
  height   number := 1748.8;
  gr_src   sdo_georaster;
  gr_out   sdo_georaster;
  gr_dem   sdo_georaster;
  gr_dem2  sdo_georaster;
  gm_area  sdo_geometry;
begin
  select georaster into gr_src from georaster_table where georid = 1;
  select georaster into gr_dem from georaster_table where georid = 2;
  -- Calculate crop area
  gm_area := sdo_cs.make_2d(
             sdo_geor.generateSpatialExtent(gr_src,height),
             sdo_geor.getModelSRID(gr_dem));
  -- Rectify dem ( re-project, crop area, re-escale and resample )
  delete from georaster_table where georid = 4;
  insert into georaster_table values(4, 
              'rectified DEM',
              sdo_geor.init('rdt_4',4)) 
              returning georaster into gr_dem2;
  sdo_geor.rectify(inGeoRaster      => gr_dem,
                   pyramidLevel     => null,
                   elevationParam   => null,
                   dem              => null,
                   outSRID          => 32613,
                   outModelCoordLoc => null,
                   cropArea         => gm_area,
                   polygonClip      => null,
                   layerNumbers     => null,
                   outResolutions   => sdo_number_array(0.6,0.6),
                   resolutionUnit   => null,
                   referencePoint   => null,
                   resampleParam    => 'resampling=CUBIC',
                   storageParam     => null,
                   outGeoraster     => gr_dem2);
  update georaster_table set georaster = gr_dem2 where georid = 4;
  commit;
  -- Orthorectification with DEM
  select georaster into gr_dem2 from georaster_table where georid = 4;
  delete from georaster_table where georid = 5;
  insert into georaster_table 
         values(5, 'orthorectified', sdo_geor.init('rdt_4',5)) 
         returning georaster into gr_out;
  sdo_geor.rectify(inGeoRaster      => gr_src,
                   pyramidLevel     => null,
                   elevationParam   => 
                          'average=' || height || ' offset=-15.588',
                   dem              => gr_dem2,
                   outSRID          => 32613,
                   outModelCoordLoc => null,
                   cropArea         => gm_area,
                   polygonClip      => null,
                   layerNumbers     => null,
                   outResolutions   => sdo_number_array(0.6,0.6),
                   resolutionUnit   => null,
                   referencePoint   => null,
                   resampleParam    => 'resampling=average16',
                   storageParam     => null,
                   outGeoraster     => gr_out);
  update georaster_table set georaster = gr_out where georid = 5;
  commit;
end;
/

5.5 イメージのスケール変更

イメージのスケール変更は、イメージの行および列の次元に対応するピクセル・サイズを変更してイメージを拡大または縮小するプロセスです。イメージのスケール変更では、そのイメージのスケール変更したバージョンを作成するため、元のイメージからピクセル値をリサンプリングします。

イメージのスケール変更を実行する1つの方法は、SDO_GEOR.scaleCopyプロシージャを使用して、scaleParamおよびscaleFactorが入力イメージ次元または出力イメージのmaxDimSizeに適用されるように指定します。

イメージのスケール変更を実行するもう1つの方法は、SDO_GEOR.rectifyプロシージャを使用して出力イメージの解像度を指定します。

SDO_GEOR.scaleCopySDO_GEOR.rectifyの両方で、resampleParamパラメータによって、入力ピクセル値に実行されるリサンプリング・アルゴリズムを決定し、出力イメージの値を特定します。

例5-8 SDO_GEOR.scaleCopyを使用したイメージのスケール変更

例5-8では、SDO_GEOR.scaleCopyを使用してスケール変更を実行し、scaleFactor値を2に指定します。入力イメージには、元のイメージと比較して2倍の行と2倍の列が含まれ、値はaverage16アルゴリズムによってリサンプリングされます。イメージは、元のイメージと比較して4倍の大きさになることに注意してください。

DECLARE
  gr_src  sdo_georaster;
  gr_out  sdo_georaster;
BEGIN
  select georaster into gr_src from georaster_table where georid = 7;
  -- Rescale
  delete from georaster_table where georid = 9;
  insert into georaster_table values(9, 're-scaled by scaleCopy',
              sdo_geor.init('rdt_4',9)) 
              returning georaster into gr_out;
  sdo_geor.scaleCopy(inGeoRaster      => null,
                     scaleFactor      => 'scaleFactor=2',
                     resampleParam    => 'resampling=AVERAGE16',
                     storageParam     => null,
                     outGeoraster     => gr_out);
  update georaster_table set georaster = gr_out where georid = 9;
  commit;
END;
/

例5-9 SDO_GEOR.rectifyを使用したイメージのスケール変更

例5-9では、SDO_GEOR.rectifyを使用してスケール変更を実行し、outResolutionsパラメータを指定します。入力イメージは、すでに幾何補正され、出力には入力と同じSRIDが含まれます。

DECLARE
  gr_src     sdo_georaster;
  gr_out     sdo_georaster;
BEGIN
  select georaster into gr_src from georaster_table where georid = 7;
  -- Rescale
  delete from georaster_table where georid = 10;
  insert into georaster_table values(10, 're-scaled by rectify',
              sdo_geor.init('rdt_4',10)) 
              returning georaster into gr_out;
  sdo_geor.rectify(inGeoRaster      => null,
                   pyramidLevel     => null,
                   elevationParam   => null,
                   dem              => null,
                   outSRID          => null,
                   outModelCoordLoc => null,
                   cropArea         => null,
                   polygonClip      => null,
                   layerNumbers     => null,
                   outResolutions   => sdo_number_array(1.2,1.2),
                   resolutionUnit   => null,
                   referencePoint   => null,
                   resampleParam    => 'resampling=CUBIC',
                   storageParam     => null,
                   outGeoraster     => gr_out);
  update georaster_table set georaster = gr_out where georid = 10;
  commit;
END;
/

5.6 イメージのストレッチ

イメージの単純な線形ストレッチでは、イメージの色またはコントラストを拡張できます。イメージのストレッチを実行するには、SDO_GEOR_RA.rasterMathOpプロシージャを使用します。

例5-10 既知の最小および最大のセル値を使用したイメージのストレッチ

例5-10では、既知の、または事前生成済の最小および最大のセル値を使用して、線形ストレッチによって3バンドのイメージのコントラストを拡張します。

DECLARE
     gr1 sdo_georaster; -- source 3-band image
     gr2 sdo_georaster; -- output 3-band image
BEGIN
     select georaster into gr1 from georaster_table where georid = 1;
     select georaster into gr2 from georaster_table where georid = 2 for update;
     -- Assume the min and max cell values are (17, 163), (14, 150), and (10, 148) for the bands.
     sdo_geor_ra.rasterMathOp(gr1,
                 SDO_STRING2_ARRAY(
                              '255/(163-17)*({0}-17)',
                              '255/(150-14)*({1}-14)',
                              '255/(148-10)*({2}-10)'),
                 'celldepth=8BIT_U', gr2);
     update georaster_table set georaster = gr2 where georid = 2;
     commit;
END;
/

例5-11 動的に生成された最小および最大のセル値を使用したイメージのストレッチ

例5-11では、イメージの各バンドの統計的な最小および最大のピクセル値を動的に分析し、SDO_GEOR_RA.rasterMathOpプロシージャのarithmeticExprパラメータ値を生成して、次にイメージのすべてのバンドを(0, 255)の範囲に線形にストレッチします。

DECLARE
       i integer;
       bands  number;
       gr1 sdo_georaster;
       gr2 sdo_georaster;
       stmt varchar2(5024);
       mmax number;
       mmin number;
       str varchar2(664);
       win SDO_NUMBER_ARRAY;
BEGIN
       select georaster into gr1 from georaster_table where georid = 1;
       select georaster into gr2 from georaster_table where georid = 2 for update;
       i:=0;
       bands:=SDO_GEOR.getBandDimSize(gr1);
       stmt:='';
       LOOP
            str:=to_char(i);
            mmax:=sdo_geor.generateStatisticsMax(gr1,0,'samplingFactor=1',win,str);
            mmin:=sdo_geor.generateStatisticsMin(gr1,0,'samplingFactor=1',win,str);
            stmt:=stmt ||
                        '''255/((' ||trim(to_char(mmax,'990.999'))|| ')-(' ||trim(to_char(mmin,'990.999'))|| '))*({' ||trim(to_char( i,'999' ))|| '} -('  ||trim(to_char(mmin,'990.999'))|| '))''';
            IF(i<(bands-1))
            THEN
                    stmt:=stmt||',';
            END if;
            i := i + 1;
            IF i >=bands
            THEN   EXIT;
            END IF;
       END LOOP; 
       stmt := 'call sdo_geor_ra.rasterMathOp(:1,SDO_STRING2_ARRAY('||stmt||'),'||              
                     '''celldepth=8BIT_U'',:2)';
       execute immediate stmt using gr1,in out gr2;
       dbms_output.put_line(stmt);
       update georaster_table set georaster = gr2 where georid = 2;
       commit;
END;
/

例5-10および例5-11は、最小/最大ストレッチと呼ばれます。カラー・イメージでは、正規化ストレッチと呼ばれる別の線形ストレッチ・アルゴリズムによって、コントラストがより拡張されます。正規化ストレッチは、指定された中央値や標準偏差値を使用しますが、それ以外の場合もこれらの例と同じような方法で実行されます。

これらの例と同じアプローチを使用して、上限または下限のセル深度(32ビット整数のDEMや64ビット浮動小数点数の温度レイヤーなど)でラスターを(0, 255)の範囲にストレッチし、そのようなラスターを適切に表示できます。

5.7 イメージのセグメント化

セグメント化は、単純なタイプの分類アルゴリズムで、一定のタイプのイメージをより大きい地表特徴カテゴリ(陸地、雲、水、雪など)に分類する場合に役立ちます。

SDO_GEOR_RA.classifyプロシージャを使用して、イメージにしきい値処理を適用できます。しきい値処理は、単一のセル値をしきい値として使用して、イメージを2つのカテゴリに分類する最も簡単なセグメント化です。結果のイメージは、2つの値のみを含み、同じプロセスで直接バイナリ・ビットマップ・マスクにキャストできます。

最初に複数のバンドに算術操作を適用し、次にその結果を複数のカテゴリに分類することで、SDO_GEOR_RA.classifyプロシージャを使用してより多くのイメージのセグメント化操作を適用することも可能です。

SDO_GEOR_RA.classifyプロシージャの使用例は、「分類操作」を参照してください。

5.8 イメージのピラミッド化: パラレル生成および部分更新

イメージのピラミッド化は、大規模なイメージ・データベースの構築に最もよく使用されるプロセスの1つです。この項では、ピラミッドのパラレル生成、ピラミッドの部分更新、バッチおよび同時処理などのいくつかの関連技術について説明します。

ピラミッドをより効率的に操作するため、ピラミッドをパラレルに生成することや、ピラミッドの部分更新を実行することができます。(この項では、読者が「ピラミッド」に説明されている概念を理解していると仮定します。)

例5-12 ピラミッドのパラレル生成

ピラミッドの生成を高速化するため、SDO_GEOR.generatePyramidプロシージャでparallelParamパラメータを指定できます。例5-12で、並列度は4に設定されます。(ピラミッド生成のパフォーマンスが実際にどれぐらい向上するかは、Oracle Databaseで使用可能なCPUの数に応じて変化します。)

DECLARE
  gr sdo_georaster;
BEGIN
 
  SELECT georaster INTO gr 
    FROM georaster_table WHERE georid = 6 FOR UPDATE;
 
  -- Generate pyramids.
  sdo_geor.generatePyramid(gr, 'rLevel=5, resampling=NN', null, 'parallel=4');
 
  -- Update the original GeoRaster object.
  UPDATE georaster_table SET georaster = gr WHERE georid = 6;
 
  COMMIT;
END;
/

ピラミッド生成のパラレル処理を有効化するには、SDO_GEOR.generatePyramidによって、暗黙的コミット操作を実行します。コール中にエラーが発生すると、GeoRasterオブジェクトは無効な状態になる可能性があります。それが発生した場合、SDO_GEOR.deletePyramidを使用して、GeoRasterオブジェクトで新しく生成された上位のピラミッド・レベルを削除します。

例5-13 ピラミッドの部分更新

SDO_GEOR.updateRasterプロシージャを使用して、ピラミッドを部分的に更新できます。例5-13では、指定した領域のターゲットGeoRasterオブジェクト(targetAreaareaとして指定される)が、別のGeoRasterオブジェクトによって更新されます。updateUpperPyramidsパラメータはtrueに設定されるため、ターゲットGeoRasterオブジェクトの上位のピラミッドは、指定した領域で部分的にのみ更新されます。つまり、上位のピラミッド・レベルは完全には再生成されませんが、そのtargetAreaのセルのみが再生成されるため、パフォーマンスが向上します。

DECLARE
  gr1 sdo_georaster;
  gr2 sdo_georaster;
  area sdo_number_array := sdo_number_array(-200,-50,201,162);
BEGIN
  SELECT georaster INTO gr2 FROM georaster_table WHERE georid=0 FOR UPDATE;
  SELECT georaster INTO gr1 FROM georaster_table WHERE georid=1;
  SDO_GEOR.updateRaster(gr2, 0, null, area, gr1, 0, null, 'true');
  UPDATE GEORASTER_TABLE SET georaster=gr2 WHERE georid=0;
  COMMIT;
END;
/

ピラミッド化プロセスを高速化および自動化する他の技術にはバッチ処理が含まれ、同時処理を使用できます。特定の領域の多くのイメージを一括してピラミッド化するには、「GeoRasterオブジェクトの問合せと検索」の例を参照してください。多くのバッチを同時に処理するため、異なるデータベース・セッションを開始できます。

5.9 ビットマップのピラミッド化

ほとんどのラスター・データ型で、イメージのピラミッド化(「イメージのピラミッド化: パラレル生成および部分更新」を参照)によって、高品質のピラミッドが生成されます。ただし、通常は1ビットのセル深度で格納される点、行または多角形のビットマップ・ラスターの場合、同じピラミッド化アプローチでは、高品質なピラミッドが作成されない可能性があります。これらのピラミッドでは、ゆがんだ点のパターンや破線がよく見られます。

この問題を解決するには、GeoRasterラスター代数を使用してビットマップのピラミッド化を実行します。このアプローチでは、ビットマップ・ラスター(道路ラスター地図やユーティリティ・ネットワーク・ラスター地図など)での特に破線または線の欠落といったゆがんだパターンを避けることで、ピラミッドの品質が大幅に向上されます。これには、元のラスターおよび完全なピラミッドが(8ビットのかわりに)1ビットのセル深度に戻されて格納されるため、データが展開されたり、ディスク領域が無駄に使用されることはありません。

例5-14に、ビットマップ・ラスターの高品質なピラミッドを生成する方法を示します。例のコメントでは、主要な論理ステップを説明しています。

例5-14 ビットマップのピラミッド化

DECLARE 
  geor1  SDO_GEORASTER; -- source bitmap raster
  geor2  SDO_GEORASTER; -- temporary raster
  geor3  SDO_GEORASTER; -- resultant bitmap raster with fully pyramids generated
BEGIN
  -- The original 1bit raster with lines/roads value 0 and background value 1
  select georaster into geor1 
       from georaster_table where georid = 22;
 
  -- Step 1: Cast to 8bit raster while mapping 0 (roads) to 255 and 1 (bkgrd) to 0
  delete from georaster_table where georid = 21;
  insert into georaster_table values (21, null, sdo_geor.init('RDT_1',21));
  select georaster into geor2 
    from georaster_table where georid = 21 for update;
  sdo_geor_ra.classify(
        geor1,
        '{0}',
        SDO_NUMBER_ARRAY(1),
        SDO_NUMBER_ARRAY(255, 0),
        'celldepth = 8BIT_U', 
        geor2);
 
  -- Step 2: Generate pyramids on the 8bit raster.
  sdo_geor.generatePyramid(geor2, 'rLevel=15, resampling=bilinear');
 
  -- Step 3, Map value to either 0 or 1. 
  -- Depending on the source raster, adjust value 253 to a different number to improve qualtiy.
  sdo_geor_ra.rasterUpdate(
         geor2,
         null,-- update the raster's full pyramid as well
         SDO_STRING2_ARRAY('{0}<253','{0}>=253'),
         SDO_STRING2_ARRAYSET(SDO_STRING2_ARRAY('0'),SDO_STRING2_ARRAY('1')));
 
  -- Step 4, Cast back to 1bit raster with full pyramids.
  delete from georaster_table where georid = 20;
  insert into georaster_table values (20, null, sdo_geor.init('RDT_1',20));
  select georaster into geor3 
         from georaster_table where georid = 20 for update;
  sdo_geor.changeFormatCopy(geor2, 'celldepth=1BIT pyramid=true', geor3);
 
  -- Step 5, Optionally add a good colormap for the 1bit raster to display roads as white.
  sdo_geor.setColorMap(geor3, 1, 
         sdo_geor_colormap(sdo_number_array(0, 1),
                        sdo_number_array(0, 255),
                        sdo_number_array(0, 255),
                        sdo_number_array(0, 255),
                        sdo_number_array(255, 255)));
 
  -- Commit the resultant raster, which can be used to overwrite the original raster after quality checking.
  UPDATE georaster_table SET georaster = geor3 WHERE georid=20;
  COMMIT;
END;
/

5.10 植生指標計算

リモート・センシングで、正規化植生指標(NDVI)は、広く使用されている植生指標であり、植生領域を迅速に識別して植物の成長と状態を監視できます。ランドサットTMイメージを使用した標準のNDVI計算式は(TM4 - TM3) / (TM4 + TM3)です。

例5-15 植生指標計算

例5-15では、ランドサット7 ETM+イメージを使用して、浮動小数点数データ型の別のラスターとして格納されるNDVIを計算します。GeoRaster代数言語で、バンド番号は0から始まるため、計算式は({3}-{2})/({3}+{2})という式に変換されることに注意してください。

DECLARE 
  geor1    SDO_GEORASTER; 
  geor2    SDO_GEORASTER; 
EBGIN
  -- Source ETM+ image
  select georaster into geor1 from georaster_table where georid = 2; 
  -- Store NDVI 
  select georaster into geor2 from georaster_table where georid = 3 for update; 
  sdo_geor_ra.rasterMathOp(geor1,
       SDO_STRING_ARRAY('({3}-{2})/({3}+{2})'),
       'celldepth=32bit_real',geor2);
  update georaster_table set georaster = geor2 where georid = 3;
  commit;
end;
/

NDVIに加え、リモート・センシングの領域には他の多くの植生指標があります。それらの多くは、GeoRasterラスター代数を使用して同様に計算できます。

5.11 タッセルド・キャップ変換

タッセルド・キャップ変換(TCT)は、リモート・センシングされたイメージを使用して物理的な地表特徴を分析する場合に役立つツールです。これは、様々なランドサット・イメージに基づいて、元のデジタル番号(DN)または反射率データの5つのバンドを使用して、6つの新しいバンドを生成します(そのそれぞれが異なる地表特徴を表します)。結果の6つのバンドは、一般的に、(土壌の)明るさ、(植生の)緑度、(土壌およびキャノピーの)湿度、煙霧、TC5およびTC6です。これらの各要素または組合せは、作物生育の監視と分析、バイオマス研究、農業計画などの異なるアプリケーションに役立ちます。

例5-16 タッセルド・キャップ変換

例5-16では、ランドサット5 TMイメージのDNデータを入力として取得し、GeoRasterラスター代数を使用してTCTを実行して、結果を含む新しいイメージを作成します。

declare
    gr1 sdo_georaster;
    gr2 sdo_georaster;
    ret varchar2(32);
begin
    select georaster into gr1 from georaster_table where georid = 2;
    select georaster into gr2 from georaster_table where georid = 4 for update;
    sdo_geor_ra.rasterMathOp(
      gr1,
      SDO_STRING2_ARRAY(
         '0.3561*{0}+0.3972*{1}+0.3904*{2}+0.6966*{3}+0.2286*{4}+0.1596*{6}',
         '(-0.3344)*{0}-0.3544*{1}-0.4556*{2}+0.6966*{3}-0.0242*{4}-0.2630*{6}',
         '0.2626*{0}+0.2141*{1}+0.0926*{2}+0.0656*{3}-0.7629*{4}-0.5388*{6}',
         '0.0805*{0}-0.0498*{1}+0.1950*{2}-0.1327*{3}+0.5752*{4}-0.7775*{6}',
         '(-0.7252)*{0}-0.0202*{1}+0.6683*{2}+0.0631*{3}-0.1494*{4}-0.0274*{6}',
         '0.4000*{0}-0.8172*{1}+0.3832*{2}+0.0602*{3}-0.1095*{4}+0.0985*{6}' ),
      'celldepth=32BIT_REAL',
      gr2); 
    update georaster_table set georaster = gr2 where georid = 4;
    commit;
end;
/

また、同じラスター代数言語を使用して、例5-16にコードを追加し、32ビットの浮動小数点数イメージを8ビットの整数イメージに変換し、結果のTCTイメージにイメージのストレッチ(「イメージのストレッチ」を参照)を適用して視覚化および分析のために新しいGeoRasterオブジェクトを生成できます。

ラスター代数アルゴリズムおよび埋込みパラレル処理の最適化された実装を使用する以外に、さらにOracleのグリッド・コンピューティング・インフラストラクチャを利用して、迅速にNDVIを計算したり、GeoRasterデータベースに格納されている数千のイメージに対してTCTを適用できます。

5.12 イメージのマスキング

イメージ・マスキングを実行するには、アプリケーションを使用してGeoRasterデータベースでビットマップ・マスクを問い合せ、目的となる1つ以上のビットマップ・マスクを取得して、オブジェクトの表示や他の処理を実行する目的でターゲットGeoRasterオブジェクトにマスキング操作を適用します。ビットマップ・マスク(「ビットマップ・マスク」を参照)は、独立したGeoRasterオブジェクトとして格納できます(また、GeoRasterオブジェクト内のメタデータとして格納し、1つのバンドまたはGeoRasterオブジェクト全体に関連付けることもできます)。

SDO_GEOR.maskプロシージャを使用して、データベース内でマスキング操作を実行し、新しいGeoRasterオブジェクトを生成することも可能です。

5.13 バンドのマージ

イメージ分類、時系列分析およびラスターGISモデリングでは、状況により、異なるGeoRasterオブジェクトの複数のバンドまたはレイヤーをマージして1つのGeoRasterオブジェクトにする必要があります。この操作は、GeoRasterでバンドまたはレイヤーのマージと呼ばれ、SDO_GEOR.mergeLayersプロシージャを使用して実行できます。ソースGeoRasterオブジェクトの指定したバンドをターゲットGeoRasterオブジェクトに追加するか、2つのGeoRasterオブジェクトの異なるバンドを1つの新しいGeoRasterオブジェクトにマージできます。このマージや追加を反復実行することで、無制限の数のバンドを1つのGeoRasterオブジェクトにマージできます。

例5-17では、8つのGeoRasterオブジェクトがあり、そのそれぞれにGeoTIFF形式の単一バンド・ランドサットETM+イメージ・ファイルからロードされたただ1つのバンドが含まれると仮定します。各GeoRasterオブジェクトのバンドの数は、そのGeoRasterオブジェクトのGEORID列の値と同じです。例では、すべてのバンドを1つのGeoRasterオブジェクトにマージして、完全なETM+シーンを作成します。

例5-17 バンドのマージ

DECLARE
    gr1 sdo_georaster;
BEGIN
    select georaster into gr1 from georaster_table where georid = 1 for update;
    for rec in (select georaster from georaster_table 
                     where georid >= 2 and georid <= 8 
                     order by georid)
    loop
       sdo_geor.mergelayers(gr1, rec.georaster);
    end loop;
    update georaster_table set georaster = gr1 where georid = 1;
    commit;
END;
/

5.14 イメージの追加

2つのイメージに同じ数のバンドが含まれる場合、一方のイメージをもう一方のイメージに追加できます。イメージの追加は、地理空間イメージを定期的に収集し、取得したイメージを後で既存のイメージに追加して空間領域全体の大規模イメージを作成する必要がある場合に役立ちます。イメージの追加は、新しいイメージで既存のイメージを更新する場合にも役立ちます。

SDO_GEOR_AGGR.appendプロシージャは、既存のGeoRasterオブジェクトを別のGeoRasterオブジェクトで部分的に更新することで、イメージの追加を実行します。既存のGeoRasterオブジェクトにピラミッドが含まれる場合、ブロックのあるピラミッドは、新しいデータで部分的に更新されます。

例5-18では、あるイメージを別のイメージに追加します(ブロックのあるピラミッドが同時に更新されます)。appendParamパラメータで'nodata=true'を指定しているため、重複する領域のNODATA値は透過的であるとみなされます。

例5-18 あるイメージの別のイメージへの追加

DECLARE
    gr1 sdo_georaster;
    gr1 sdo_georaster;
BEGIN
     select georaster into gr1 from georaster_table where georid = 1 for update;
     select georaster into gr2 from georaster_table where georid = 2;
     sdo_geor_aggr.append(gr1, gr2, 0, 'nodata=true');
     update georaster_table set georaster = gr1 where georid= 1;
     commit;
END;
/

5.15 大規模イメージのモザイク処理

大規模な地理空間領域は、通常、多くの小さい航空写真または衛星イメージで構成されます。大規模イメージのモザイク処理では、それらの小さい地理空間イメージを貼り合せて1つの大きいイメージにし、空間領域全体のわかりやすいビューを取得します。GeoRasterには、切れ目、重複、欠落したソースGeoRasterオブジェクトに対応できる大規模モザイク処理ファンクションがあります。これによって、幾何補正されたイメージと幾何補正されないイメージの両方がサポートされます。これは、内部的再投影と幾何補正、共通ポイント・ルール、および簡易カラー・バランスに対応します。特定のピラミッド・レベルでモザイク処理することも可能です。このモザイク処理プロセスでは、仮想モザイクに対して物理モザイクとも呼ばれる1つのGeoRasterオブジェクトが生成されます(仮想モザイクの詳細は、「仮想モザイク」を参照してください)。

SDO_GEOR.mosaicプロシージャおよびSDO_GEOR_AGGR.mosaicSubsetプロシージャはイメージのモザイク処理をサポートしますが、SDO_GEOR_AGGR.mosaicSubsetの方がより多くの高度な機能とオプションを備えており、パラレル処理も実装されているため、このプロシージャの使用を強くお薦めします。SDO_GEOR_AGGR.mosaicSubsetは、ソース・イメージとして仮想モザイク(GeoRaster表のリスト、GeoRaster列のあるデータベース・ビュー、REF CURSORなど)を使用できます。

SDO_GEOR.mosaicプロシージャは、幾何補正され、同じSRIDに基づいて地理空間的に配置され、同じ解像度を持つソースGeoRasterイメージのセットをモザイク処理します。モザイクの結果は、別のGeoRasterオブジェクトです。ソース・イメージ間に重複がある場合、モザイクの結果は、重複する領域にある最後のソース・イメージの内容を含みます。このプロシージャは、事前処理されて完全に配置されたソース・イメージに対して適切に動作します。

この項の例では、ソース・イメージは、次の列を使用して定義されたソースGeoRaster表のGRTAB、GRTAB1およびGRTAB2に格納されます。

  (id          NUMBER PRIMARY KEY,
  cloud_cover  NUMBER     -- percentage of cloud coverage 
  last_update  TIMESTAMP  -- GeoRaster object's last update time
  grobj        SDO_GEORASTER )

これらの表で、GeoRasterオブジェクトのspatialExtent属性に対してOracle Spatial and Graphの空間索引が作成されています。

次の例で、モザイク処理されたイメージは、「記憶域パラメータ」で定義されているGEORASTER_TABLEに格納されます。

例5-19 SDO_GEOR.mosaic (表および列名)

例5-19に、SDO_GEOR.mosaicプロシージャを示します。

DECLARE
  gr sdo_georaster;
BEGIN
  INSERT INTO georaster_table (georid, georaster) 
      VALUES (12, sdo_geor.init('rdt_1'))
      RETURNING georaster INTO gr;
  sdo_geor.mosaic('grtab', 'grobj', gr, 'blocksize=(512,512,1)');
  UPDATE georaster_table SET georaster=gr WHERE id=12;
END;
/

ただし、実際のソース・イメージは、通常、異なる解像度や大規模な重複領域を持つ異なる環境下で、または異なる地理参照システムを使用して収集されます。この場合、SDO_GEOR_AGGR.mosaicSubsetプロシージャを使用して、これらのソース・イメージを1つの均一なモザイク・イメージにモザイク処理できます。SDO_GEOR.mosaicと比較して、SDO_GEOR_AGGR.mosaicSubsetプロシージャではより多くの機能とオプションが提供されます。

  • ソース・イメージは、同じ座標系(SRID)にある必要はなく、同じ地理参照情報または解像度を持ちます。

  • ソース・イメージは、ユーザーが指定したピラミッド・レベルでモザイク処理されます。

  • ソース・イメージは、ユーザーが指定したバンドでモザイク処理されます。

  • 出力イメージは、入力イメージとは異なる座標系および解像度を持つことができます(outSRIDおよびoutResolutionsパラメータ)。

  • mosaicParamパラメータを通じて重複する領域の出力を詳細に制御できます(commonPointRuleでは重複する領域での出力のために使用するセル値を指定でき、NODATAでは重複する領域でのNODATA値を考慮するかどうかを指定できます)。

  • 出力モザイク・イメージを指定した点に配置できます(参照点)。ソース・イメージは、mosaicParamに指定されたresampleTolerance値より多くずれている場合、参照点に揃えるためにリサンプリングできます。

  • fillGapmosaicParamtrueである場合、ソース・イメージ間に2ピクセル未満の小さい切れ目があっても、周囲のピクセル値を使用して埋めることができます。

  • 制限付きのカラー・バランス(線形ストレッチおよび正規化)がサポートされます。

  • モザイク処理プロセスを高速化するためにパラレル処理がサポートされます。

例5-20 SDO_GEOR_AGGR.mosaicSubset

例5-20では、SDO_GEOR_AGGR.mosaicSubsetを使用して、2つのGeoRaster表(GRTAB1およびGRTAB2)のすべてのソース・イメージを、XおよびY次元で30mの解像度を持つSRID 4326の大規模なモザイク・イメージにモザイク処理します。

DECLARE
  resolutions sdo_number_array;
  gr sdo_georaster;
BEGIN
    insert into georaster_table (georid, georaster)
        values (10, sdo_geor.init('RDT_1',10))
         returning georaster into gr;
 
    resolutions := sdo_number_array(30, 30);
    sdo_geor_aggr.mosaicSubset('grtab1, grtab2', 'grobj, grobj',
                               0, 4326, null, null, null,
                               null, null, null, resolutions, 'unit=meter',
                               'commonPointRule = end, nodata=true, resampleTolerance=0.2, resampling=bilinear, fillGap=true',
                               'blocksize=(512, 512, 3)', gr, null, 'parallel=4');
 
      update georaster_table set georaster = gr where georid=10;
      commit;                                                              
END;
/

次に、例5-20について説明します。

  • 幾何補正されていないソース・イメージは幾何補正され、SRID 4326ではないソース・イメージはSRID 4326に再投影されます。

  • 30m以外の解像度を持つソース・イメージは、30mの解像度にスケール変更されます。

  • mosaicParamパラメータのnodataキーワードはtrueに指定されているため、重複する領域のNODATA値は考慮されません。

  • mosaicParamパラメータのresampleToleranceキーワードは0.2に指定されているため、ソース・イメージがターゲットから0.2ピクセルより多くオフセットされる場合、ソース・イメージはリサンプリングされます。

  • リサンプリング・メソッドは、mosaicParamパラメータでbilinearに指定されています。

  • 並列度は、parallelParamパラメータで4に指定されています。

SDO_GEOR_AGGR.getMosaicSubsetをコールする前にSDO_GEOR_AGGR.validateForMosaicSubsetをコールして、ソース・イメージがモザイク処理可能であることを確認できます。

5.15.1 パラレル圧縮、コピー、サブセット化、再投影および幾何補正

SDO_GEOR_AGGR.mosaicSubsetプロシージャは、単一のGeoRasterオブジェクトを入力として受け取ることができます。このプロシージャを使用すると、様々なタイプのパラレル操作、たとえばパラレル圧縮と解凍、パラレル・コピーまたは形式変更コピー、パラレル・サブセット化、パラレル再投影、パラレル幾何補正を実行できます。この項では、このような操作の例を示します。これらのどのケースでも、SDO_GEOR_AGGR.mosaicSubsetプロシージャは単一のGeoRasterオブジェクトに作用します。

パラレル化操作をわかりやすく説明するために、この項の例ではほとんどのパラメータにnull値を使用しています。実際のアプリケーションでは、SDO_GEOR_AGGR.mosaicSubsetプロシージャのその他のパラメータすべてを適用できますが、mosaicParamパラメータは、入力が単一GeoRasterオブジェクトのときは効果を持ちません。

例5-21 パラレル圧縮

例5-21に、SDO_GEOR_AGGR.mosaicSubsetプロシージャを使用するパラレル圧縮を示します。これは、DEFLATEとJPEGの両方の圧縮および解凍に適用されます。

DECLARE
  gr sdo_georaster;
  cur sys_refcursor;
  crop_area sdo_geometry := null;
BEGIN
  -- create a new georaster object with georid = 2 
  -- to hold the compressed image
  delete from georaster_table where georid = 2;
  insert into georaster_table(georid, georaster) values (2, 
     sdo_geor.init('RDT2', 2)) returning georaster into gr;
 
  -- compress the image with georid = 1 into JPEG using parallel degree of 8 
  open cur for 'select georaster from georaster_table where georid = 1';
  sdo_geor_aggr.mosaicSubset(cur, 0, null, null, null, crop_area, 
                             null, null, null, null, null, null,
                             'compression=JPEG-F', gr, null, 'parallel=8');
 
  update georaster_table set georaster = gr where georid = 2;
  commit;
END;
/

例5-22 パラレル・コピー

例5-22に、SDO_GEOR_AGGR.mosaicSubsetプロシージャを使用するパラレル・コピーを示します。

DECLARE
  gr sdo_georaster;
  cur sys_refcursor;
  crop_area sdo_geometry := null;
BEGIN
  -- create a new georaster object with georid = 2 to hold the copy
  delete from georaster_table where georid = 2;
  insert into georaster_table(georid, georaster) values (2, 
     sdo_geor.init('RDT2', 2)) returning georaster into gr;
 
  -- make a copy of the image with georid = 1 using parallel degree of 8 
  open cur for 'select georaster from georaster_table where georid = 1';
  sdo_geor_aggr.mosaicSubset(cur, 0, null, null, null, crop_area,
                             null, null, null, null, null, null,
                             'pyramid=true', gr, null, 'parallel=8');
  update georaster_table set georaster = gr where georid = 2;
  commit;
END;
/

例5-22では、storageParamパラメータを調整すると、パラレル化したSDO_GEOR.changeFormatCopy操作として機能するようになります。crop_areaを適用した場合は(デフォルト値nullを使用するかわりに)、パラレル化したSDO_GEOR.subset操作として機能し、ポリゴンのクリップを実行できます。

例5-23 パラレル幾何補正または再投影

例5-23に、SDO_GEOR_AGGR.mosaicSubsetプロシージャを使用するパラレル幾何補正または再投影を示します。幾何補正と再投影にこの方法を使用する場合は、出力の解像度は指定したソース・ピラミッド・レベルの解像度の0.75倍以上1.5倍以下とする必要があります。

DECLARE
  gr sdo_georaster;
  cur sys_refcursor;
  crop_area sdo_geometry := null;
  out_res sdo_number_array := sdo_number_array(30, 30);
BEGIN
  -- create a new georaster object with georid = 2 to hold the result
  delete from georaster_table where georid = 2;
  insert into georaster_table(georid, georaster) values (2, 
     sdo_geor.init('RDT2', 2)) returning georaster into gr;
 
  -- rectify the image with georid = 1 into SRID 32611 and 
  -- resolution 30 by 30 using parallel degree of 4 
  open cur for 'select georaster from georaster_table where georid = 1';
  sdo_geor_aggr.mosaicSubset(cur, 0, 32611, null, null, crop_area,
                             null, null, null, out_res, null, 
                             'resampling=bilinear', null, gr, null, 
                             'parallel=4');
  update georaster_table set georaster = gr where georid = 2;
  commit;
END;
/

5.16 仮想モザイク

一部のアプリケーションでは、イメージのコレクションをモザイク処理して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$を使用した問合せパフォーマンスの向上」を参照してください。

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

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

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

例5-24 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;
/

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

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

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

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

例5-25 仮想モザイクのための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;
/

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

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

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

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

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

5.16.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と同じ定義を使用して作成され、Oracle Spatial and Graphの空間索引がこれらの表のGeoRasterオブジェクトのspatialExtent属性に対して作成されています。

  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が、指定したピラミッド・レベルのソース・イメージの解像度と同じである場合、ピラミッド・データは出力モザイクで使用されますが、それ以外の場合、ソース・イメージはターゲットの解像度にスケール変更されます。

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

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

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

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

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

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

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

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

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

同じ領域に多くの異なる解像度レベルが含まれる場合に(複数の仮想モザイクを定義すること以外で)仮想モザイクの問合せを高速化するより一般的なソリューションは、GeoRaster表またはビューのMIN_X_RES$および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));
    

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

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のリファレンスの項を参照してください。

5.17 イメージの提供

イメージおよびラスター・データのクライアントまたはアプリケーションへの提供は、GeoRaster PL/SQLおよびJava APIの多くの機能を通じてサポートされます。

直接イメージ提供には、ラスターの検索とそれに続くサブセット化またはクロッピング(SDO_GEOR.getRasterSubset)、イメージのクロッピング中の再投影および幾何補正のオンザフライでの適用(SDO_GEOR.reprojectおよびSDO_GEOR.rectify)、およびファイルへの直接エクスポート(SDO_GEOR.exportTo)が含まれます。

仮想モザイクは、特に大規模な物理モザイクの作成を希望しない場合に、様々なアプリケーションにイメージ・データベースを提供するために主として(効率的に)使用されます。仮想モザイクでは、ソース・イメージを事前処理したり、前もってモザイク処理する必要はありません。かわりに、すべてのイメージは現状のまま格納され、イメージ・データ・セット全体を1回のコール(SDO_GEOR_AGGR.getMosaicSubset)を使用して小さい対象領域に基づいてサーバーに提供できます。

通常、1つまたは一連の事前処理操作が複数のGeoRasterオブジェクトに適用され、結果のGeoRasterオブジェクトが作成されて、アプリケーションにラスター・データを直接提供するために、この項で説明されている機能が結果のGeoRasterオブジェクトに対して使用されます。つまり、GeoRasterイメージ操作とラスター代数機能の豊富なセット(「基本的なGeoRaster操作」「ラスター代数および分析」およびこの章を参照)を、複雑なイメージ提供要件を満たすためにワークフローに統合できます。