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

前
次

3 基本的なGeoRaster操作

この章では、GeoRasterの主な基本的操作を実行する方法について説明します。GeoRasterデータベースを構築して管理するための通常のワークフローは、次のほとんどまたはすべての手順で構成されます。

  1. GeoRaster表およびラスター・データ表を作成します(「GeoRaster表およびラスター・データ表の作成」を参照)。

  2. GeoRasterオブジェクトを初期化または作成します(「新しいGeoRasterオブジェクトの作成」を参照)。

  3. GeoRasterユーザー用の一時表領域を追加します(「GeoRasterユーザーに対する一時表領域の追加」を参照)。

  4. ラスター・イメージまたはグリッドをロードします(「ラスター・データのロード」を参照)。

  5. 検証されていないGeoRasterオブジェクトを検証します(「GeoRasterオブジェクトの検証」を参照)。

  6. 必要に応じて、GeoRasterオブジェクトを地理参照します(「GeoRasterオブジェクトの地理参照」を参照)。

  7. GeoRasterオブジェクトの空間エクステントを設定します(「空間エクステントの生成と設定」を参照)。

  8. 空間索引または他の索引あるいは両方を作成します(「GeoRasterオブジェクトの索引付け」を参照)。

  9. GeoRasterオブジェクトを問合せおよび検索します(「GeoRasterオブジェクトの問合せと検索」を参照)。

  10. 必要に応じて、GeoRasterの記憶域形式を変更および最適化します(「ラスター記憶域の変更と最適化」を参照)。

  11. GeoRasterオブジェクトをコピーします(「GeoRasterオブジェクトのコピー」を参照)。

  12. GeoRasterメタデータを問合せおよび更新します(「GeoRasterメタデータの問合せおよび更新」を参照)。

  13. セル・データを問合せおよび更新します(「GeoRasterセル・データの問合せおよび更新」を参照)。

  14. セル値を内挿します(「セル値の内挿」を参照)。

  15. GeoRasterオブジェクトを処理および分析します(「GeoRasterオブジェクトの処理および分析」を参照)。

  16. GeoRaster操作の進行状況を監視およびレポートします(「GeoRaster操作の進行状況の監視およびレポート」を参照)。

  17. 必要に応じて、GeoRasterオブジェクトを圧縮します(「GeoRasterオブジェクトの圧縮と解凍」を参照)。

  18. GeoRasterオブジェクトを削除し、GeoRaster表およびRDTを削除します(「GeoRasterオブジェクトの削除とGeoRaster表およびRDTの削除」を参照)。

  19. GeoRasterオブジェクトを表示します(「GeoRasterオブジェクトの表示」を参照)。

  20. GeoRasterオブジェクトをエクスポートします(「GeoRasterオブジェクトのエクスポート」を参照)。

  21. トランザクションをコミットする前にGeoRasterオブジェクトを更新します(「コミット前のGeoRasterオブジェクトの更新」を参照)。

  22. テンプレート関連のサブプログラムを使用してGeoRasterアプリケーションを開発します(「テンプレート関連のサブプログラムを使用したGeoRasterアプリケーションの開発」を参照)。

  23. Workspace ManagerおよびLabel SecurityでGeoRasterを使用します(「Workspace ManagerおよびLabel SecurityでのGeoRasterの使用」を参照)。

  24. GeoRasterオブジェクトによる表領域の効率的な使用をメンテナンスします(「GeoRasterオブジェクトによる表領域の効率的な使用のメンテナンス」を参照)。

  25. データベースのGeoRasterオブジェクトおよびシステム・データをメンテナンスします(「データベースのGeoRasterオブジェクトおよびシステム・データのメンテナンス」を参照)。

  26. データベース間でGeoRasterデータを転送します(「データベース間でのGeoRasterデータの転送」を参照)。

  27. GeoRasterデータにOracle Databaseのトランスポータブル表領域機能を使用します(「GeoRasterデータでのトランスポータブル表領域の使用」を参照)。

GeoRasterオブジェクトを作成し、データをロードしてGeoRasterオブジェクトを検証した後は、アプリケーションの要件に応じて、残りの操作を任意の順序で実行できます。特定の操作をスキップすることもできます。

SQLを使用して実行できる操作と、PL/SQLブロックを使用して実行する必要がある操作があります。GeoRasterオブジェクトのメタデータやセル・データを挿入、更新、形式変更、圧縮、解凍または削除した後は、変更をコミットする前にGeoRasterオブジェクトを更新する必要があります(「コミット前のGeoRasterオブジェクトの更新」を参照)。これらの操作の例の詳細は、「GeoRasterのPL/SQLおよびJavaデモ・ファイル」のデモ・ファイルおよび「SDO_GEORパッケージのリファレンス」に示す例を参照してください。

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

3.1 GeoRaster表およびラスター・データ表の作成

GeoRasterオブジェクトで操作を行う前に、GeoRaster表および(作成していない場合は)1つ以上のラスター・データ表を作成する必要があります。

3.1.1 GeoRaster表の作成

GeoRaster表は、SDO_GEORASTER型の1つ以上の列を含む任意の表です。この列は、別のユーザー定義のオブジェクト型の属性列とすることも可能です。例3-1では、CITY_IMAGESというGeoRaster表を作成します。この表には、GeoRasterオブジェクトを格納するためのIMAGEという列が含まれています。

例3-1 City ImagesのGeoRaster表の作成

CREATE TABLE city_images (image_id NUMBER PRIMARY KEY, image_description VARCHAR2(50), image SDO_GEORASTER);

GeoRaster表の詳細は、「GeoRasterの物理記憶域」を参照してください。

3.1.2 ラスター・データ表の作成

GeoRaster表を作成したら、GeoRaster表のオブジェクトとともに使用する1つ以上のラスター・データ表(RDT)を作成する必要があります。ラスター・データ表は、オブジェクト表として、またはリレーショナル表として作成できます。RDTを作成する場合、LOB記憶域形式のSecureFiles LOB (SecureFiles)を使用する必要があります。SecureFilesを使用すると、従来のLOB記憶域パラダイムのBasicFiles LOB (BasicFiles)を使用する場合と比較して、GeoRaster操作のパフォーマンスが大幅に向上します。

例3-2では、SecureFilesを使用してラスター・データ表を作成します。RDTを使用して、CITY_IMAGES表または他のGeoRaster表に含まれる1つ以上のGeoRasterオブジェクトのすべてのラスター・ブロックを格納します。(GeoRasterオブジェクトを作成するまで、GeoRasterオブジェクトとラスター・データ表の関連は確立されません(「新しいGeoRasterオブジェクトの作成」を参照))。

例3-2 SecureFilesを使用したラスター・データ表の作成

CREATE TABLE city_images_rdt OF SDO_RASTER
  (PRIMARY KEY (rasterID, pyramidLevel, bandBlockNumber,
    rowBlockNumber, columnBlockNumber))
  TABLESPACE im_tbs_2
  LOB(rasterBlock) STORE AS SECUREFILE
    (CACHE);

例3-3 SecureFilesを使用したラスター・データ表(リレーショナル)の作成

例3-3では、同様にSecureFilesを使用して例3-2と同じ名前のラスター・データ表を作成しますが、オブジェクト表ではなくリレーショナル表としてそれを作成します。

CREATE TABLE city_images_rdt
  (rasterID NUMBER,
  pyramidLevel NUMBER,
  bandBlockNumber NUMBER,
  rowBlockNumber NUMBER,
  columnBlockNumber NUMBER,
  blockMBR SDO_GEOMETRY,
  rasterBlock BLOB,
  CONSTRAINT pkey PRIMARY KEY (rasterId, pyramidLevel, bandBlockNumber,
    rowBlockNumber, columnBlockNumber))
  LOB (rasterblock) STORE AS SECUREFILE(cache);

ラスター・データ表のCREATE TABLE文には、次の句を含める必要があります(前述の例に含まれています)。

  (PRIMARY KEY (rasterID, pyramidLevel, bandBlockNumber,
    rowBlockNumber, columnBlockNumber))

このPRIMARY KEY句によって、ラスター・データ表にBツリー索引を作成します(この索引は、最適な問合せパフォーマンスのために必須です)。

BasicFilesを使用する場合、より大きいCHUNKサイズ(16または32KB)を指定して、LOB記憶域のパフォーマンスを向上できます。SecureFilesでは、CHUNKサイズ・パラメータを指定する必要はありませんが、別のいくつかの記憶域パラメータを考慮する必要があります。SecureFiles LOBを使用するラスター・データ表は、自動セグメント領域管理オプション付きの表領域に作成する必要があります。Oracle SecureFilesの使用方法とBasicFiles LOBのパフォーマンス上の考慮事項の詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。

LOB記憶域の指定を含む、表の作成のリファレンス情報については、『Oracle Database SQL言語リファレンス』のCREATE TABLE文に関する項を参照してください。

ラスター・データ表を作成する場合のキーワードおよびオプションの詳細は、「ラスター・データ表」を参照してください。

3.1.3 GeoRaster DMLトリガー

GeoRasterの内部表とデータ構造の一貫性および整合性を保証するために、ユーザーがGeoRaster表(1つ以上のGeoRaster列を含む表)を作成すると、各GeoRaster列に対応する一意のDMLトリガーがGeoRasterにより自動的に作成されます。ただし、ALTER TABLE文を使用して1つ以上のGeoRaster列を追加する場合は、SDO_GEOR_UTL.createDMLTriggerプロシージャをコールして、追加した各GeoRaster列に対してDMLトリガーを作成する必要があります。データベース・アップグレードやデータ移行などの一部の使用例では、SDO_GEOR_UTL.recreateDMLTriggersプロシージャをコールしてすべてのGeoRaster列にDMLトリガーを再作成できます。

トリガーが起動されるのは、GeoRasterオブジェクトに影響を及ぼすデータ操作言語(DML)の各操作(行の挿入、GeoRasterオブジェクトの更新、および行の削除)の実行後です。

トリガーが起動されると、次のアクションが自動的に実行されます。

  • 挿入操作を実行すると、トリガーによって、GeoRaster表の名前、GeoRaster列の名前、ラスター・データ表の名前およびrasterID値を含む行がUSER_SDO_GEOR_SYSDATAビューに挿入されます(「GeoRasterシステム・データ・ビュー(xxx_SDO_GEOR_SYSDATA)」を参照)。同一のエントリがすでに存在する場合、例外が発生します。

  • 更新操作を実行すると、新しいGeoRasterオブジェクトがNULLまたは空である場合、トリガーによって、古いGeoRasterオブジェクトが削除されます。古いGeoRasterオブジェクトのUSER_SDO_GEOR_SYSDATAビューにエントリが存在しない場合(古いGeoRasterオブジェクトがNULLの場合)、トリガーによって、新しいGeoRasterオブジェクトのビューに行が挿入されます。古いGeoRasterオブジェクトのUSER_SDO_GEOR_SYSDATAビューにエントリが存在する場合、トリガーによって、新しいGeoRasterオブジェクトを反映するように情報が更新されます。

  • 削除操作を実行すると、トリガーによって、GeoRasterオブジェクトのラスター・データ・ブロックがラスター・データ表から削除され、そのGeoRasterオブジェクトの行がUSER_SDO_GEOR_SYSDATAビューから削除されます。

3.2 新しいGeoRasterオブジェクトの作成

GeoRaster表にGeoRasterイメージを格納する前に、GeoRasterオブジェクトを作成し、作業の開始前にそのオブジェクトをGeoRaster表に挿入する必要があります。新しいGeoRasterオブジェクトを作成するには、次の方法があります。

  • SDO_GEOR.initファンクションを使用して、空のGeoRasterオブジェクトを初期化します。

  • SDO_GEOR.createBlankファンクションを使用して、空白のGeoRasterオブジェクトを作成します。

オブジェクトが適切に作成されていない場合(オブジェクトがアトミックなNULLの場合)、いずれのGeoRaster操作も実行できません。SDO_GEOR.initおよびSDO_GEOR.createBlankファンクションは、ラスター・データ表の名前およびラスターID値が指定されていない場合に、それらの値でGeoRasterオブジェクトを初期化します。GeoRaster DMLトリガーは、ラスター・データ表の名前とラスターID値の組合せが現行ユーザーに対して一意であることを保証します。

(SDO_GEOR.importFromSDO_GEOR.subsetSDO_GEOR.copyなどの別のGeoRasterプロシージャの結果として)新しいGeoRasterオブジェクトにラスター・セル・データが含まれ、この新しいGeoRasterオブジェクトに対するラスター・データ表が存在しない場合は、まずラスター・データ表を作成する必要があります。ラスター・データ表を作成する方法とその例の詳細は、「ラスター・データ表の作成」を参照してください。

GeoRasterのデータについて考えられる問題(その一部は「データベースのGeoRasterオブジェクトおよびシステム・データのメンテナンス」で説明しています)を防止するには、初期化済のGeoRasterオブジェクトがGeoRasterのシステム・ビューに登録されている必要がありますが、これはGeoRasterオブジェクトをGeoRasterの表に挿入したときに自動的に行われます。これは、そのGeoRasterオブジェクトに対して他のなんらかの操作を行う前に実行する必要があります。ソースまたはターゲットのGeoRasterオブジェクトが登録されていない場合、ラスター・データ表を操作する必要のあるGeoRaster操作を実行すると、例外が発生します。

3.3 GeoRasterユーザーに対する一時表領域の追加

GeoRasterデータベースは一般的に非常に大きく、操作によっては一時表領域が使用されることがあります。GeoRaster操作(特に大規模なモザイク処理操作)に圧縮が含まれる場合、圧縮済または未圧縮の中間データを格納するために一時領域が必要です。GeoRasterユーザーが一時表領域を持たない場合、データベース・システムの一時表領域が使用されます。これは、効率的ではなく、モザイク処理などの操作速度が低下する可能性があります。そのため、常にGeoRasterユーザーに一時表領域を作成する必要があります。次に例を示します。

CONNECT system/<password>; 
CREATE TEMPORARY TABLESPACE geor_temp TEMPFILE 'geor_temp_1.f' SIZE 1G AUTOEXTEND ON; 
ALTER USER <georaster_user> TEMPORARY TABLESPACE geor_temp;

通常、必要とされる一時領域の容量は限定されます。ただし、大規模なモザイク処理で、結果が圧縮される場合、必要とされる一時領域は、結果の未圧縮のイメージ・サイズと等しくなります。したがって、GeoRasterユーザー用の一時表領域を作成するときにAUTOEXTEND ONを指定します。

3.4 ラスター・データのロード

イメージまたはラスター・データをロードおよびエクスポートする場合、常にサード・パーティのETLツールの使用を検討してください(「GeoRasterツール: ビューア、ローダー、エクスポータ」の「注意」を参照)

GeoRasterの機能を使用してラスター・データをロードする場合、次の方法があります。

最初の2つのオプション(SDO_GEOR.importFromとJAIベースのツール)では、次のことを実行できます。

  • ラスター・データを圧縮し、データをJPEG圧縮またはDEFLATE圧縮されたGeoRasterオブジェクトに保存します。

  • ESRIワールド・ファイルまたはDigital Globe RPCテキスト・ファイル(.rpb)を既存のGeoRasterオブジェクトにロードし、リロードせずにラスター・データを地理参照します。ワールド・ファイルでSRIDを指定し、データの空間エクステントを生成することもできます。

  • ラスター・データの有無にかかわらず、地理参照とともにGeoTIFF形式のファイルをロードします。GeoTIFFイメージの地理参照情報をロードおよびエクスポートするには、GeoTIFFライブラリが必要です。手順については、「GeoRasterオブジェクトの地理参照」を参照してください。

イメージまたはラスター・ファイルをGeoRasterオブジェクトにロードする場合、ファイル形式によってブロック化方法は大きく異なる可能性があるため、常にデータの適切なブロック化を考慮して適用してください。一般的に、ブロック化サイズは256x256以上である必要があります。ブロック化サイズに絶対的なルールはありませんが、ラスターが大きくなるほど、使用する可能性のあるブロック化サイズも大きくなります。通常のラスターの場合、512x512から2048x2048が適切です。非常に小さいイメージ(1024x1024x3未満)の場合、通常はブロック化なしが適切な選択です。小さすぎたり(64x64、128x128など)、大きすぎるブロック化サイズや、1ブロック当たりのピクセル数が0.5 (2分の1)、1、8行などの極端なブロック化サイズは避けてください。通常、ブロックの矩形は、正方形または正方形に近い形にする必要があります。異なるアプリケーションごとに、効率的な記憶域と最適なパフォーマンスのバランスを取るようにブロック化を調整できます。

GeoRasterオブジェクトにラスター・データをロードしたら、SDO_GEOR.validateGeoRasterファンクションをコールしてそのオブジェクトが有効であることを確認する必要があります(「 GeoRasterオブジェクトの検証」を参照)。

ESRIワールド・ファイルまたは.rpbファイルには座標系の情報が含まれていないため、ロード操作用に座標参照システムのSRID値を指定することができます。ただし、SRIDを指定しない場合は、ローダーによりGeoRasterオブジェクトのモデルSRIDが0(ゼロ)に設定されます。これは、GeoRasterオブジェクトが無効であり、そのため、SDO_GEOR.setModelSRIDプロシージャを使用してこのオブジェクトに有効なモデル空間を指定する必要があることを意味します。モデル空間の座標系が不明である場合は、SRIDの値を999999に指定できます。これは、座標参照システムが不明であることを意味します。(具体的には、SRID 999999はunknown CRSという座標参照システムに関連付けられます。)モデル空間の実際の座標参照システムがわかった後で、それに応じてSRID値を設定できます。

unknown CRS (SRID 999999)の座標参照システムの詳細は、『Oracle Spatial and Graph開発者ガイド』を参照してください。

3.4.1 ロード前のソース・ラスターの再フォーマット

GeoRasterのJAIベースのローダーでは、BSQインターリーブ形式のソース・ラスター・ファイルがサポートされないため、ファイルが大きすぎるとメモリー不足のエラーが発生する可能性があります。また、その他の制限も適用される場合があります。このような問題を回避するには、ソース・ファイルが適切にロードされるようにソース・ファイルを再フォーマットおよび再ブロック化します。

たとえば、この操作を行う方法の1つに、GDALの使用があります(GDALは、http://www.gdal.orgから入手できるオープン・ソースのラスター変換ライブラリであり、JAI (Java Advanced Imaging)で処理するためにイメージ・ファイルやラスター・ファイルを再フォーマットまたは再ブロック化できます)。GDALは、GeoRasterをネイティブにサポートし、GeoRasterオブジェクトを直接インポートおよびエクスポートでき、また、GeoRasterオブジェクトを処理できます(詳細は、http://www.oracle.com/technetwork/database/enterprise-edition/getting-started-with-gdal-133874.pdfを参照してください)。また、GDALを使用してTFWファイルを生成することもできます。たとえば、GDALコマンドラインまたは(一括変換の場合は)シェルを使用して、それぞれ単一行で次の2つのようなコマンドを実行します。

gdal_translate -of GTiff -co "TFW=YES" -co "INTERLEAVE=PIXEL" -co "TILED=YES" D:\my_image.tif D:\my_new_image.tif
 
gdal_translate -of GTiff -co "TILED=YES" -co "TFW=YES" D:\my_image.ecw D:\my_new_image.tif

前述の例で、最初のコマンドはTFWファイルを生成し、インターリーブを(JAIでサポートされる)BIPに変更して、イメージを256x256に再ブロック化します。2つ目のコマンドは、ECWをTIFFに変換し、TFWを生成してイメージを再ブロック化します。

その後、GeoRasterローダー・ツール(「GeoRasterツール: ビューア、ローダー、エクスポータ」を参照)を使用して再ブロック化を指定し、イメージを適切にロードして、後でデータベースから効率的に取得できるようにします。次に、単一コマンドの例を示します。

java -Xmx1024m oracle.spatial.georaster.tools.GeoRasterLoader mymachine db11 6521 georaster georaster thin 32 T globe image "blocking=true, blocksize=(512,512,3)" "D:my_image.tif,2,RDT_15, D:\my_image.tfw,82213"

SDO_GEOR.importFromをコールして非常に大きいイメージをロードしようとしたときにメモリー不足のエラーが発生した場合は、異なるブロック化サイズ・パラメータでイメージをロードするか、ロード前にGDALを使用してイメージをより小さい内部矩形サイズに再ブロック化してください。極端に大きいイメージの場合、GDALを使用して、そのイメージをより小さいサイズ(JAIで処理できるサイズ)の複数のイメージ・ファイルにタイル処理することや、GDALを使用してそのイメージを直接ロードおよびエクスポートすることも可能です。

3.5 GeoRasterオブジェクトの検証

GeoRasterオブジェクトを使用する前、またはGeoRasterオブジェクトのラスター・データおよびメタデータを手動で編集した後、そのオブジェクトが有効であることを確認する必要があります。GeoRasterオブジェクトの検証では、GeoRasterオブジェクトの登録の確認、メタデータとラスター・セル・データの確認、およびメタデータとデータに一貫性があるかどうかの確認が行われます。たとえば、検証では、ラスター型、ディメンション情報およびセル・ブロックの実際のサイズが確認され、その他の確認が行われます。

GeoRasterローダー・ツール(「GeoRasterツール: ビューア、ローダー、エクスポータ」を参照)を使用した場合、GeoRasterオブジェクトはロード操作時に検証されています。

GeoRasterは、次の検証サブプログラムを提供します。

  • SDO_GEOR.validateGeoRaster: セル・データおよびメタデータを含む、GeoRasterオブジェクトを検証します。オブジェクトが有効な場合はTRUEを戻します。有効でない場合は、GeoRasterオブジェクトが無効である理由を示すOracleエラー・コード、FALSE(不明な理由によって検証が失敗した場合)、またはNULL(GeoRasterオブジェクトがNULLの場合)のいずれかを戻します。GeoRasterオブジェクトの作成後は、常にこのファンクションを使用する必要があります。

  • SDO_GEOR.schemaValidate: GeoRasterのXMLスキーマに対してメタデータを検証します。SDO_GEOR.validateGeoRasterファンクションによってエラー・コード13454が戻された場合、このファンクションを使用してエラーの場所を特定できます。SDO_GEOR.schemaValidateおよびSDO_GEOR.validateGeoRasterファンクションは、空間エクステント・ジオメトリを検証しません。

  • SDO_GEOR.validateBlockMBR: ラスター・データ表に格納された各ラスター・ブロックに関連するblockMBRジオメトリを検証します。無効なblockMBRジオメトリが存在する場合は、SDO_GEOR.generateBlockMBRプロシージャをコールしてそれらを再生成します。

3.6 GeoRasterオブジェクトの地理参照

地理参照(「地理参照」を参照)によって、GeoRasterデータのセル座標と実際の地上座標(またはいくつかのローカル座標)が関連付けられます。GeoRasterオブジェクトを地理参照する必要がある場合、次の方法を使用できます。

  • 元のイメージがすでに地理参照されており、その地理参照情報がESRIワールド・ファイルまたはRPC係数を含む.rpbファイルに格納されている場合は、SDO_GEOR.importFromプロシージャを使用して、ファイルまたはCLOBオブジェクトから、(FILEまたはBLOB形式の)イメージ・データ自体とともに、ESRIワールド・ファイルまたは.rpbファイルをロードできます。GeoRasterのクライアント側ローダー・ツール(「GeoRasterツール: ビューア、ローダー、エクスポータ」を参照)を使用して、イメージ・ファイル自体とともに、ESRIワールド・ファイルまたは.rpbファイルをファイルからロードすることもできます。

    ESRIワールド・ファイルまたは.rpbファイルではモデル座標系が指定されないため、Oracle SRIDを使用して地理参照されるGeoRasterオブジェクトのモデル空間を、次のいずれかの方法で設定できます。ワールド・ファイルとともにSDO_GEOR.importFromプロシージャまたはGeoRasterのクライアント側ローダー(「GeoRasterツール: ビューア、ローダー、エクスポータ」を参照)に対してSRIDをパラメータとして指定するか、またはワールド・ファイルのロード後に、SDO_GEOR.setModelSRIDプロシージャをコールします。SDO_GEOR.setModelSRIDプロシージャをコールして、地理参照されるGeoRasterオブジェクトのモデル空間を変更することもできます。

  • 元のイメージが、地理参照されるGeoTIFFイメージの場合、SDO_GEOR.importFromプロシージャを使用し、入力形式としてGEOTIFFを指定することで、地理参照とともにイメージをロードできます。GeoTIFFイメージからラスター・イメージ・データなしで地理参照情報のみを既存のGeoRasterオブジェクトにロードするには、raster=false記憶域パラメータを追加します。GeoTIFFの構成値が、Oracle Spatial and Graphによって認識されるSRIDと一致しない場合、srid記憶域パラメータ付きでバックアップSRIDを指定できます。

    GeoTIFF PixelIsAreaラスター空間は、左上角を基準とするGeoRasterのセル座標系と同じです。GeoTiffへのエクスポートは、常にPixelIsAreaラスター空間が対象となります(GeoRasterオブジェクトが中央を基準とするセル座標系の場合は、アフィン変換で2分の1ピクセル単位の調整が行われます)。GeoTIFFからのインポートは、常に中央を基準とするGeoRasterのセル座標系が対象となります(GeoTIFFファイルがPixelIsAreaラスター空間で指定されている場合は、アフィン変換で2分の1ピクセル単位の調整が行われます)。

    GeoRasterのクライアント側ローダー・ツール(「GeoRasterツール: ビューア、ローダー、エクスポータ」を参照)を使用して、geotiff=true記憶域パラメータの指定により地理参照とともにGeoTIFFイメージをロードすることもできます。このパラメータを省略するか、geotiff=falseを指定すると、イメージは地理参照なしの単純なTIFFイメージとしてロードされます。rasterおよびsrid記憶域パラメータも、クライアント側ローダー・ツールに適用されます。

    GeoRasterのクライアント側ツールでGeoTIFFイメージをロードまたはエクスポートするには、次のGeoTIFFライブラリを現在のCLASSPATH定義に追加します。

    • xtiff-jai.jar (SourceForge Extensible-TIFF-JAIグループから入手可能)

    • geotiff-jai.jar (SourceForge GeoTIFF-JAIグループから入手可能)

    SDO_GEOR.importFromまたはSDO_GEOR.exportToプロシージャでGeoTIFFイメージをロードまたはエクスポートする場合は、これらのライブラリをMDSYSスキーマにロードする必要があります。これを行うには、SYSTEMユーザーとしてデータベースに接続し、xtiff-jai.jarおよびgeotiff-jai.jarファイルへのパスを反映するように必要に応じて$ORACLE_HOME/md/admin/sdoldgtf.sqlを編集し、sdoldgtf.sql SQL*Plusスクリプトを実行します。sdoldgtf.sqlスクリプトを使用するかわりに、次のコマンドを入力することもできます。

    loadjava -user system/password@database -resolve -force -synonym -schema MDSYS -grant PUBLIC xtiff-jai.jar
    
    loadjava -user system/password@database -resolve -force -synonym -schema MDSYS -grant PUBLIC geotiff-jai.jar
    

    データベースをOracle Database 11g より前のリリースにダウングレードする場合は、$ORACLE_HOME/md/admin/sdormgtf.sqlのスクリプトを使用してこれらのライブラリをアンインストールする必要があります。これを行うには、xtiff-jai.jarおよびgeotiff-jai.jarファイルへのパスを反映するように必要に応じてスクリプトを編集し、sdormgtf.sqlスクリプトを実行するか、または次のコマンドを入力します。

    dropjava -user system/password@database -resolve -force -synonym -schema MDSYS -grant PUBLIC xtiff-jai.jar
    
    dropjava -user system/password@database -resolve -force -synonym -schema MDSYS -grant PUBLIC geotiff-jai.jar
    
  • SDO_GEOR.setSRSプロシージャを使用して、GeoRaster SRSメタデータに直接アクセスすることで地理参照情報を追加、変更および削除できます。たとえば、SDO_GEOR_SRSオブジェクトを作成し、係数および関連する地理参照情報を割り当てた後、SDO_GEOR.setSRSプロシージャをコールして、任意のGeoRasterオブジェクトの空間リファレンス情報を追加または更新できます。SDO_GEOR.setSRSプロシージャを使用して、サポートされるすべての関数フィッティング地理参照モデルに対応する空間参照情報を設定できます。既存のDLTモデルや既存のRPCモデルからSRS情報を設定する方法の例は、SDO_GEOR.setSRSプロシージャのリファレンスの項を参照してください。

    1つのGeoRasterオブジェクトが別のGeoRasterオブジェクトと同じSRS情報を持つことがわかっている場合、SDO_GEOR.getSRSファンクションをコールしてこのGeoRasterオブジェクトからSDO_GEOR_SRSオブジェクトを取得し、次にSDO_GEOR.setSRSプロシージャをコールして最初のGeoRasterオブジェクトを地理参照できます。

  • アフィン変換を使用してGeoRasterオブジェクトを地理参照できる場合、SDO_GEOR.georeferenceプロシージャをコールしてGeoRasterオブジェクトを直接地理参照できます。SDO_GEOR.georeferenceのリファレンス情報に記載されているとおり、このプロシージャでは、係数ABCDEFおよびその他の情報を使用し、それらを係数abcdefに変換してGeoRasterオブジェクトの空間参照情報に格納します。元のラスター・データが幾何補正されており、基点(左上角)のモデル座標が(x0, y0)で、空間解像度値(スケール)がsである場合、A = s、B = 0、C = x0、D = 0、E = -s、F = y0となります。

  • 地上基準点(GCP)を保持しているか、独自にGCPを収集する場合、SDO_GEOR.georeferenceプロシージャをコールしてGeoRasterオブジェクトを地理参照できます。詳細は、「高度な地理参照」を参照してください。

地理参照されるGeoRasterオブジェクトのSRS情報に基づいたGeoRasterの座標情報の変換では、特定のセル(ラスター)座標に関連付けられたモデル(地上)座標を検索します。または、その反対に特定のモデル(地上)座標に関連付けられたセル(ラスター)座標を検索します。つまり、次の操作を実行できます。

  • 任意のセル座標に対して、SDO_GEOR.getModelCoordinateファンクションを使用して、関連付けられたモデル空間座標を検索できます。たとえば、イメージ上の点を指定して、その点に関連付けられた緯度と経度を検索できます。

  • モデル空間座標に対して、SDO_GEOR.getCellCoordinateファンクションを使用して、関連付けられたセル座標を検索できます。たとえば、緯度と経度の座標を指定して、これらの座標に関連付けられたイメージ上のセルを検索できます。

3.7 空間エクステントの生成と設定

GeoRasterオブジェクトが作成される際、その空間エクステント(「spatialExtent属性」に示すspatialExtent属性)は、モデル空間の座標系の中では囲まれたジオメトリである必要はありません。空間エクステント(フットプリント)・ジオメトリは、最初はNULLであるか、またはセル空間の座標系や他の座標系を表すことがあります。空間エクステントを生成および設定する機能は、世界的な規模の範囲や広い地域の範囲の大容量のGeoRasterデータベースを作成する場合に便利です。この場合、空間エクステントは世界的な規模の1つの測地座標系の中にあり、GeoRasterオブジェクト(イメージ、DEMなど)は異なる投影座標系の中にあります。このような場合には、空間エクステント上に空間(Rツリー)索引を作成できますが、すべての空間エクステント・ジオメトリは同じSRID値を持つ必要があります。

表内の各GeoRasterオブジェクトの空間エクステント・ジオメトリがモデル空間の座標系(または使用する他の座標系)に対して正しくなるようにするには、空間エクステントを設定する必要があります。また、空間エクステント・ジオメトリで空間索引を使用する(「GeoRasterオブジェクトの索引付け」を参照)には、索引付けされたすべてのジオメトリが同じ座標系に基づいている(つまり同じSRID値を持つ)必要があります。

空間エクステントは、次のいずれかの方法で設定できます。SDO_GEOR.importFromプロシージャまたはGeoRasterクライアント側のローダー(「GeoRasterツール: ビューア、ローダー、エクスポータ」を参照)に対してspatialExtent=TRUEを記憶域パラメータとして指定するか、またはSQL UPDATE文を使用します。SDO_GEOR.importFromプロシージャまたはローダーを使用する場合、SRIDはNULLまたは0(ゼロ)にはできません。また、GeoRasterの空間エクステントにRツリー索引が存在する場合は、空間エクステントのSRIDは既存の空間索引のSRIDと一致する必要があります。それ以外の場合は、空間エクステントはNULLに設定されます。

さらに、空間エクステント・ジオメトリがない場合は、SDO_GEOR.generateSpatialExtentファンクションを使用して作成し、そのジオメトリを使用してGeoRasterオブジェクトを更新できます。次の例では、(「GeoRaster表の作成」例3-1で作成した)CITY_IMAGES表のGeoRasterオブジェクトの空間エクステント・ジオメトリを更新し、そのオブジェクトの空間エクステント(モデル座標系を反映しているもの)を生成します。

UPDATE city_images c
  SET c.image.spatialExtent = sdo_geor.generateSpatialExtent(image)
    WHERE c.image_id = 100;
COMMIT;

GeoRasterオブジェクトの空間エクステント・ジオメトリがわかっている場合、または空間エクステント・ジオメトリをモデル空間以外の座標系に基づくようにする場合は、SDO_GEOMETRYオブジェクトを作成するか、または表から選択します。その後、次の例に示すように、GeoRasterオブジェクトを更新して、その空間エクステント属性が対象のジオメトリに設定されるようにします。

DECLARE
 geom sdo_geometry;
BEGIN
-- Set geom to an SDO_GEOMETRY object that covers the spatial extent
-- of the desired GeoRaster object. If necessary, perform coordinate
-- system transformation before setting geom.
-- geom := sdo_geometry(...);
  UPDATE city_images c
    SET c.image.spatialExtent = geom WHERE c.image_id = 100;
  COMMIT;
END;

3.7.1 GeoRaster表に空間索引が含まれる場合の特別な考慮事項

GeoRaster空間エクステントに空間Rツリー索引を作成する場合(「GeoRasterオブジェクトの索引付け」を参照)、すべての空間エクステント・ジオメトリは同じSRID値を持つ必要があります。ただし、GeoRasterオブジェクトは異なるモデルSRIDを持つ場合があり、ほとんどのGeoRaster操作では、1つ以上のソースGeoRasterオブジェクトのモデルSRIDに基づいて、出力GeoRasterオブジェクトに空間エクステントが自動的に生成されます。これは、空間エクステントを持つ結果のGeoRasterオブジェクトがGeoRaster表に更新される場合、その表ではspatialExtent属性に基づいて作成された空間索引がすでに存在し、異なるSRIDが使用されている可能性があるため、問題となることがあります。

このような場合には、挿入または更新操作を行う前に、空間索引と同じSRIDに空間エクステントを変換する必要があります。次の例では、モザイク処理を実行しますが、結果のGeoRasterオブジェクトの空間エクステントをSRID 8307に変換してから、そのオブジェクトでGeoRaster表を更新しています。

DECLARE
  gr sdo_georaster;
BEGIN
  SELECT georaster INTO gr FROM mosaic_test WHERE georid=1 FOR UPDATE;
  sdo_geor.mosaic('mosaic_data', 'georaster', gr, 'blocksize=(512,512)');
  -- Transform the spatial extent geometry, if ncessary.
  -- In this example example, the modelSRID of the mosaic is 27302,
  -- but the SRID of the spatial index on mosaic_test is 8307.
  gr.spatialExtent := sdo_cs.transform(gr.spatialExtent, 8307);
  UPDATE mosaic_test SET georaster=gr WHERE georid=1;
END;
/

空間Rツリー索引が存在する場合、挿入または更新操作の後にコミット操作を行うと、挿入または更新されたGeoRasterオブジェクトに空間エクステント・ジオメトリが含まれている場合には、その索引は更新されます。これにより、各操作(特にイメージのバッチ・ロードなどのバッチ・ジョブ)の後にコミットを実行すると、一部の操作の処理速度が低下する可能性があります。通常、索引更新のパフォーマンスとGeoRaster操作とのバランスを取り、操作の後に一括してコミットする方がより効率的です。

たとえば、イメージ・データ・ロード(SDO_GEOR.importFromプロシージャおよびGeoRasterローダー)の後に内部コミット操作が続くため、spatialExtent=TRUEを指定して空間エクステントを生成している間にロードすることは効率的ではありません。かわりに、spatialExtent=FALSEを指定してから後でspatialExtent属性を更新した方が、ロード処理の速度を向上させることができます。

3.8 GeoRasterオブジェクトの索引付け

GeoRasterデータは、様々な方法で索引付けできます。GeoRasterオブジェクトに作成できる最も重要な索引は、GeoRasterオブジェクトの空間エクステント(フットプリント)・ジオメトリ(「spatialExtent属性」に示すspatialExtent属性)に対する空間索引(Rツリー)です。大規模な地理空間イメージおよびラスター・データベースの場合、GeoRaster列に対して常に空間索引を作成する必要があります。次に、GeoRaster列に対して空間索引を作成する場合の基本手順を示します。(この例では、GeoRaster表の名前がCITY_IMAGESで、そのGeoRaster列の名前がIMAGEであると仮定します。)

  1. GeoRaster表の名前(この例ではCITY_IMAGES)とGeoRaster列の名前の空間エクステント(IMAGE.SPATIALEXTENT)を使用して、USER_SDO_GEOM_METADATAビューに行を挿入します。適切なSRID値(この例では3371)が登録されることを確認してください。
    INSERT INTO user_sdo_geom_metadata
        (TABLE_NAME,
         COLUMN_NAME,
         DIMINFO,
         SRID)
    VALUES (
         'city_images',
         'image.spatialextent',
         SDO_DIM_ARRAY(
            SDO_DIM_ELEMENT('X', -1000000000, 1000000000, 0.005),
            SDO_DIM_ELEMENT('Y', -1000000000, 1000000000, 0.005)),
         3371
    );
    
  2. 次の例のようにGeoRaster列に空間索引を作成します(次の例では、すべてのパラメータにデフォルト値を使用して、イメージの空間エクステントに対してCITY_IMAGES_IDXという空間索引を作成します)。
    CREATE INDEX city_images_idx 
          ON city_images (image.spatialextent)
          INDEXTYPE IS MDSYS.SPATIAL_INDEX;
    

    前述の文は、無効な空間エクステントが存在する場合や、前述の手順で登録したSRID値にGeoRaster表のSRID値が一致しない場合、失敗する可能性があります。文が失敗した場合、すべてのGeoRasterオブジェクトに有効なspatialExtentジオメトリ属性が存在し、すべてのspatialExtentジオメトリに同じSRIDが含まれることを確認してください。(spatialExtent値にはNULLを使用できます。)次に、空間索引を再作成します。

GeoRaster表にすでに空間索引が含まれる場合の特別な考慮事項については、「GeoRaster表に空間索引が含まれる場合の特別な考慮事項」を参照してください。空間索引の作成および拡張機能の詳細は、『Oracle Spatial and Graph開発者ガイド』を参照してください。

次のような他の索引を作成することもできます。

  • Oracle XMLTypeまたはOracle Textドキュメントの索引付け機能を使用した、メタデータ・オブジェクトに対するファンクション索引

  • 雲、河川、湖、海、植物など、GeoRaster表の他のユーザー定義列に対する標準の索引

各ラスター・データ表のrasterIdpyramidLevelbandBlockNumberrowBlockNumberおよびcolumnBlockNumber列に対して単一のBツリー索引も作成する必要があります。例3-2および例3-3に示すように、これはPRIMARY KEY (rasterID、pyramidLevel、bandBlockNumber、rowBlockNumber、columnBlockNumber),を使用して行う必要があります。

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

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

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

DECLARE
  type curtype is ref cursor;
  my_cursor curtype;
  stmt varchar2(1000);
  id     number;
  gr    sdo_georaster;
  gm  sdo_geometry;
BEGIN
  -- 1. Define the query area in WGS84 coordinate system
  gm := sdo_geometry(2003, 8307, 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) and column (image)
  stmt := 'select id, t.image 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 id, gr;
    exit when my_cursor%NOTFOUND;
    sdo_geor.generatePyramid(gr, 'resampling=bilinear');
    execute immediate 'update city_images set image=:1
       where id=:2' using gr, id;
    commit;
  end loop;
  close my_cursor;
END;

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

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

ラスター・ブロック・サイズ、セル深度、インターリーブ・タイプなど、ラスター・イメージ・データを格納する方法(または将来格納する方法)の一部を変更または指定できます。既存のGeoRasterオブジェクトに対してこのような変更を行うには、SDO_GEOR.changeFormatCopyプロシージャを使用して、storageParamパラメータで目的の記憶域パラメータ値を指定します。GeoRasterオブジェクトをロードおよび処理し、別のGeoRasterオブジェクトを作成するほとんどのサブプログラムを使用して、記憶域パラメータを指定できます。つまり、SDO_GEOR.importFromSDO_GEOR.subsetSDO_GEOR.mosaicSDO_GEOR.reprojectSDO_GEOR.scaleCopySDO_GEOR.mergeLayersSDO_GEOR.createTemplateなどのファンクションまたはプロシージャをコールするときに、出力形式を指定できます。

結果のGeoRasterオブジェクトのstorageParamパラメータは、ユーザーが決定するデータ・サイズ、次元サイズ、アプリケーション・ニーズなどの要素に基づいている必要があります。ただし、各GeoRasterオブジェクトで最小限の埋込みスペースのみが使用され、アプリケーション要件が引き続き満たされるように、ブロック・サイズは、GeoRasterオブジェクトの次元サイズとユーザーが必要とする目的の出力に基づいて自動的に最適化することもできます。

詳細は、「記憶域パラメータ」、特に表1-1を参照してください。

3.11 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プロシージャでサポートされます。パラレル・コピーおよび形式変更コピーの詳細は、「パラレル圧縮、コピー、サブセット化、再投影および幾何補正」例5-22を参照してください。

3.12 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ファンクション(extractupdateXMLなど)を使用しても取得および変更できます。ただし、取得または変更するメタデータ属性に対応する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オブジェクトの更新」を参照)。

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

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

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

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

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

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

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

  • SDO_GEOR.reprojectは、ある投影座標系から別の投影座標系にGeoRasterオブジェクト全体を変換するのみでなく、問合せ結果(単一のBLOB)を異なる座標系にオンザフライで直接変換することで、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.exportToプロシージャを使用して、ラスター・イメージの全体または一部を、BLOBオブジェクト(バイナリ・イメージ形式)または指定したファイル形式タイプのファイルにエクスポートすることもできます。

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

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

    指定したウィンドウ内のラスター・セルの値を単一の値に更新または変更するには、SDO_GEOR.changeCellValueプロシージャを使用します。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オブジェクトの更新」を参照)。

3.14 セル値の内挿

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

SELECT SDO_GEOR.evaluateDouble(a.georaster, 0, 
    SDO_GEOMETRY(2001, 8307, 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を直接コールできます。他の内挿方法では、ラスターが連続面として扱われ、セル内の異なる点の場所で異なる値が戻される可能性があります。

3.15 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デモ・ファイルも参照してください。

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

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

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

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

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

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

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

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

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

パラレル圧縮および解凍は、SDO_GEOR_AGGR.mosaicSubsetプロシージャでサポートされます。パラレル圧縮および解凍には、パフォーマンスの大幅な向上という効果があり、これはイメージが大きいときに特に役立ちます。「パラレル圧縮、コピー、サブセット化、再投影および幾何補正」例5-21を参照してください。

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

3.18 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オブジェクトに関連付けられているすべてのラスター・データも自動的に削除されます。

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

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

    注意:

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

3.19 GeoRasterオブジェクトの表示

GeoRasterデータを表示するには、次の方法があります。

  • SDO_GEOR.exportToプロシージャをコールしてGeoRasterオブジェクトをイメージ・ファイルにエクスポートした後、イメージ・ツールまたはWebブラウザを使用してイメージを表示します。

  • スタンドアロンのGeoRasterビューア・ツール(「GeoRasterツール: ビューア、ローダー、エクスポータ」に示すツールの1つ)を使用します。

  • Oracle Fusion Middleware MapViewerまたはそれに関連付けられたMap Builderユーティリティを使用します。

GeoRasterのビューア・ツールでは、データベース・スキーマ(ユーザー)のGeoRasterオブジェクトの選択、GeoRasterオブジェクトの全体またはサブセットの問合せと表示、ズームイン、ズームアウト、スクロール、および他の基本操作を実行できます。マウス・ポインタの位置の点について、ピラミッド・レベル、セル座標およびモデル座標(オブジェクトが地理参照されている場合)が表示されます。個々のセル値を表示して、RGBフルカラー表示のために、マルチバンド・イメージまたはハイパースペクトル・イメージの複数のレイヤーを選択できます。表示の最前面にブロック境界を重ねて表示できます。ビューアでは、データおよびユーザーの要件に応じて、イントラネットまたはインターネット上でラスター・データをグレースケール、疑似カラーおよび24ビット・トゥルーカラーで表示できます。一部の基本的なGeoRasterメタデータも表示されます。

GeoRasterビューア・ツールでは、GeoRaster表またはビューのいずれか1つまたはリストとして定義された仮想モザイクを表示できます。

GeoRasterのビューア・ツールには、GeoRasterオブジェクトの表示機能を強化するためのイメージ処理演算子のセットが含まれます。これらの演算子は、特にGeoRasterオブジェクトのセル深度が8を超える場合や、浮動小数点数である場合に役立ちます。また、このツールでは、GeoRasterオブジェクトにビットマップ・マスクがある場合に、そのビットマップ・マスクを表示および適用できます。

GeoRasterのビューア・ツールには、GeoRasterローダーおよびエクスポータ・ツールをコールするためのメニュー・コマンドも含まれています。これにより、1つのツールを、すべてのGeoRasterツールの機能へのインタフェースとして使用できます。

視覚化アプリケーションでは、GeoRasterオブジェクトのデフォルトのRGBAおよびデフォルトのピラミッド・レベルの指定を利用できます。SDO_GEOR.setDefaultColorLayerまたはSDO_GEOR.setDefaultRedSDO_GEOR.setDefaultGreenSDO_GEOR.setDefaultBlueおよびSDO_GEOR.setDefaultAlphaをコールすることで、デフォルトの赤、緑、青およびアルファ・チャネルとしてマルチバンド・イメージの異なるバンドを設定できます。大きなイメージの場合、SDO_GEOR.setDefaultPyramidLevelをコールして、アプリケーションの初期表示用のイメージに最適な解像度(ピラミッド)レベルを設定できます。たとえば、イメージ全体の完全な概要を取得するには、デフォルトのピラミッド・レベルとして最高のピラミッド・レベルを設定するのが最適です。

3.20 GeoRasterオブジェクトのエクスポート

イメージまたはラスター・データをロードおよびエクスポートする場合、常にサード・パーティのETLツールの使用を検討してください(「GeoRasterツール: ビューア、ローダー、エクスポータ」の「注意」を参照)

GeoRasterの機能を使用してGeoRasterオブジェクトをイメージ・ファイルにエクスポートする場合、次の方法があります。

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

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

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

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

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

3.22 テンプレート関連のサブプログラムを使用した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の読取りおよび書込みの前に必要に応じてデータの圧縮と解凍を行う必要があります。

3.23 Workspace ManagerおよびLabel SecurityでのGeoRasterの使用

Oracle Workspace Managerでは、GeoRasterオブジェクトのラスター・ブロックのためのバージョニング機能が提供されます。Oracle Label Securityでは、ラスター・ブロックの行レベルの拡張セキュリティを使用するGeoRasterオブジェクトがサポートされます。

GeoRasterをOracle Workspace ManagerまたはOracle Label Securityと組み合せて使用するには、GeoRasterオブジェクトのリレーショナル表としてラスター・データ表(RDT)を作成する必要があります(例3-3を参照)。ベース・リレーショナルRDTでSDO_RASTER型のオブジェクト・ビューを定義する必要はありません。

3.23.1 Workspace ManagerでのGeoRasterの使用

Workspace Managerでは、異なる作業領域にラスター・データの異なるバージョンを保存して変更を加えることで、ラスター・データに対する変更を容易に管理できます。Workspace ManagerでGeoRasterを使用するには、ラスター記憶域用のリレーショナル・ラスター・データ表を使用し、それらのリレーショナル・ラスター・データ表をバージョン対応にする必要があります。次に一般的な形式の例を示します。

EXECUTE DBMS_WM.EnableVersioning (<rdt_relational_table>, 'VIEW_WO_OVERWRITE');

注意:

バージョン対応にできるのは、ラスター・データ表のみです。GeoRasterオブジェクトが格納されているGeoRaster表は、バージョン対応にしないでください。また、作業領域での作業中にGeoRaster表を変更する必要のある操作は実行しないでください。

リレーショナルRDTをバージョン対応にした後に、DBMS_WMパッケージのサブプログラムを使用してラスター・データの変更を管理できます。ラスター・ブロックを直接変更する必要がある場合は、次の例に示すとおり、操作の前にDBMS_WM.copyForUpdateプロシージャをコールします。

declare
  geor sdo_georaster;
  cond varchar2(1000);
  lb   blob;
  r1   raw(1024);
  amt  number;
begin
  r1 := utl_raw.copies(utl_raw.cast_to_raw('0'),1024);
 
  select georaster into geor from georaster_table where georid=1;
  cond := 'rasterId=' || geor.rasterId || ' AND pyramidLevel=0 AND ' ||
          ' bandBlockNumber=0 AND rowBlockNumber=0 AND columnBlockNumber=0';
  dbms_wm.copyForUpdate(geor.rasterDataTable, cond);
  sdo_geor.getRasterBlockLocator(geor, 0, 0, 0, 0, lb, null, 'TRUE');
  amt := 1024;
  dbms_lob.write(lb, amt, 1, r1);
end;
/

ただし、GeoRasterサブプログラムを使用してラスター・データを変更する場合は、事前にDBMS_WM.copyForUpdateプロシージャをコールする必要はありません

Workspace Managerの詳細は、『Oracle Database Workspace Manager開発者ガイド』を参照してください。

3.23.2 Label SecurityでのGeoRasterの使用

Oracle Label Securityでは、ユーザーのセキュリティ・クリアランスのレベルに基づいて、機密データに対する行レベルのアクセス制御を実現できます。Label SecurityでGeoRasterを使用するには、次の基本手順を実行します。

  1. GeoRaster表および1つ以上のリレーショナルRDTを作成します。
  2. Oracle Label Securityポリシーを作成してラベル・コンポーネントを定義します。
  3. GeoRaster表と1つ以上のリレーショナルRDTに対してラベル付けファンクションを作成します。

    GeoRaster表の行のラベルは、アプリケーションの要求に従って生成される必要があります。GeoRasterオブジェクトを格納する行と、関連するRDTのGeoRasterオブジェクトのラスター行には、両方とも同じラベルを使用してください。異なるラベルを使用すると、GeoRasterオブジェクトが無効になるか、一貫性のないステータスになる可能性があります。

    次の例では、リレーショナルRDTに対してラベル付けファンクションを作成します。

    CREATE OR REPLACE FUNCTION gen_rdt_label(rdt_name varchar2, rid number)
      RETURN LBACSYS.LBAC_LABEL
    AS
      tabname varchar2(80);
      schema  varchar2(32);
      grcol   varchar2(1024);
      colname varchar2(30);
      label   NUMBER;
    BEGIN
      EXECUTE IMMEDIATE
       'SELECT v.owner, v.table_name, v.column_name grcol, p.column_name ' ||
       '  FROM all_sdo_geor_sysdata v, all_sa_policies p, all_sa_table_policies t '
       || ' WHERE v.rdt_table_name=:1 AND v.raster_id=:2 AND ' ||
       ' v.owner=t.schema_name AND v.table_name=t.table_name AND ' ||
       ' p.policy_name=t.policy_name ' 
       INTO schema, tabname, grcol, colname
       USING upper(rdt_name), rid;
      EXECUTE IMMEDIATE
        'SELECT t.' || colname  ||
         ' FROM ' || schema || '.' || tabname || ' t ' ||
         ' WHERE t.' || grcol || '.rasterdatatable=:1 AND ' ||
         '       t.' || grcol || '.rasterid=:2' 
        INTO label
        USING upper(rdt_name), rid;
      RETURN LBACSYS.LBAC_LABEL.NEW_LBAC_LABEL(label);
    END;
    /
    
  4. Label SecurityポリシーをGeoRaster表とそれに関連する1つ以上のRDTに適用します。

    次の一般的な形式の例では、前述の手順におけるラベル付けファンクションの例を使用して、Label Securityポリシーを1つのRDTに適用します。

    BEGIN
      SA_POLICY_ADMIN.REMOVE_TABLE_POLICY(<policy_name>,<schema_name>,<rdt_relational_table>);
      SA_POLICY_ADMIN.APPLY_TABLE_POLICY(
        POLICY_NAME => <policy_name>,
        SCHEMA_NAME => <schema_name>,
        TABLE_NAME  => <rdt_relational_table>,
        TABLE_OPTIONS => 'READ_CONTROL,WRITE_CONTROL,CHECK_CONTROL',
        LABEL_FUNCTION => '<schema_name>.gen_rdt_label(<rdt_relational_table>,:new.rasterid)',
        PREDICATE => NULL);
    END;
    /
    
  5. ユーザーを作成して認可を行い、Label Securityに関連する他の管理タスクを完了します。

ポリシーを表に適用する前または後に、GeoRasterデータをロードできます。

ALL_SDO_GEOR_SYSDATAビュー(「GeoRasterシステム・データ・ビュー(xxx_SDO_GEOR_SYSDATA)」を参照)には、現行ユーザーがアクセス可能なすべてのGeoRasterオブジェクトに関するシステム・データが含まれます。この場合のアクセス可能性は、任意アクセス制御(DAC)のコンテキストで定義されたユーザーの権限によって決定されます。

GeoRaster表の行のラベルが更新されたら、各ラベルが同期するように、RDTの関連するデータ・ラベルも更新される必要があります。

Label Securityの詳細は、『Oracle Label Security管理者ガイド』を参照してください。

3.24 GeoRasterオブジェクトによる表領域の効率的な使用のメンテナンス

操作を削除またはロールバックしても、ラスター・データ表に割り当てられた未使用の領域は、基礎となる表領域にすぐに戻されないことがあります。これにより、表領域が無駄に使用されることがあり、ラスター・データのサイズが大きい場合は重大な問題となる可能性があります。自動セグメント領域管理の表領域でBasicFiles LOBを使用してラスター・データ表を作成した場合、ラスター・データ表を変更することでrasterBlock LOBセグメントまたはラスター・データ表を明示的に縮小できます。次の例3-5および例3-6を参照してください。

例3-5 BasicFile rasterBlock LOBセグメントの縮小

ALTER TABLE city_images_rdt MODIFY LOB (rasterBlock) (SHRINK SPACE);

例3-6 ラスター・データ表の縮小

ALTER TABLE city_images_rdt ENABLE ROW MOVEMENT;
ALTER TABLE city_images_rdt SHRINK SPACE CASCADE;

SecureFilesを使用している場合、または手動セグメント領域管理の表領域で割り当てられたBasicFilesを使用している場合、前述の例のようにALTER TABLE文を使用して未使用の領域を再利用することはできません。かわりに、一時的に使用する作業用のラスター・データ表を作成し、断続的に発生する結果をそのRDTに配置して、不要になったらその作業用RDTを削除する必要があります。

3.25 データベースのGeoRasterオブジェクトおよびシステム・データのメンテナンス

GeoRasterには、無効なGeoRasterオブジェクトおよびシステム・データの作成を防止する内部データベース・メカニズムがありますが、特に以前のリリースからのアップグレード後や、GeoRasterシステム・データに対する操作で複数のユーザー・エラーが発生した後には、データベース内にそのような無効なGeoRasterオブジェクトやシステム・データが発生することがあります。無効なオブジェクトおよびシステム・データの例は、次のとおりです。

  • GeoRasterシステム・データ・ビューのエントリ(「GeoRasterシステム・データ・ビュー(xxx_SDO_GEOR_SYSDATA)」xxx_SDO_GEOR_SYSDATAを参照)が、存在しないGeoRaster表または列を示します。

  • 2つ以上のGeoRasterオブジェクトに、RDT名とラスターID値の同じ組合せが含まれています。

  • 一部のGeoRasterオブジェクト、表、列またはRDTが登録されていません。

  • RDT名が一意ではありません。

  • GeoRasterオブジェクトが空または空白ではないが、関連するRDTが存在しません。

データベースのアップグレード後に、SDO_GEOR_ADMIN.isUpgradeNeededファンクションをコールして、現在のリリースで無効なGeoRasterオブジェクトおよび無効なシステム・データを確認する必要があります。なんらかのエラーや無効なデータが検出された場合は、SDO_GEOR_ADMIN.upgradeGeoRasterファンクションをコールして問題を自動的に修正します。ユーザーMDSYSとして接続している場合、SDO_GEOR_ADMIN.upgradeGeoRasterファンクションをコールすると、データベース内のすべてのGeoRasterオブジェクトがアップグレードされます。それ以外の場合は、現行ユーザーのスキーマのGeoRasterオブジェクトのみがアップグレードされます。(詳細は、「SDO_GEOR_ADMINパッケージのリファレンス」SDO_GEOR_ADMIN.upgradeGeoRasterに関するリファレンスおよび使用情報を参照してください。)

発生する可能性のあるユーザー・エラーに対する定期的なメンテナンスでは、無効なGeoRasterオブジェクトおよびシステム・データ・エントリを検出して修正するために次のファンクションおよびプロシージャが役立ちます。

詳細は、「SDO_GEOR_ADMINパッケージのリファレンス」でこれらのプロシージャとファンクションに関するリファレンスおよび使用情報を参照してください。

3.26 データベース間でのGeoRasterデータの転送

データ・ポンプ・エクスポート・ユーティリティおよびインポート・ユーティリティまたは従来のエクスポート・ユーティリティおよびインポート・ユーティリティのいずれかを使用して、データベース間でGeoRasterデータを転送できます。GeoRaster表と関連するラスター・データ表の両方から行をエクスポートし、インポートする必要があります。データの転送後、インポートしたGeoRasterオブジェクトのGeoRasterシステム・データをターゲット・スキーマのUSER_SDO_GEOR_SYSDATAビュー(「GeoRasterシステム・データ・ビュー(xxx_SDO_GEOR_SYSDATA)」を参照)に挿入する必要はありません。ただし、これらのオブジェクトになんらかの操作を実行する前に、SDO_GEOR.validateGeoRasterファンクションを使用して、インポートしたGeoRasterオブジェクトが有効かどうかを確認する必要があります。

データ・ポンプ・エクスポート・ユーティリティとインポート・ユーティリティ、および従来のエクスポート・ユーティリティとインポート・ユーティリティの詳細は、『Oracle Databaseユーティリティ』を参照してください。

データベース間でGeoRasterデータを転送するには、次の一般的な手順に従います。

  1. 競合を確認して、解決します(「競合の確認と解決」を参照)。
  2. データの転送を行います(「GeoRasterデータの転送の実行」を参照)。

3.26.1 競合の確認と解決

GeoRasterデータをターゲット・データベースに正常にインポートするには、ターゲット・スキーマのGeoRasterシステム・データが競合していない必要があります。次の条件では、競合が発生する可能性があります。

  • ターゲット・データベース内の別のスキーマに、同じ名前を持つラスター・データ表がすでに定義されている。

    たとえば、ラスター・データ表(RDT)をターゲット・スキーマに作成してGeoRasterオブジェクトをインポートする場合、ターゲット・スキーマの既存のRDTにすでに同じ名前が割り当てられている可能性があります。この場合、SDO_GEOR_ADMIN.listRDTまたはSDO_GEOR_ADMIN.isRDTNameUniqueファンクションを使用して、ソース・データベースとターゲット・データベースの両方を調査し、RDT名の競合が存在するかどうかを確認する必要があります。競合が存在する場合は、SDO_GEOR_UTL.renameRDTプロシージャを使用してターゲット・データベースのRDT名を異なる名前に変更し、GeoRasterオブジェクトをインポートする前に競合を解決します。

  • ターゲット・スキーマのUSER_SDO_GEOR_SYSDATAビューに挿入するラスター・データ表の名前とラスターIDの組合せが一意ではない。

    たとえば、ターゲット・データベースの既存のRDTにデータを追加することでRDTデータをインポートする場合に、この競合が発生する可能性があります。この場合、データをターゲット・データベースにインポートする前に、SDO_GEOR_ADMIN.listGeoRasterObjectsファンクションを使用してターゲット・スキーマに定義されているすべてのGeoRasterオブジェクトをリスト表示し、RDT名とラスターIDの組合せが既存のGeoRasterデータとインポートするGeoRasterデータの間で競合していないことを確認します。競合が存在する場合は、ターゲット・スキーマのGeoRasterオブジェクトのラスターIDを変更し、競合を解決します。この処理を行わないと、ダンプ・ファイル内に競合の存在するGeoRasterオブジェクトは、インポート・プロセスの実行時に拒否されます。

ダンプ・ファイルでラスター・データ表(RDT)の名前とラスターID(RID)の情報を確認する必要がある場合、いくつかの方法があります。ソース・データベースの情報を確認する方法、ダンプ・ファイルのプロバイダの情報をリクエストする方法、個別のテスト・データベースにダンプ・ファイルをロードしてそこでその情報を確認する方法、または(テスト用に個別のデータベースを使用できない場合)現行データベースのテスト・スキーマにダンプ・ファイルをロードしてその情報を確認する方法です。現行データベースのテスト・スキーマにダンプ・ファイルをロードして情報を確認するには、次の手順を実行します。

  1. ターゲット・データベースにテスト・スキーマを作成します。

  2. CONTENT = METADATA_ONLYパラメータを指定してデータ・ポンプ・インポート・ユーティリティを使用し、ダンプ・ファイルからこのテスト・スキーマにすべてのGeoRaster表をロードします。

  3. MDSYSユーザーとしてデータベースに接続し、前述の手順でロードしたGeoRaster表のすべてのDMLトリガーを無効化します。

  4. CONTENT = DATA_ONLYパラメータを指定してデータ・ポンプ・インポート・ユーティリティを使用し、GeoRaster表にデータをロードします。

  5. テスト・スキーマのGeoRaster表からRDTとRID (ラスター・データ表の名前とラスターID)の組合せを直接取得します。

競合を解決したら、GeoRasterのメタデータおよびデータの整合性を確認する必要があります(「データベースのGeoRasterオブジェクトおよびシステム・データのメンテナンス」を参照)。また、コミットなどの操作を実行する前に、修正したGeoRasterオブジェクトを検証する必要があります。

インポート操作時に競合を解決する方法の一般情報は、『Oracle Databaseユーティリティ』のデータ・ポンプ・インポートに関する章でTABLE_EXISTS_ACTIONパラメータの説明を参照してください。

3.26.2 GeoRasterデータの転送の実行

あるデータベースのGeoRasterデータをエクスポートして別のデータベースにインポートすると、ターゲット・データベースにGeoRaster表およびオブジェクトがインポートされた後に、必要なDMLトリガーとシステム・データ・エントリがGeoRasterのデータベース管理システムによって自動的に生成されます。そのため、GeoRasterのすべての内部DMLトリガーが、expdp操作およびimpdp操作から除外されます。除外されない場合、安全に無視できるエラーですが、次のようなimpdpエラーが発生することがあります。

ORA-39083: Object type TRIGGER failed to create with error:
ORA-13391:  GeoRaster reserved names cannot be used to create regular triggers

GeoRasterデータをエクスポートする方法は、他のタイプのデータをエクスポートする場合と同様ですが、GeoRasterの内部DMLトリガー(名前がGRDMLTR_で始まるもの)は除外します。次に例を示します。

expdp scott schemas=scott directory=dump_dir dumpfile=exp.dmp parfile=exclude.par
Enter password: password

exclude.parファイルの内容は次のとおりです。

exclude=trigger:"like 'GRDMLTR_%'"

GeoRasterデータをインポートする方法は、他のタイプのデータをインポートする場合と同様ですが、エクスポート操作でGeoRasterの内部DMLトリガー(名前がGRDMLTR_で始まるもの)を除外しなかった場合は、除外します。次に例を示します。

  1. インポートするGeoRasterデータとターゲット・データベース内の既存のGeoRasterデータ間に競合が存在しないことを確認します(「競合の確認と解決」を参照)。

    競合が解決されていない場合、複数の例外が発生します。競合のないGeoRasterデータのみがターゲット・データベースにインポートされます。

  2. GeoRasterデータは、他のタイプのデータと同様にインポートしますが、エクスポート操作でGeoRasterの内部DMLトリガー(名前がGRDMLTR_で始まるもの)を除外しなかった場合は、除外します。次に例を示します。

    impdp scott schemas=scott directory=dump_dir dumpfile=exp.dmp parfile=exclude.par
    Enter password: password
    

    exclude.parファイルの内容は次のとおりです。

    exclude=trigger:"like 'GRDMLTR_%'"

3.27 GeoRasterデータでのトランスポータブル表領域の使用

GeoRasterデータにOracle Databaseのトランスポータブル表領域機能を使用できます。

トランスポートする表領域に、GeoRaster表またはラスター・データ表(RDT)に対する空間索引が含まれる場合、状況によってはいくつかの準備手順を実行する必要があります。空間データでのトランスポータブル表領域機能の使用方法の詳細は、『Oracle Spatial and Graph開発者ガイド』のSDO_UTIL.PREPARE_FOR_TTSおよびSDO_UTIL.INITIALIZE_INDEXES_FOR_TTSプロシージャの使用上の注意を参照してください。

GeoRasterデータをターゲット・データベースに正常にインポートするには、ターゲット・スキーマのGeoRasterシステム・データが競合していない必要があります。表領域を別のデータベースまたはスキーマにトランスポートする前に、「競合の確認と解決」に記載されている手順に従って競合を確認および解決することをお薦めします(ただし必須ではありません)。そのため、ソース・データベースのトランスポータブル表領域を使用する前に、そのような予測可能な競合を避けるようにGeoRaster表およびRDT表を設計する必要があります。

トランスポートされる表領域に空間索引があるかどうかにかかわらず、GeoRasterオブジェクトを含む表領域をトランスポートした後で、次の手順を実行します。

  1. SDO_GEOR_ADMIN.registerGeoRasterObjectsプロシージャ(「SDO_GEOR_ADMINパッケージのリファレンス」を参照)をコールして、現在のスキーマまたは新しいデータベースにすべてのGeoRasterオブジェクトを登録します。
  2. トランスポートされたGeoRasterデータを使用する前に、定期的なメンテナンス操作(「データベースのGeoRasterオブジェクトおよびシステム・データのメンテナンス」を参照)を実行して、GeoRasterオブジェクトおよびシステム・データを管理し、すべてのGeoRasterオブジェクトが正しくトランスポートされ、適切に登録されていることを確認します。
  3. 競合が検出された場合は、SDO_GEOR_UTL.renameRDTプロシージャまたはSDO_GEOR_UTL.makeRDTNamesUniqueプロシージャをコールして、そうした競合を解決し、再度検証します。

トランスポータブル表領域および表領域を別のデータベースに転送する方法の詳細は、『Oracle Database管理者ガイド』を参照してください。