ヘッダーをスキップ
Oracle® Spatial開発者ガイド
11gリリース2 (11.2)
B72087-03
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次
索引へ移動
索引

前
 
次
 

1 Spatialの概念

Oracle Spatialは、Oracleのファンクションとプロシージャを統合した製品であり、Oracle Databaseでの空間データの格納、アクセスおよび分析を短時間で効率的に処理することを目的としています。

空間データは、実際のオブジェクトまたは概念的なオブジェクトの本質的な位置特性情報を、それらが存在する実際の領域または概念的な領域に関連付けて表現します。

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

1.1 Spatial製品とは

Oracle Spatialは、Spatialとも呼ばれ、Oracle Databaseへの空間フィーチャの集合の格納、検索、更新および問合せを容易にするSQLスキーマおよびファンクションを提供します。Spatialは、次の要素で構成されています。

  • サポートされているジオメトリ・データ・タイプの格納方法、構文および意味を規定するスキーマ(MDSYS)

  • 空間索引付けメカニズム

  • 対象領域問合せ、空間結合問合せおよび他の空間分析操作を実行する演算子、ファンクションおよびプロシージャ

  • ユーティリティおよびチューニング操作用のファンクションおよびプロシージャ

  • トポロジ内のノード、エッジおよびフェイスに関するデータを処理するためのトポロジ・データ・モデル(『Oracle Spatialトポロジおよびネットワーク・データ・モデル開発者ガイド』を参照)

  • ネットワーク内のノードおよびリンクとしてモデル化される機能やオブジェクトを表現するためのネットワーク・データ・モデル(『Oracle Spatialトポロジおよびネットワーク・データ・モデル開発者ガイド』を参照)

  • GeoRasterデータ(ラスター・イメージ・データ、グリッド化データ、および関連するメタデータ)の格納、索引付け、問合せ、分析および配信を可能にするGeoRaster機能(『Oracle Spatial GeoRaster開発者ガイド』を参照)

空間フィーチャの空間構成要素とは、ある座標空間においてその形を幾何学的に表現したものです。これをジオメトリと呼びます。


注意:

MDSYSスキーマの下では、どのパッケージ、表または他のオブジェクトも変更しないでください。(ただし、ユーザー定義の座標参照系を作成する必要がある場合は除きます(6.9項を参照)。)

1.2 オブジェクト・リレーショナル・モデル

Spatialでは、ジオメトリを表現するオブジェクト・リレーショナル・モデルがサポートされています。このモデルでは、ジオメトリ全体が、ベクトル・データ用のOracle固有の空間データ型(SDO_GEOMETRY)に格納されます。Oracle表には、1つ以上のSDO_GEOMETRY列を格納できます。オブジェクト・リレーショナル・モデルは、地理空間フィーチャについてOpen GIS ODBC/SQL仕様に定義されている、空間フィーチャ表の「SQL with Geometry Types」実装に対応しています。

オブジェクト・リレーショナル・モデルには、次のメリットがあります。

  • 円弧、円、複合ポリゴン、複合線ストリング、最適化された矩形など、多くのジオメトリ・タイプのサポート

  • 索引の作成とメンテナンスおよび空間問合せの実行が容易

  • Oracle Databaseによる索引のメンテナンス

  • 単一列でモデル化されたジオメトリ

  • 最適なパフォーマンス

1.3 空間データの概要

Oracle Spatialは、位置情報アプリケーションおよび地理情報システム(GIS)・アプリケーションのユーザーが、簡単に無理のない形で空間データを管理できるように設計されています。Oracle Databaseに格納された空間データは、簡単に操作および取出しができ、データベースに格納された他のすべてのデータとの関連付けも可能です。

空間データの一般的な例としては、道路地図があります。道路地図は点、線およびポリゴンを含む2次元オブジェクトであり、都道府県などの行政的境界、都市および道路を表現できます。道路地図は地理情報を視覚化したものです。地表面に存在する行政的境界、都市および道路の位置は、レンダリング対象となるオブジェクトの相対位置と相対距離を維持したまま、2次元の画面または紙上に投影されます。

レンダリングされるこれらのオブジェクトの地表面位置(緯度と経度など)を示すデータが、空間データです。地図のレンダリングでは、この空間データを使用することによって、オブジェクトの位置を2次元の紙上に投影します。GISは、このような地表面と相関する空間データを格納、取出しおよびレンダリングする一般的な方法です。

Spatialを使用して格納できる空間データの種類には、GISデータ以外にコンピュータ支援設計(CAD)システムとコンピュータ支援製造(CAM)システムのデータがあります。CADおよびCAMシステムでは、地理的なスケールでオブジェクトを処理するのではなく、自動車のエンジンまたはプリント回路基板などの比較的小さいスケールを扱います。

これらのシステムの違いはデータのサイズと精度のみで、データの複雑さではありません。これらのすべてのシステムで同数の点データを処理することも考えられます。地理的なスケールでは、ある橋の位置に1/10インチ単位の誤差があっても、実際の道路工事の際には、問題が発生することはありせん。それに対して、エンジンのピストンの直径が1/10インチ単位でもずれてしまうと、エンジンは作動しません。

また、データの複雑さは、表現されている領域の絶対スケールとは無関係です。たとえば、多くのプリント回路基板の場合、その基板上に数千個のオブジェクトがエッチングされ、その小さい面積に道路の工事現場の青写真の詳細図より複雑な情報が含まれます。

これらのアプリケーションは、空間および非空間の両方の属性を持つフィーチャの集合について、格納、検索、更新または問合せのすべてを行います。非空間属性の名前の例には、soil_type、landuse_classificationおよびpart_numberがあります。空間属性は、そのフィーチャの形を、座標またはベクトル・ベースで表現するものです。

1.4 ジオメトリ・タイプ

ジオメトリは、直線セグメントまたは円弧を結合した頂点を順番につなげたものです。ジオメトリの意味は、その型によって決定されます。Spatialは、いくつかの基本タイプ、および2次元を含む、次のタイプの集合で構成されるジオメトリをサポートしています。

  • 点および点クラスタ

  • 線ストリング

  • N点ポリゴン

  • 円弧線ストリング(すべての円弧は円の一部として生成されます。)

  • 円弧ポリゴン

  • 複合ポリゴン

  • 複合線ストリング

  • 最適化された矩形

2次元の点は、XとYの2つの座標値(経度および緯度である場合が多い)で構成される要素です。線ストリングは、線セグメントを定義する2点のペアの、1つ以上の集合で構成されます。ポリゴンは、閉じた輪を形成するように連結された複数の線ストリングで構成されます。たとえば、点で建物の位置を、線ストリングで道路または飛行経路を、多角形で都道府県、都市、区画地域または都市の街区を表現できます。

自己交差する線ストリングはサポートされますが、自己交差するポリゴンはサポートされません。自己交差する線ストリングは、ポリゴンを形成しません。自己交差する線ストリングでは、領域が暗黙的に指定されません。

図1-1に、ジオメトリ・タイプを示します。

図1-1 ジオメトリ・タイプ

図1-1の説明が続きます。
図1-1「ジオメトリ・タイプ」の説明

Spatialでは、定義するオブジェクトの各頂点の定義に3つまたは4つの座標を使用する3次元および4次元のジオメトリ・タイプの保存および索引付けもサポートしています。3次元ジオメトリのサポートの詳細は、1.11項を参照してください。

1.5 データ・モデル

空間データ・モデルは、要素、ジオメトリおよびレイヤーで構成される階層型の構造体です。レイヤーはジオメトリで構成され、ジオメトリは要素で構成されます。

1.5.1 要素

要素は、ジオメトリの基本的構成単位です。サポートされる空間要素タイプは、点、線ストリングおよびポリゴンです。たとえば、要素を使用することによって、星座(点クラスタ)、道路(線ストリング)および都道府県の境界(ポリゴン)のモデルを作成できます。要素内の各座標は、XとYの値のペアとして格納されます。複合ポリゴンの外部の輪と0(ゼロ)個以上の内部の輪(穴)は、単一の要素とみなされます。

点データは1個の座標で構成されます。線データは要素の線セグメントを表現する2個の座標で構成されます。ポリゴン・データは複数の座標値ペア(ポリゴンの各線セグメントに対して、1つの頂点ペア)で構成されます。座標は、ポリゴンの周囲に沿って順に(外部の輪は反時計回り、内部の輪は時計回りで)定義されます。

1.5.2 ジオメトリ

ジオメトリ(またはジオメトリ・オブジェクト)は、空間フィーチャの表現であり、基本形要素を配列した集合をモデル化したものです。ジオメトリは、単一の要素、(サポートされている基本タイプの1つのインスタンス)または同種か異種の要素の集合で構成できます。群島を表現する場合に使用されるような複数ポリゴンは、同種の集合です。異種の集合とは、異なるタイプの要素の集合(点とポリゴンなど)です。

たとえば、ある町の建築予定地を示すジオメトリの例を考えます。このジオメトリは、穴のあいたポリゴンとして表現できます(河川、湖、または区画指定により建築できない地域が穴に相当します)。

1.5.3 レイヤー

レイヤーは、同じ属性セットを持つジオメトリの集合です。たとえば、あるGISにおいて3つのレイヤーが、それぞれ地形、人口密度および領域内の道路と橋のネットワーク(線および点)を表現する場合が考えられます。各レイヤーのジオメトリおよびそれに関連付けられた空間索引は、データベース内の標準表に格納されます。

1.5.4 座標系

座標系(空間参照システム)は、座標を位置に割り当て、そのような座標間の関連を確立するための手段を提供します。これによって、実際の空間における位置表現として、座標を変換することが可能になります。

すべての空間データには、座標系が関連付けられています。座標系は、地理参照(地表の特定の表現に関連)または非地理参照(デカルトで、地表の特定の表現に関連しない)のいずれかになります。座標系が地理参照の場合、デフォルトの測定単位(mなど)が関連付けられますが、指定した別の単位(マイルなど)で結果を自動的に戻すように、Spatialに指示できます。(サポートされている測定単位の詳細は、2.10項を参照してください。)

空間データは、デカルト座標系、測地(地理)座標系、投影座標系またはローカル座標系に関連付けができます。

  • デカルト座標は、指定した基点からの点の位置を、2次元または3次元空間の相互に直交する軸を関連付けて測定する座標です。

    座標系がジオメトリに明示的に関連付けられていない場合、デカルト座標系が想定されます。

  • 測地座標(地理座標)は、角度を持つ座標(経度および緯度)であり、球体の極点の座標と密接に関連し、また、地球上の特定の測地データに関連付けて定義されます。(測地データは、地球の形を表現し、測地座標系の参照として機能します。)

  • 投影座標は、地表の点を平面に数学的にマップした結果である平面的なデカルト座標です。このような数学的マッピングは、それぞれ異なる目的に使用されます。

  • ローカル座標は、非地球(非地理参照)座標系のデカルト座標です。ローカル座標系は、通常、CADアプリケーションおよび現地測量に使用されます。

Spatialは、ジオメトリで操作を実行する場合、空間データに関連付けられた座標系に適切なデカルトまたは曲線計算モデルのいずれかを使用します。

Spatialでの座標系サポート(測地座標、投影座標、ローカル座標、座標系の変換など)の詳細は、第6章を参照してください。

1.5.5 許容差

許容差は、空間データに精度レベルを関連付けるために使用します。許容差は、(たとえば、丸めの誤差の調整のために、)2つの点が一致しない場合でも、2点が同一の点とみなされる最大距離に影響します。許容差には、0(ゼロ)より大きい正の数字を指定する必要があります。値の重要度は、空間データが測地座標系に関連付けられているかどうかによって異なります。(測地座標系および他の座標系の詳細は、1.5.4項を参照してください。)

  • 測地データ(経度と緯度の座標によって識別されるデータなど)の場合、許容差はm単位になります。たとえば、許容差100は、100mの許容差を示します。測地データの許容差には、0.05 (5cm)以上の値を指定する必要があります。SDO_GEOM.RELATESDO_GEOM.SDO_DIFFERENCESDO_GEOM.SDO_INTERSECTIONSDO_GEOM.SDO_UNIONおよびSDO_GEOM.SDO_XORファンクションでは、測地データの許容差の値に0.05より小さい値を指定しても、0.05が使用されます(ただし、ジオメトリは許容差0.05で有効である必要があります)。

  • 非測地データの場合、許容差は、データに関連付けられた座標系に関連付けられた単位での数値です。たとえば、測定単位がマイルの場合、許容差の値0.005は許容差0.005(1/200)マイル(約26フィート(7.9メートル))を示し、許容差の値2は許容差2マイルを示します。

いずれの場合も、許容差が小さいほど、データに関連付けられる精度は高くなります。

空間ブール演算(SDO_GEOM.SDO_UNIONSDO_GEOM.SDO_INTERSECTIONなど)およびSDO_GEOM.RELATEファンクションでは、16桁以上の精度を持つジオメトリについて、浮動小数点演算での精度不足が原因で、一貫性のない結果が生成されることがあります。精度の桁数は、たとえば許容差が0.0000000005に設定され、座標の整数部分が6桁(123456.4321など)であるとすると、精度は10+6つまり16桁という計算になります。このような場合は、空間演算を使用した結果に一貫性を持たせるため、使用する許容差をより大きく(小数点に続くゼロをより少なく)します。

許容差は、次の2つの項目で指定されます。

  • レイヤーのジオメトリ・メタデータの定義(1.5.5.1項を参照)

  • 特定のファンクションに対する入力パラメータ(1.5.5.2項を参照)

線形参照システム(LRS)データの許容差の詳細は、7.6項を参照してください。

1.5.5.1 レイヤーのジオメトリ・メタデータの許容差

レイヤーの次元情報には、許容差が含まれます。具体的には、xxx_SDO_GEOM_METADATAビューのDIMINFO列(2.8.3項を参照)には、次元ごとにSDO_TOLERANCE値が含まれ、この値は各次元で同じあることが必要です。

ファンクションがオプションのtoleranceパラメータを受け入れ、このパラメータがNULLまたは指定されていない場合は、レイヤーのSDO_TOLERANCE値が使用されます。2.1項の例の非測地データを使用すると、ジオメトリcola_bcola_d間の実際の距離は0.846049894です。問合せでtoleranceパラメータ値を指定しないでSDO_GEOM.SDO_DISTANCEファンクションを実行すると、戻されるcola_bcola_d間の距離の結果はレイヤーのSDO_TOLERANCE値によって異なります。次に例を示します。

  • レイヤーのSDO_TOLERANCE値が0.005の場合、この問合せは0.846049894を戻します。

  • レイヤーのSDO_TOLERANCE値が0.5の場合、この問合せは0(ゼロ)を戻します。

    Spatialは、まず考慮する各ジオメトリの周りに許容差(0.5)の仮想的なバッファを構築します。この場合、cola_bおよびcola_dの周りのバッファがオーバーラップするため、結果が0(ゼロ)になります。(考慮対象の2つのジオメトリが異なる許容差を持つ場合、大きい方の値が仮想的なバッファ用に使用されます。)

したがって、次の2つのいずれかの方法を使用して、レイヤーのSDO_TOLERANCE値を選択できます。

  • 値に、オブジェクト間の距離を問合せする場合の精度レベルを反映します。たとえば、距離の単位で0.8離れた2つの非測地ジオメトリを離れているとみなす必要がある場合、SDO_TOLERANCEを小さい値(0.05以下など)に指定します。

  • 値に、レイヤー内のジオメトリに関連付けられた値の精度を反映します。たとえば、非測地レイヤー内のすべてのジオメトリが整数で定義され、距離の単位で0.8離れている2つのオブジェクトを離れているとみなさない場合は、SDO_TOLERANCEの値を0.5に指定すると適切です。すべての問合せでの精度を上げるには、toleranceパラメータを指定してデフォルトを上書きする必要があります。

非測地データの場合、2つ目の方法(レイヤーに存在するジオメトリの値の精度)のほとんどのインスタンスで、ジオメトリ定義の最高レベルの精度を指定し、次のレベルでSDO_TOLERANCE値を0.5に指定することをお薦めします。たとえば、ジオメトリが整数で定義されている(2.1項に簡単な例を示す)場合、適切な値は0.5です。ただし、ジオメトリが小数点第4桁までの数値(31.2587など)で定義されている場合、適切な値は0.00005です。


注意:

ジオメトリに、任意の点で幅が狭く、対辺の間の距離が提案された許容差より短いポリゴンが含まれている場合は、このガイドラインに従わないでください。許容差が、すべてのポリゴンのすべての2辺間の最短距離より小さいことを確認してください。

また、実際はジオメトリが有効であるにもかかわらず、ジオメトリの挿入または更新で「invalid geometry」エラーが発生した場合は、許容差の精度を上げることを検討してください(たとえば、0.00005から0.000005に変更)。


1.5.5.2 入力パラメータとしての許容差

多くの空間ファンクションでtoleranceパラメータを指定でき、このパラメータは(指定した場合)、レイヤーのデフォルトの許容差を上書きします(1.5.5.1項を参照)。2点間の距離が許容差以下の場合、Spatialはその2つの点を単一の点とみなします。そのため、許容差には、空間データを認識させる精度を反映します。

たとえば、家から5km以内の距離にあるレストランを検索する場合を考えてみます。Maria's Pizzeriaが、家から5.1kmの場所にあるとします。空間データに測地座標系が関連付けられており、許容差に100 (または500など、これ以上の値)を使用して5km以内にあるすべてのレストランを検索するように指定した場合、5.1kmは5km (5000m)から100m以内であるためMaria's Pizzeriaは含まれます。許容差を100未満(50など)に指定した場合、Maria's Pizzeriaは含まれません。

各ケースの最適値はデータを使用するアプリケーションの種類によって異なりますが、通常、空間ファンクションの許容差は非常に小さい値です。1.5.5.1項に示す許容差のガイドラインを参照してください。また、すべての入力ジオメトリが有効であることを確認します。(ジオメトリ・データが有効でないと、空間ファンクションは予測どおりに動作しないことがあります。)

ジオメトリ・レイヤーの次元情報配列からの許容差値を明示的に使用する必要があり、かつ1つのサブプログラムにtolerance (またはtol)パラメータを使用する形式とdimパラメータを使用する形式がある場合は、dimの形式を使用します。次の例で、最初の文では次元情報配列からの許容差値を使用し、2番目の文では許容差値を数値で指定しています(0.005)。

-- Return the area of the cola_a geometry.
 
SELECT c.name, SDO_GEOM.SDO_AREA(c.shape, m.diminfo) 
  FROM cola_markets c, user_sdo_geom_metadata m 
  WHERE m.table_name = 'COLA_MARKETS' AND m.column_name = 'SHAPE' 
  AND c.name = 'cola_a';
 
SELECT c.name, SDO_GEOM.SDO_AREA(c.shape, 0.005) FROM cola_markets c 
   WHERE c.name = 'cola_a';

1.6 問合せモデル

Spatialでは、空間問合せおよび空間結合を解決するために、2層問合せモデルを使用します。2層問合せとは、問合せの解決のために実行される2種類の別々の処理を指します。両方を組み合せた処理が実行されると、完全一致の結果セットが戻されます。

この2つの処理を、1次および2次フィルタ処理と呼びます。

  • 1次フィルタを使用すると、候補レコードを高速に選択した後で、その結果セットを2次フィルタに渡すことができます。1次フィルタでは、ジオメトリの近似値を比較して計算の複雑さを軽減させるため、これは低コスト化のためのフィルタであるといえます。1次フィルタでは、ジオメトリの近似値を比較するため、完全一致の結果セットのスーパーセットが戻されます。

  • 2次フィルタでは、1次フィルタの結果であるジオメトリが、完全一致幾何学計算によって処理されます。2次フィルタによって、空間問合せに対する完全一致の回答が得られます。2次フィルタ処理は、計算が複雑であるという点では高コストですが、データ・セット全体ではなく、1次フィルタから渡された結果セットのみに限定して処理されます。

図1-2に、1次フィルタと2次フィルタの関係を示します。

図1-2 問合せモデル

図1-2の説明が続きます。
図1-2「問合せモデル」の説明

図1-2に示すように、大量入力データセットに対する1次フィルタ処理は、少数の候補セットを生成します。この候補セットには、少なくとも完全一致の結果セットとそれ以上のレコードが含まれます。少数の候補セットに対する2次フィルタ処理では、完全一致の結果セットを生成します。

Spatialでは、1次フィルタ機能を実行するために空間索引を使用します。Spatialでは、1次フィルタと2次フィルタを常に両方とも使用する必要はありません。1次フィルタを使用するのみで十分な場合もあります。たとえば、マップ・アプリケーションのズーム機能では、可視部分の境界を表現する矩形に重なるデータを問い合せます。1次フィルタを使用すると、問合せのスーパーセットが高速に戻されます。その後マップ・アプリケーションは、クリッピング・ルーチンを適用することによって、ターゲット領域を表示します。

1次フィルタの目的は、データのサブセットを高速に作成し、2次フィルタでの処理の負荷を軽減させることです。そのため1次フィルタでは、できるだけ効率的に(選択的かつ高速に)処理する必要があります。これは、データの空間索引の特性に左右されます。

空間データの問合せの詳細は、5.2項を参照してください。

1.7 空間データの索引付け

Oracle Databaseのエンジンに導入された、空間索引の作成機能は、Spatial製品の重要な機能です。空間索引は、他の索引と同様、検索対象を限定するメカニズムを提供しますが、この場合は、交差および包含のような空間基準に基づきます。空間索引は、次の場合に必要です。

  • 指定された点または対象領域(ウィンドウ問合せ)と重なる、索引付きデータ領域内のオブジェクトを検索する場合

  • 空間的に相互作用(空間結合)する2つの索引付きデータ領域内のオブジェクトの組合せを検索する場合

大量のワークロードおよび演算子が含まれる空間索引については、現在、テスト中です。

これ以降の項では、Rツリー索引に関連する概念およびオプションについて説明します。

1.7.1 Rツリー索引

空間Rツリー索引では、最大4次元の空間データの索引付けが可能です。Rツリー索引は、図1-3に示すとおり、ジオメトリを囲む最小の矩形(最小境界矩形(MBR))によって各ジオメトリを近似させます。

図1-3 MBRに囲まれたジオメトリ

図1-3の説明が続きます。
図1-3「MBRに囲まれたジオメトリ」の説明

ジオメトリのレイヤーでは、Rツリー索引は、図1-4に示すとおり、レイヤー内のジオメトリのMBRに対する階層索引で構成されています。

図1-4 MBR上のRツリー階層索引

図1-4の説明が続きます。
図1-4「MBR上のRツリー階層索引」の説明

次に、図1-4について説明します。

  • 1 から9 は、レイヤー内のジオメトリです。

  • abc およびd は、Rツリー索引のリーフ・ノードで、ジオメトリへのポインタとともにジオメトリの最小境界矩形を含みます。たとえば、a にはジオメトリ1 および2 のMBRが含まれ、b にはジオメトリ3 および4 のMBRが含まれます。

  • A にはa およびb のMBRが含まれ、B にはc およびd のMBRが含まれます。

  • ルートには、A およびB のMBR(図に示す領域全体)が含まれます。

このRツリー索引は、空間索引表(2.9項に示すUSER_SDO_INDEX_METADATAビューのSDO_INDEX_TABLE)に格納されます。また、Rツリー索引は、順序オブジェクト(USER_SDO_INDEX_METADATAビューのSDO_RTREE_SEQ_NAME)の管理も行い、索引に対する同時ユーザーによる同時更新が可能になります。

1.7.2 Rツリーの品質

Rツリー索引に影響する挿入および削除操作を何度も行うと、Rツリー構造の品質が低下し、これによって問合せのパフォーマンスが低下する場合があります。

Rツリーは、ツリーの異なる高さにノードを持つ階層ツリー構造です。問合せでのRツリー索引構造のパフォーマンスは、Rツリーの索引ノードの面積および周囲の長さに比例します。たとえば、レベル0 (ゼロ)の覆われた領域は、データ・ジオメトリの最小境界矩形が占める領域を表し、レベル1の領域は、リーフ・レベルのRツリー・ノードで覆われた領域を示します。ルート(最上位レベル)の領域とレベル0 (ゼロ)の領域の元の比率は、表の更新に基づいて時間の経過に応じて変化する可能性があります。その比率が悪化した(大幅に増えた)場合、索引を再作成すると問合せのパフォーマンスが向上する場合があります。

ジオメトリに影響を及ぼす多くの挿入、更新または削除操作を実行した際にSDO_FILTER操作のパフォーマンスが低下した場合、関連付けられたRツリー索引の品質の低下が原因である場合があります。SDO_TUNE.QUALITY_DEGRADATIONファンクション(第31章に記載)を使用して索引の品質が低下していないかを確認することができますが、このとき、ファンクションが2より大きい値を戻す場合は、索引を再構築することを検討してください。ただし、Oracleのキャッシュ方式およびその他の重要なOracle機能(Rツリーの索引問合せからI/Oオーバーヘッドを実質的に削除できる表固定など)が原因となることがあるため、問合せのパフォーマンス全体から見ると、Rツリーの索引の品質低下の値は重要でない場合もあります。

Rツリー索引を再作成するには、ALTER INDEX REBUILD文(第18章を参照)を使用します。

1.8 空間関係およびフィルタ処理

Spatialは、2次フィルタを使用して、データベース内のエンティティ間の空間関係を判断します。空間関係は、ジオメトリの位置に基づいています。空間関係の最も多くは、位相および距離に基づいています。たとえば、領域の境界は、その他の座標領域から領域を分割する曲線の集合で構成されています。領域の内部は、その境界上の点を除いて、領域のすべての点で構成されています。このため、領域内部の点ではなく境界の一部を共有している場合、2つの領域は接しているといえます。

2つの空間オブジェクトの距離は、それらのオブジェクトの点と点の最短距離です。2つのオブジェクトは、オブジェクト間の距離が指定された距離より短い場合、互いに指定された距離内にあるといえます。

空間関係を判断するために、Spatialにはいくつかの2次フィルタ・メソッドがあります。

  • SDO_RELATE演算子は、位相的な基準で判断します。

  • SDO_WITHIN_DISTANCE演算子は、2つの空間オブジェクトが互いに指定された距離内にあるかどうかを判断します。

  • SDO_NN演算子は、最も近くにある空間オブジェクトを識別します。

これらの演算子の構文については、第19章を参照してください。

SDO_RELATE演算子は、点、線およびポリゴンのバイナリ位相関係を分類する、9交差モデルを実装します。各空間オブジェクトには、内部、境界および外部があります。境界は、内部と外部を分ける点または線で構成されます。単一線ストリングの境界は、その終了点で構成されています。ただし、終了点が重なる(同じ点である)場合、その線ストリングには境界が存在しません。複数線ストリングの境界は、それを構成する各線ストリングの終了点です。ただし、終了点が重なる場合、奇数回重なる終了点のみが境界になります。ポリゴンの境界は、ポリゴンの周囲を描く線です。内部はオブジェクト内にあり、境界上にはない点で構成され、外部はオブジェクト内にはない点で構成されます。

オブジェクトAには3つの構成要素(境界Ab、内部Aiおよび外部Ae)があり、どのようなオブジェクトの組合せにも、それらの構成要素間には、9つの相互作用の可能性があります。構成要素の組合せには、空(0)または空ではない(1)セットの交差があります。2つのジオメトリ間で相互作用するセットは、交差する構成要素の組合せを指定する9交差マトリックスによって表現されます。図1-5に、互いに接している2つのポリゴンの9交差マトリックスを示します。このマトリックスによって、行優先形式(行を主にした順序で、ビット列を表記する形式)「101001111」に生成された、次のビット・マスクが得られます。

図1-5 9交差モデル

図1-5の説明が続きます。
図1-5「9交差モデル」の説明

Max Egenhofer博士(Maine州立大学)およびその仲間による研究で発見された一部の位相関係には、彼らに関係のある名前が付けられています。Spatialでは、次の名前を使用します。

  • DISJOINT: 境界および内部が交差しない。

  • TOUCH: 境界は交差するが、内部は交差しない。

  • OVERLAPBDYDISJOINT: 1つのオブジェクトの内部が他のオブジェクトの境界および内部と交差するが、その2つの境界は交差しない。この関係は、たとえば、1本の線がポリゴンの外側から始まり、ポリゴンの内側で終わる場合に発生します。

  • OVERLAPBDYINTERSECT: 2つのオブジェクトの境界および内部が交差する。

  • EQUAL: 2つのオブジェクトの境界および内部が同じである。

  • CONTAINS: 1つのオブジェクトの内部および境界が完全にもう1つのオブジェクトの内部に含まれている。

  • COVERS: 1つのオブジェクトの内部が、完全にもう1つのオブジェクトの内部または境界に含まれ、その2つのオブジェクトの境界が交差する。

  • INSIDE: CONTAINSの逆。A INSIDE Bは、B CONTAINS Aを意味します。

  • COVEREDBY: COVERSの逆。A COVEREDBY Bは、B COVERS Aを意味します。

  • ON: 1つのオブジェクトの内部および境界が、もう1つのオブジェクトの境界上にある。この関係は、たとえば、1本の線がポリゴンの境界上にある場合に発生します。

  • ANYINTERACT: オブジェクトがなんらかの形で接合する。

図1-6に、これらの位相関係を示します。

図1-6 位相関係

図1-6の説明が続きます。
図1-6「位相関係」の説明

SDO_WITHIN_DISTANCE演算子では、2つの空間オブジェクトAおよびBが、互いに指定された距離内にあるかどうかが判断されます。この演算子は、まず、参照オブジェクトの周りに距離バッファDbを構成します。その後、AとDbが結合していないことを確認します。オブジェクトの距離バッファは、そのオブジェクトから指定距離内にあるすべての点で構成されます。図1-7に、点、線およびポリゴンの距離バッファを示します。

図1-7 点、線およびポリゴンの距離バッファ

図1-7の説明が続きます。
図1-7「点、線およびポリゴンの距離バッファ」の説明

次に、図1-7に示す点、線およびポリゴンのジオメトリについて説明します。

  • 破線は、距離バッファを表します。オブジェクトの角の近くで、どのようにバッファが丸められるかに注意してください。

  • 右のジオメトリは、穴のあるポリゴンです。大きい矩形はポリゴンの外部の輪で、小さい矩形はポリゴンの内部の輪(穴)です。大きい矩形の外側の破線は外部の輪に対するバッファで、小さい矩形の内側の破線は内部の輪に対するバッファです。

SDO_NN演算子は、指定したジオメトリに最も近いジオメトリ列から、指定した数のオブジェクト(たとえば、公園に最も近いレストラン5件)を戻します。2つのオブジェクトの近さを判断するには、各オブジェクトの領域上にある2点間の最短距離が使用されます。

1.9 空間演算子、空間プロシージャおよび空間ファンクション

SpatialのPL/SQL Application Program Interface(API)には、いくつかの演算子と多くのプロシージャおよびファンクションが含まれています。

SDO_FILTERSDO_RELATEなどの空間演算子では、空間索引を使用するため、パフォーマンスが最適化されます。(空間演算子では、最初のパラメータのジオメトリ列に、空間索引が定義されている必要があります。)空間演算子は、問合せのWHERE句で使用する必要があります。演算子の最初のパラメータには検索するジオメトリ列を指定し、2番目のパラメータには問合せウィンドウを指定します。問合せウィンドウとジオメトリ列の座標系が異なる場合は、Spatialによって暗黙的な座標系変換が実行されます。空間演算子の詳細は、第19章を参照してください。

空間プロシージャと空間ファンクションは、PL/SQLパッケージ内のサブプログラム(SDO_GEOM、SDO_CS、SDO_LRSなど)として提供されます。これらのサブプログラムでは、空間索引を定義する必要がなく、空間索引を定義しても使用されません。これらのサブプログラムは、WHERE句または副問合せで使用できます。空間プロシージャまたは空間ファンクションで2つのジオメトリが入力パラメータとして使用される場合は、両方のジオメトリの座標系が同じである必要があります。


注意:

Spatial and Graphの演算子やサブプログラムに対する文字列(VARCHAR2)パラメータの中に数値がある場合は、ロケールにかかわらず、小数点にはピリオド(.)を使用する必要があります。例: 'distance=3.7'

空間演算子、空間プロシージャおよび空間ファンクションを使用する場合、パフォーマンスに関する次のガイドラインに従ってください。

  • 演算子と、プロシージャまたはファンクションが比較可能な操作を実行し、その演算子が要件を満たす場合は、その演算子を使用します。たとえば、特に必要がないかぎり、SDO_GEOM.RELATEではなくSDO_RELATEを使用し、SDO_GEOM.WITHIN_DISTANCEではなくSDO_WITHIN_DISTANCEを使用します。

  • 演算子には、常に大文字のTRUEを指定します。つまり、<> 'FALSE'= 'true'ではなく、= 'TRUE'を指定します。

  • 問合せウィンドウが表から取り出された場合は、演算子に/*+ ORDERED */オプティマイザ・ヒントを使用します。(複数のウィンドウが表から取り出された場合は、このヒントを使用する必要があります。)詳細は、各演算子の「使用上の注意」および「例」を参照してください。

トポロジで演算子を使用する方法は、『Oracle Spatialトポロジおよびネットワーク・データ・モデル開発者ガイド』を参照してください。

1.10 空間集計ファンクション

SQLには、SQL問合せの結果を集計するために使用される、集計ファンクションが存在します。次の例では、SUM集計ファンクションを使用して、部門ごとの従業員の給与を集計します。

SELECT SUM(salary), dept
   FROM employees
   GROUP BY dept;

Oracle Spatialの集計ファンクションでは、ジオメトリ・オブジェクトを伴うSQL問合せの結果を集計できます。空間集計ファンクションでは、SDO_GEOMETRY型のジオメトリ・オブジェクトが戻されます。たとえば、(2.1項の定義およびデータを使用して)次の文を実行すると、表内に存在するすべてのジオメトリの最小境界矩形が戻されます。

SELECT SDO_AGGR_MBR(shape) FROM cola_markets;

次の例では、cola_dを除くすべてのジオメトリの和集合が戻されます。

SELECT SDO_AGGR_UNION(SDOAGGRTYPE(c.shape, 0.005))
  FROM cola_markets c WHERE c.name <> 'cola_d';

空間集計ファンクションのリファレンス情報および使用例については、第20章を参照してください。


注意:

2次元と3次元の両方のジオメトリでサポートされているSDO_AGGR_MBR以外の空間集計ファンクションは、2次元ジオメトリでのみサポートされています。

1.10.1 SDOAGGRTYPEオブジェクト型

多くの空間集計ファンクションは、SDOAGGRTYPE型の入力パラメータを受け入れます。Oracle Spatialでは、次のとおりSDOAGGRTYPEオブジェクト型を定義します。

CREATE TYPE sdoaggrtype AS OBJECT (
 geometry SDO_GEOMETRY,
 tolerance NUMBER);

注意:

SDOAGGRTYPEを表内の列のデータ型として使用しないでください。この型は、空間集計ファンクションへのコールにのみ使用してください。

SDOAGGRTYPE定義のtolerance値は、特定の理由がないかぎり、ジオメトリのxxx_SDO_GEOM_METADATAビューのDIMINFO列に指定されたSDO_TOLERANCE値と同じである必要があります。許容差の詳細は、1.5.5項を参照してください。xxx_SDO_GEOM_METADATAビューの詳細は、2.8項を参照してください。

SDOAGGRTYPE定義のtoleranceの値は、空間集計ファンクションの結果に影響する可能性があります。図1-8に、2つの異なるtoleranceの値(ジオメトリ間の距離より小さい値と大きい値)を使用した、2つのジオメトリの空間集計和集合(SDO_AGGR_UNION)操作を示します。

図1-8 集計和集合操作の許容差

図1-8の説明が続きます。
図1-8「集計和集合操作の許容差」の説明

図1-8の最初の集計和集合操作では、toleranceが矩形間の距離より小さく、結果は2つの矩形で構成された複合ジオメトリになります。2つ目の集計和集合操作では、toleranceが矩形間の距離より大きく、結果は単一のジオメトリになります。

1.11 3次元の空間オブジェクト

Oracle Database リリース11.1より、Oracle Spatialでは、3次元の空間データの格納および取出しがサポートされています(扱うことができる3次元空間データは、点、点群(点の集合)、線、ポリゴン、面、ソリッドなど)。表1-1に、3次元のジオメトリに該当するSDO_GEOMETRY型のSDO_GTYPE属性および要素に関連する属性を示します。(SDO_GEOMETRY型については、2.2項を参照してください。)

表1-1 3次元ジオメトリのSDO_GEOMETRY属性

3-Dデータのタイプ SDO_GTYPE 要素タイプ、SDO_ELEM_INFOでの解釈

3001

該当しません。SDO_POINT_TYPE属性に含まれる3次元の値をすべて指定します。

3002

2, 1

ポリゴン

3003

1003, 1: 平面の外部ポリゴン

2003, 1: 平面の内部ポリゴン

1003, 3: 平面の外部矩形

2003, 3: 平面の内部矩形

表面

3003

1006, 1:表面(次にポリゴンの要素情報が続きます)

コレクション

3004

2次元の場合と同様に扱われます

複数点(点群)

3005

1, n(nは点の数)

複数線

3006

2次元の場合と同様に扱われます

複数面

3007

1つ以上の表面の要素定義

ソリッド

3008

閉じられた1つの表面で形成される単純なソリッド: 1つの要素タイプ1007の後に、1つの要素タイプ1006(外部表面)が続き、オプションで1つ以上の要素タイプ2006(内部表面)が続きます。

隣接する複数の単純なソリッドで形成される複合ソリッド: 1つの要素タイプ1008(単純なソリッドの数を保持)の後に、任意の数の要素タイプ1007(それぞれが1つの単純なソリッド)が続きます。

マルチソリッド

3009

1つ以上の単純なソリッドの要素定義(要素タイプ1007)または複合ソリッド(要素タイプ1008)


次の空間演算子を使用する計算では、3次元すべてが使用されます。

他の演算子では、最初の2次元のみ使用されます。前述した演算子には、この項で後述するように、測地データを処理するときに高さの情報が無視されるものもあります。(空間演算子については、第19章を参照してください。)

SDO_GEOM.SDO_VOLUMEファンクションはソリッド・ジオメトリ(その名のとおり3次元のジオメトリ)にのみ適用されます。ただし、このファンクションを測地データで使用することはできません。(この関数の詳細は、第24章を参照。)その他のSDO_GEOMサブプログラムにおける3次元のジオメトリのサポートについては、表24-1「ジオメトリ・サブプログラム」に続く使用方法を参照してください。

3次元ジオメトリでの距離計算は次のように行われます。

  • 測地データ(地理3Dデータ)の場合、距離計算は測地面上で行われます。

  • 非測地データ(投影データまたはローカル・データ)の場合、距離計算は、3次元すべての測定単位が同じ場合のみ有効です。

どのファンクション、プロシージャまたは演算子でも3次元すべてを使用できるようにするには、地理3Dデータ(経度、緯度、楕円体高)を含む空間表に空間索引を作成する際に、CREATE INDEX文でPARAMETERS ('sdo_indx_dims=3')を指定する必要があります。このパラメータをCREATE INDEX文で指定しないと、2次元の索引が作成されます。

3次元すべてを使用するSpatialのファンクション、プロシージャおよび演算子では、距離および長さの計算は、高さ(標高)を適切に組み込んで行われます。たとえば、3次元の点が2つあり、1つの点はデカルト空間の基点(0,0,0)にあり、もう1つの点はY軸上のX=3の位置の、高さ(Z)が4の位置(3,0,4)にあるとします。

  • 演算に3次元をすべて使用して計算すると、2点間の距離は5になります。(辺が3:4:5の直角三角形の斜辺と考えられます。)

  • 演算に2次元のみ使用すると、2点間の距離は3になります。(つまり、3番目の次元である高さは無視されます。)

ただし、次の演算子およびサブプログラムでは、測地データを処理するときに、3次元ジオメトリでの距離が地上表現(たとえば、ビルの伏図の経度/緯度方向の広がり)で計算され、高さの情報は無視されます。

3次元データを使用した2次元問合せウィンドウでは、SDO_FILTER演算子は使用できますが、その他の空間演算子は使用できません。

様々なタイプの3次元空間ジオメトリの作成例は、2.7.9項を参照してください。そこでは、3次元ジオメトリの空間メタデータの更新方法および空間索引の作成方法についても例を示しています。

3次元の座標参照系のサポートの詳細は、6.5項を参照してください。

空間集計ファンクションおよびPL/SQLパッケージとサブプログラムの多くで、3次元はサポートされません。2次元ジオメトリのみがサポートされるものは次のとおりです。

1.11.1 表面のモデル化

表面には面積はあるものの、容積はありません。また、2次元または3次元を使用できます。表面は、通常、一連の平面領域で構成されます。

表面は、表面タイプのSDO_GEOMETRYオブジェクトとして、または表面が非常に大きい場合はSDO_TINオブジェクトとしてモデル化されます。SDO_GEOMETRYにおける表面タイプは、隣接する3次元ポリゴンによって境界となる連続領域を定義する不定形面の場合があります。SDO_GEOMETRY内のポリゴンの数は、SDO_ORDINATES_ARRAYに指定可能な座標の数によって制限されます。一方、SDO_TINオブジェクトの場合、表面は三角形網としてモデル化され、三角形の数に対する明示的な制限はありません。

表面は、三角形網として、Triangulated Irregular Network(TIN)と呼ばれる形式で格納されます。TINモデルでは、面は連続した重ならない三角形の集合として表現されます。各三角形の表面は、1つの平面で表現されます。三角形は質点と呼ばれる一連の点で構成されます。慎重に質点を選択した場合、TINでは表面のモデルが正確に表現されます。山の頂上、谷底、または崖の縁(頂上や底)など、表面の形状に大きな変化がある場所では、質点が適切に配置されます。

TINは通常、経度(x)、緯度(y)および標高(z)の各次元における座標値を指定する3次元の点を基に計算されます。OracleのTIN生成ソフトウェアでは、デローニ三角分割法が使用されますが、デローニ三角分割法のみを使用してTINデータを形成する必要はありません。

TINの一般的な操作手順は次のとおりです。

  1. SDO_TIN_PKG.INITファンクションを使用して、TINを初期化します。

  2. SDO_TIN_PKG.CREATE_TINプロシージャを使用して、TINを作成します。

  3. 問合せが必要な場合は、SDO_TIN_PKG.CLIP_TINファンクションを使用して、TINをクリップします。

  4. 必要に応じて、SDO_TIN_PKG.TO_GEOMETRYファンクションを使用します(たとえば、クリップ操作の結果を1つのSDO_GEOMETRYオブジェクトに変換する場合)。

TINの操作に使用するPL/SQLサブプログラムについては、第30章を参照してください。

JavaによるTINの操作の例は、次のファイルを参照してください。

$ORACLE_HOME/md/demo/TIN/examples/java/README.txt
$ORACLE_HOME/md/demo/TIN/examples/java/readTIN.java

1.11.2 ソリッドのモデル化

最も単純なソリッドの種類は、サイコロや積み木のような立方形として表現できます。複雑なソリッドとして錐台があります。これは(3面以上の)大きなピラミッドを底面と平行な平面で切り取って形作ったピラミッドです。錐台は、空間演算子の問合せウィンドウとしてのみ使用できます。錐台および立方体は、通常、ソリッド・タイプのSDO_GEOMETRYオブジェクトとしてモデル化されます。図1-9に、ビュー・ポイントからの距離が異なる2つの空間オブジェクトを含む問合せウィンドウとしての錐台を示します。

図1-9 空間オブジェクトの問合せウィンドウとしての錐台

図1-9の説明が続きます。
図1-9「空間オブジェクトの問合せウィンドウとしての錐台」の説明

点群(点の巨大な集合体)を使用して、ソリッド・ジオメトリおよび表面ジオメトリの形状または構造をモデル化することもできます。点群データを使用するほとんどのアプリケーションには、位置に基づく問合せと、位置および可視性の両方に基づく問合せ(可視性問合せ)という2種類の空間問合せのいずれかが含まれます。

点群データを使用するアプリケーションのほとんどは、ビュー・ポイントからの距離に基づいてオブジェクトを取得することで、データ転送の最小化を図ります。たとえば、図1-9では、オブジェクトBはオブジェクトAよりもビュー・ポイントから離れています。したがって、アプリケーションは、オブジェクトAを細部まで(高解像度で)取得し、オブジェクトBを大まかに(低解像度で)取得する可能性があります。ほとんどの場合、ビュー・ポイントからの距離が遠くなるほど、オブジェクトの数は著しく増加します。また、離れているオブジェクトが近くにあるオブジェクトより低解像度で取得されると、問合せによって戻されるバイト数およびオブジェクトのレンダリング時間は飛躍的に減少します。

点群の一般的な操作手順は次のとおりです。

  1. SDO_PC_PKG.INITファンクションを使用して、点群を初期化します。

  2. SDO_PC_PKG.CREATE_PCプロシージャを使用して点群を作成します。

  3. 問合せが必要な場合は、SDO_PC_PKG.CLIP_PCファンクションを使用して、点群をクリップします。

  4. 必要に応じて、SDO_PC_PKG.TO_GEOMETRYファンクションを使用します(たとえば、クリップ操作の結果を1つのSDO_GEOMETRYオブジェクトに変換する場合)。

点群の操作に使用するPL/SQLサブプログラムについては、第28章を参照してください。

Javaによる点群の操作の例は、次のファイルを参照してください。

$ORACLE_HOME/md/demo/PointCloud/examples/java/README.txt
$ORACLE_HOME/md/demo/PointCloud/examples/java/readPointCloud.java

1.11.3 3次元の最適化された矩形

3次元の矩形(3次元空間の矩形状のポリゴン)のすべての頂点を指定するかわりに、X、YおよびZ次元について最小座標値(min-corner)と最大座標値(max-corner)に対応する2つの角を指定するだけで矩形を表現できます。

この方法で定義された3次元の矩形の方向は、次のようになります。

  • 矩形が<min-corner, max-corner>で指定された場合、法線は直交する3つ目の次元の正の方向を指します。

  • 矩形が<max-corner, min-corner>で指定された場合、法線は直交する3つ目の次元の負の方向を指します。

たとえば、矩形がXY面にあり、頂点の順序が<min-corner, max-corner>の場合、法線は正のZ軸方向を指しますが、順序が<max-corner, min-corner>の場合、法線は負のZ軸方向を指します。

矩形におけるこれらの方向規則を使用して、次の要件を満たすように、矩形のmin-cornermax-cornerの各頂点の順序を適切に指定できます。

  • 矩形がソリッドの一部である場合、ソリッドにおける各ポリゴンの法線は常にソリッドから外方向を指します。

  • 矩形が面の一部である場合、内側の矩形ポリゴンはその外側の矩形ポリゴンとは反対の方向を向きます。

1.11.4 テクスチャ・データの使用


注意:

この項では、Spatialでテクスチャ・データを使用するために理解しておく必要のある概念について説明します。ただし、テクスチャ・メタデータはまだOracle Spatialに完全に実装されておらず、ビューアはまだサポートされていません。この項は、テクスチャのサポートがリリースされるときに更新されます。

テクスチャは、フィーチャの1つ以上の部分を表すイメージです。テクスチャは、一般的に、空間ジオメトリとして格納されているオブジェクトを表示するビジュアライザ・アプリケーション(ビューア)で使用されます。たとえば、テクスチャを使用してオフィス・ビル(3次元ソリッド)をビューアで表示し、色だけを使用する場合よりさらにリアルな視覚化を実現することができます。テクスチャは、2次元と3次元のジオメトリで使用できます。

最も単純なケースでは、矩形ジオメトリをテクスチャ・ビットマップで覆うことができます。ただし、多くの場合、次のケースの例のように、テクスチャ・ビットマップのサブリージョンのみが使用されます。

  • テクスチャ・ビットマップに、同じビルの複数の側面、屋根および切妻屋根が含まれる場合。このケースでは、各ビットマップ部分が、ジオメトリの面の1つを覆っています。

  • テクスチャ・ビットマップがビルの面上にある1つのパネルまたは窓を表し、ジオメトリ面がこのようなパネルまたは窓を15個備えた壁(3つの階それぞれに5個ずつ)を表す場合。このケースでは、1つのテクスチャ・ビットマップを面上に15回並べます。

  • 面が矩形以外のサブ面(切妻屋根など)である場合。このケースでは、テクスチャ・ビットマップの一部(可能な三角形)のみが使用されます。

図1-10に、表示すると3つのテクスチャで構成される大きな矩形面を示します(各テクスチャは、面の様々な場所で複数回繰り返されます)。

図1-10 面とテクスチャ

図1-10の説明が続きます。
図1-10「面とテクスチャ」の説明

次に、図1-10について説明します。

  • イメージ全体は12個の小さな矩形面(表面ジオメトリ)で構成される大きな面であり、小さな矩形面はそれぞれ(A、BおよびCのラベルが付けられた)3つのイメージのうち1つで表すことができます。

  • (A、BおよびCのラベルが付けられた)3つのテクスチャ・ビットマップを使用すると、すべての面を視覚化できます。このケースでは、ビットマップAを3回、ビットマップBを6回、ビットマップCを3回使用します。

図1-11に、三角形の面にマッピングされたテクスチャ・ビットマップを示します。

図1-11 面にマッピングされたテクスチャ

図1-11の説明が続きます。
図1-11「面にマッピングされたテクスチャ」の説明

次に、図1-11について説明します。

  • 面(表面ジオメトリ)は三角形です。(たとえば、ビルの側面または屋根に、この面が複数含まれる可能性があります。)

  • テクスチャ・ビットマップ(イメージ)は矩形です(中央のボックスを参照)。

  • テクスチャ・ビットマップの一部が面のイメージを表します。この部分は右側のボックス内で破線で表されています。

    アプリケーションでは、テクスチャ・ビットマップ内で座標を指定して、適切な部分を面ジオメトリにマッピングする必要があります。

面を表すイメージ・データの記憶域要件を最小化するために、必要となる重複していないテクスチャのみのイメージを格納する必要があります。テクスチャの格納に使用するデータ型はSDO_ORDINATE_ARRAYであり、これはSDO_GEOMETRY型定義(2.2項を参照)で使用されます。

たとえば、図1-10の大きな面が次のように定義されているとします。

SDO_GEOMETRY(
  2003,  -- two-dimensional polygon
  NULL,
  NULL,
  SDO_ELEM_INFO_ARRAY(1,1003,1), -- one polygon (exterior polygon ring)
  SDO_ORDINATE_ARRAY(1,1. 1,13, 13,13, 1,13, 1,1)
)

次のように定義されたMY_TEXTURE_COORDINATES表があるとします。

CREATE TABLE my_texture_coordinates (
  texture_coord_id NUMBER PRIMARY KEY,
  texture_name VARCHAR2(32),
  texture_coordinates SDO_ORDINATE_ARRAY);

例1-1では、この表に3つのテクスチャ座標の定義を挿入しています。テクスチャごとに、テクスチャ座標が図1-10で示す適切な小さな矩形のうち1つを反映します(ただし、各テクスチャに対しては、適切な矩形のうち任意のものを選択できます)。図1-1では、各テクスチャのSDO_ORDINATE_ARRAY定義で、図1-10の上部近くにあるポリゴンを反映しています。

例1-1 テクスチャ座標の定義の挿入

INSERT INTO my_texture_coordinates VALUES(
  1,
  'Texture_A',
   SDO_ORDINATE_ARRAY(1,9, 1,5, 5,12, 1,12, 1,9)
  );
 
INSERT INTO my_texture_coordinates VALUES(
  2,
  'Texture_B', 
  SDO_ORDINATE_ARRAY(5,9, 9,9, 9,12, 5,12, 5,9)
  );
 
INSERT INTO my_texture_coordinates VALUES(
  3,
  'Texture_C', 
  SDO_ORDINATE_ARRAY(1,12, 13,12, 13,13, 1,13, 1,12)
  );

1.11.4.1 テクスチャ・データのスキーマに関する考慮事項

テクスチャ・ビットマップ(VARCHAR2形式のBLOBまたはURLとして格納)とテクスチャ座標配列(SDO_ORDINATE_ARRAY型を使用して格納)は、SDO_GEOMETRY列として同じ表に格納したり、個別の表に格納することができますが、特にテクスチャ・ビットマップについては、通常、個別の表を使用することをお薦めします。テクスチャ・ビットマップはフィーチャ(異なるオフィス・ビルなど)間で共有可能になる可能性が高いのですが、テクスチャ座標の定義はフィーチャ間で共有可能になる可能性が低くなります。(たとえば、多くのオフィス・ビルは同じ一般的なガラスの外観を共有しますが、窓の数と階数が同じビルはほとんどありません。テクスチャとアプリケーションの設計では、同じテクスチャのサブリージョンを使用するビルの数、または同じサイズの反復マトリクスでテクスチャを覆うビルの数を考慮する必要があります。)

例外は、テクスチャ・ビットマップ全体で矩形のジオメトリ面を覆うテクスチャ座標配列です。この場合は、テクスチャ座標配列を(0,0, 1,0, 1,1, 0,1, 1,1)として指定することができます(左下、右下、右上、左上および最後に左下の頂点を定義します)。多くのデータ・セットで、このテクスチャ座標配列を広く使用していますが、これはデータ・セットでは主に矩形面を使用し、各テクスチャ・ビットマップに対して1つのファサードを格納するためです。

個別の表を使用している場合は、外部キーを使用してこれらの表を表面ジオメトリにリンクできます(例1-2を参照)。

例1-2 テクスチャ座標の表、テクスチャの表および面の表の作成

-- One row for each texture coordinates definition.
CREATE TABLE my_texture_coordinates (
  texture_coord_id NUMBER PRIMARY KEY,
  texture_coordinates SDO_ORDINATE_ARRAY);
 
-- One row for each texture.
CREATE TABLE my_textures(
  texture_id NUMBER PRIMARY KEY,
  texture BLOB);
 
-- One row for each surface (each individual "piece" of a 
-- potentially larger surface).
CREATE TABLE my_surfaces(
  surface_id NUMBER PRIMARY KEY,
  surface_geometry SDO_GEOMETRY,
  texture_id NUMBER,
  texture_coord_id NUMBER,
  CONSTRAINT texture_id_fk 
    FOREIGN KEY (texture_id) REFERENCES my_textures(texture_id),
  CONSTRAINT texture_coord_id_fk 
    FOREIGN KEY (texture_coord_id) REFERENCES 
      my_texture_coordinates(texture_coord_id));

1.11.5 3次元ジオメトリの検証

SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXTおよびSDO_GEOM.VALIDATE_LAYER_WITH_CONTEXTサブプログラムで、2次元および3次元のジオメトリを検証できます。3次元ジオメトリの場合、これらのサブプログラムは、3次元ジオメトリ全体内で2次元ジオメトリに必要な検証(SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXTの「使用上の注意」を参照)を行いますが、オブジェクト全体の3次元特性に固有の検証もいくつかの行います。

単純なソリッド(1つの外部表面と任意の数の内部表面を持つソリッド)の場合は、これらのサブプログラムで次の項目を確認します。

  • 閉鎖性: ソリッドは閉じている必要があります。

  • 到達可能性: ソリッドの各面は、隣接する各面と完全に共通なエッジを持つ必要があり、どの面からもすべての面に到達可能であることが必要です。

  • 内部と外部の非連結性: 内部表面は、複数の点や線で外部表面と交差しないことが必要です。つまり、内部表面で領域が重なることはできません。

  • 面への追加がないこと: ソリッドを構成する表面上に、追加の表面を定義することはできません。

  • 方向: すべての面で、法線ベクトル(面法線つまり法線)が外部ソリッドの外側(外部ソリッドから離れた方向)を指すように頂点が配置されている必要があります。したがって、外部ソリッドの容積は0(ゼロ)より大きい必要があり、内部ソリッドの容積は0(ゼロ)より小さい必要があります。

複合ソリッド(1つ以上のソリッドが相互に結合したもの)の場合は、これらのサブプログラムによって次の項目が確認されます。

  • 連結性: 複合ソリッドに含まれるすべてのソリッドは、1つ以上の面を共有している必要があります。

  • 容積0(ゼロ)の交差: 複合ソリッドに含まれるソリッドの交差部分の容積が0(ゼロ)であることが必要です。

マルチソリッド(単純なソリッドまたは複合ソリッドで構成される1つ以上のソリッド)の場合は、これらのサブプログラムによって次の項目が確認されます。

  • 非結合性: マルチソリッドに含まれる任意の2つのソリッドは、点または線を共有できますが、これ以外の方法で交差していないことが必要です。

1.12 ジオコーディング

ジオコーディングは、住所データの表を規格化された住所、位置およびその他のデータに変換するプロセスです。ジオコーディング操作の結果は、入力された住所または場所に対応する経度と緯度の座標のペアを含みます。たとえば、入力住所が22 Monument Square, Concord, MA 01742である場合、ジオコーディング操作の結果の経度と緯度の座標は、それぞれ-71.34937と42.46101(ジオコーディング・データ・プロバイダによって異なる)になります。

住所をジオコードすると、Oracle Spatialなどの空間エンジンを使用して、近接問合せまたは位置問合せを実行したり、Oracleのビジネス・パートナのツールおよびデータを使用して、デモグラフィック分析を行うことができます。また、ジオコードされたデータは、デモグラフィック情報に関連する区画、郵便番号、国コードなど、その他の空間データで使用することもできます。分析または問合せの結果は、Oracle Spatialに統合されているサード・パーティ・ソフトウェアを使用して、表形式のみでなく地図で表すことができます。

Oracle Spatialのジオコーディング機能の概念および使用方法については、第11章を参照してください。MDSYS.SDO_GCDR PL/SQLパッケージのリファレンス情報については、第23章を参照してください。

1.13 Spatial Java Application Programming Interface(API)

Oracle Spatialでは、次のパッケージが含まれるJava Application Programming Interface(API)を提供しています。

  • oracle.spatial.geometry: Spatial SQL SDO_GEOMETRYデータ型(説明はこのマニュアルを参照)のサポートを提供します。

  • oracle.spatial.georaster: GeoRasterの主要な機能のサポートを提供します(『Oracle Spatial GeoRaster開発者ガイド』を参照)。

  • oracle.spatial.georaster.image: GeoRasterオブジェクトまたはGeoRasterオブジェクトのサブセットからJavaイメージを生成し、イメージを処理するためのサポートを提供します。これらの機能の詳細は、『Oracle Spatial GeoRaster開発者ガイド』を参照してください。

  • oracle.spatial.georaster.sql: GeoRaster PL/SQL APIのラップのサポートを提供します(『Oracle Spatial GeoRaster開発者ガイド』を参照)。

  • oracle.spatial.network: Oracle Spatialネットワーク・データ・モデル(『Oracle Spatialトポロジおよびネットワーク・データ・モデル開発者ガイド』を参照)のサポートを提供します。

  • oracle.spatial.network.lod: Oracle Spatialネットワーク・データ・モデルにおいて、ロード・オンデマンド方法でネットワーク分析を行うためのサポートを提供します(『Oracle Spatialトポロジおよびネットワーク・データ・モデル開発者ガイド』を参照)。

  • oracle.spatial.network.lod.config: Oracle Spatialネットワーク・データ・モデルにおいて、ロード・オンデマンド(LOD)でのネットワーク分析を構成するためのサポートを提供します(『Oracle Spatialトポロジおよびネットワーク・データ・モデル開発者ガイド』を参照)。

  • oracle.spatial.topo: Oracle Spatialトポロジ・データ・モデル(『Oracle Spatialトポロジおよびネットワーク・データ・モデル開発者ガイド』を参照)のサポートを提供します。

  • oracle.spatial.util: 各種操作を実行するクラスを提供します。

これらのパッケージに含まれるクラスとインタフェースのリファレンス情報の詳細は、『Oracle Spatial Java API Reference』(Javadoc)を参照してください。

SpatialのJavaクラス・ライブラリは、<ORACLE_HOME>/md/jlib/ディレクトリ下の.jarファイルに格納されています。

1.14 Spatialによって作成される事前定義のユーザー・アカウント

Spatialでは、インストール中にジョブの実行に必要な最小限の権限を持つユーザー・アカウントが作成されます。これらのアカウントはロックされた期限切れの状態で作成されます。アカウントを使用する必要がある場合は、ロックを解除する必要があります。表1-2に、Spatialによって作成される事前定義のユーザー・アカウントを示します。

表1-2 Spatialによって作成される事前定義のユーザー・アカウント

ユーザー・アカウント 説明

MDDATA

ジオコーディング・アプリケーションおよびルーティング・アプリケーションで使用するデータを格納するためにOracle Spatialで使用されるスキーマです。これは、ジオコーディング・データおよびルーティング・データにアクセスするOracleソフトウェアのデフォルトのスキーマです。

SPATIAL_CSW_ADMIN_USR

Catalog Services for the Web(CSW)のアカウントです。データベースからすべてのレコード・タイプ・メタデータとすべてのレコード・インスタンスを、キャッシュされたレコード・タイプのメイン・メモリーにロードするために、Oracle Spatial CSWキャッシュ・マネージャで使用されます。

SPATIAL_WFS_ADMIN_USR

Web Feature Service(WFS)のアカウントです。データベースからすべての機能タイプ・メタデータとすべての機能インスタンスを、キャッシュされた機能タイプのメイン・メモリーにロードするために、Oracle Spatial WFSキャッシュ・マネージャで使用されます。


Oracle Databaseの事前定義のユーザー・アカウント(アカウント保護方法を含む)の詳細は、『Oracle Database 2日でセキュリティ・ガイド』を参照してください。

1.15 パフォーマンスおよびチューニングの情報

Oracle Spatialアプリケーションのパフォーマンスは、問合せ実行計画に影響するオプティマイザ・ヒントの使用など、多くの要因に影響されます。このマニュアルでは、特定の項目に関連するパフォーマンスおよびチューニングの情報を示します。たとえば、1.7.2項では、Rツリーの品質および問合せのパフォーマンスへの影響について説明します。1.9項では、空間演算子を使用すると、プロシージャやファンクションを使用する場合よりパフォーマンスが向上する理由について説明します。

Spatialのパフォーマンスおよびチューニングの追加情報は、Oracle Technology Network(OTN)で入手可能なホワイト・ペーパーを参照してください。多くの場合、これらのホワイト・ペーパーの情報はこのマニュアルの情報より詳細で、内部テストおよびSpatialユーザーからの参考を基に定期的に更新されます。OTNでこれらの情報を検索するには、次のURLに接続してください。

http://www.oracle.com/technetwork/database/options/spatialandgraph/

Spatialのパフォーマンスおよびチューニングに関するページを参照してください。

1.16 OGCおよびISOへの準拠

Oracle Databaseリリース10g バージョン10.1.0.4以降のOracle Spatialは、Open Geospatial Consortium(OGC)Simple Features Specification 1.1.1(Document 99-049)に準拠しています。Geometry Types Implementationに準拠しているということは、その仕様書の3.2項に詳細が述べられているすべての型、ファンクションおよび言語要素がOracle Spatialでサポートされていることを意味します。

すべてのOGCファンクション名に一致するシノニムが作成されますが、X(p Point)Y(p Point)に一致するシノニムは作成されません。これらのファンクションには、XおよびYのかわりに、OGC_XおよびOGC_Yを使用する必要があります。

Oracle Spatialは、次の国際標準化機構(ISO)の標準に準拠しています。

  • ISO 13249-3 SQL Multimedia and Application Packages - Part 3: Spatial

  • ISO 19101: Geographic information - Reference model (definition of terms and approach)

  • ISO 19109: Geographic information - Rules for application schema (called the General Feature Model)

  • ISO 19111: Geographic information - Spatial referencing by coordinates (also OGC Abstract specification for coordinate reference systems)

  • ISO 19118: Geographic information - Encoding (GML 2.1 and GML 3.1.1)

  • ISO 19107: Geographic information - Spatial schema (also OGC Abstract specification for Geometry)

ただし、Oracle Spatial and Graphの標準準拠テストは進行中であるため、いつでも最新バージョンの標準または新しい標準への準拠が通知される可能性があります。標準への準拠に関する最新情報は、http://www.oracle.com/technetwork/database/options/spatialandgraph/documentation/を参照してください。

1.17 Spatialのリリース(バージョン)番号

実行中のSpatialのリリース番号を確認するには、SDO_VERSIONファンクションを使用します。次に例を示します。

SELECT SDO_VERSION FROM DUAL;

SDO_VERSION
--------------------------------------------------------------------------------
11.2.0.2.0

1.18 表の空間的な有効化

SDO_GEOMETRY列がないが、ポイントの緯度/経度値などの位置に関連する情報を含んでいるOracle表を使用する場合、SDO_GEOMETRY列を追加し、レコードの既存(および現在以降)の位置に関連する情報を使用してSDO_GEOMETRY列の値を移入することで、表を空間的に有効化することができます。

次は、通常の表を空間的に有効化する基本手順です。これらは、通常の表に、表の各レコードに関連付けられた位置に関連する値を含む列があることを前提としています。

  1. (SDO_GEOMETRY)列を追加するために表を変更します。

  2. 位置に関連するデータの値を使用してSDO_GEOMETRYオブジェクトを移入するために、表を更新します。

  3. 空間メタデータ(USER_SDO_GEOM_METADATA)を更新します。

  4. 表に空間索引を作成します。

例1-3は、最初SDO_GEOMETRY列を含まないが、各レコードの緯度および経度の値(指定した都市内または近郊のポイント)を含む表(CITY_POINTS)を作成します。これは、表を空間的に有効化し、既存のレコードを更新してSDO_GEOMETRY情報を含めるだけでなく、新しいレコードを挿入してそれらを更新します。

例1-3 表の空間的な有効化

-- Original table without a spatial geometry column.
CREATE TABLE city_points (
  city_id NUMBER PRIMARY KEY,
  city_name VARCHAR2(25),
  latitude NUMBER,
  longitude NUMBER);
 
-- Original data for the table.
-- (The sample coordinates are for a random point in or near the city.)
INSERT INTO city_points (city_id, city_name, latitude, longitude)
  VALUES (1, 'Boston', 42.207905, -71.015625);
INSERT INTO city_points (city_id, city_name, latitude, longitude)
  VALUES (2, 'Raleigh', 35.634679, -78.618164);
INSERT INTO city_points (city_id, city_name, latitude, longitude)
  VALUES (3, 'San Francisco', 37.661791, -122.453613);
INSERT INTO city_points (city_id, city_name, latitude, longitude)
  VALUES (4, 'Memphis', 35.097140, -90.065918);
 
-- Add a spatial geometry column.
ALTER TABLE city_points ADD (shape SDO_GEOMETRY);
 
-- Update the table to populate geometry objects using existing
-- latutide and longitude coordinates.
UPDATE city_points SET shape = 
  SDO_GEOMETRY(
    2001,
    8307,
    SDO_POINT_TYPE(LONGITUDE, LATITUDE, NULL),
    NULL,
    NULL
   );
 
-- Update the spatial metadata.
INSERT INTO user_sdo_geom_metadata VALUES (
  'city_points',
  'SHAPE', 
  SDO_DIM_ARRAY(
    SDO_DIM_ELEMENT('Longitude',-180,180,0.5), 
    SDO_DIM_ELEMENT('Latitude',-90,90,0.5)
  ), 
  8307
);
 
-- Create the spatial index.
CREATE INDEX city_points_spatial_idx on city_points(SHAPE) 
  INDEXTYPE IS MDSYS.SPATIAL_INDEX;
 
-- Later, add new records to the table, using original INSERT format
-- (latitude and longitude, no spatial geometry object data).
-- Then update to include spatial geometry object information.
-- Tip: For efficiency, keep track of existing and new records, and use 
-- a WHERE clause to restrict the UPDATE to new records (not shown here).
 
INSERT INTO city_points (city_id, city_name, latitude, longitude)
  VALUES (5, 'Chicago', 41.848832, -87.648926);
INSERT INTO city_points (city_id, city_name, latitude, longitude)
  VALUES (6, 'Miami', 25.755043, -80.200195);
 
UPDATE city_points SET shape = 
  SDO_GEOMETRY(
    2001,
    8307,
    SDO_POINT_TYPE(LONGITUDE, LATITUDE, NULL),
    NULL,
    NULL
   );

例1-3に関する注意は、次のとおりです。

  • 列名が、UPDATE文のジオメトリ・コンストラクタ(この場合SDO_POINT)で正しい順序で指定されているかぎり、元の表にLATITUDEとLONGITUDEの値がこの順序で含まれていなくてもかまいません。(SDO_GEOMETRYオブジェクトでは、ポイントの経度が最初で、次が緯度です。)

  • 検証はポイントと関係ないため、ジオメトリの検証はこの例に含まれていません。ただし、他の種類のジオメトリを持つ表を空間的に有効化する場合、最初と追加のジオメトリすべてを検証する必要があります。(検証を実行するには、SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXTまたはSDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXTを使用します。)

1.19 Spatialメタデータの移動(MDSYS.MOVE_SDO)

データベース管理者(DBA)は、MDSYS.MOVE_SDOプロシージャを使用して、すべてのOracle Spatialメタデータ表を、指定したターゲット表領域に移動できます。デフォルトでは、Spatialメタデータ表は、リリース11.1以降のリリースではSYSAUX表領域に、また11.1より前のリリースではSYSTEM表領域に作成されます。

MDSYS.MOVE_SDOプロシージャの構文は次のとおりです。

MDSYS.MOVE_SDO(
   target_tablespace_name IN VARCHAR2);

必須パラメータであるtarget_tablespace_nameは、Spatialメタデータ表の移動先となる表領域の名前を指定します。

このプロシージャは、DBAのみが使用する必要があります。

移動操作中、他のすべてのOracle Spatial機能は無効になります。

次の例は、Spatialメタデータ表をSYSAUX表領域に移動します。

EXECUTE MDSYS.MOVE_SDO('SYSAUX');

1.20 空間アプリケーションのハードウェア要件の考慮事項

この項では、Oracle Spatialを使用するアプリケーションに必要なディスク領域の容量およびCPUの能力に影響する一般的なガイドラインについて説明します。このガイドラインは、一般的なアプリケーションのサイズ指定に使用するその他のガイドラインに代わるものではなく、それらのガイドラインを補足することを目的としています。

空間アプリケーションの次の特性は、記憶域およびCPUの能力の要件に影響する可能性があります。

  • データ量: 空間オブジェクトに必要な記憶域の量は、それらのオブジェクトの複雑さ(表現の精度および各オブジェクトの点の数)によって変わります。たとえば、100万の点オブジェクトを格納する場合に必要な領域は、100万の道路セグメントまたは土地区画を格納する場合より小さくなります。海岸線、断層線、川などの複雑な自然のフィーチャ、および地形のタイプによっては、高い精度で格納すると、必要な記憶域が非常に大きくなる可能性があります。

  • 問合せの複雑さ:ある矩形内のすべてのフィーチャを選択するなどの単純なマッピング問合せのCPU要件は、ある海岸線と交差するすべての断層線を検索するなどのより複雑な問合せより低くなります。

1.21 Spatialのエラー・メッセージ

Spatialのエラー・メッセージの詳細は、『Oracle Databaseエラー・メッセージ』を参照してください。

Oracleエラー・メッセージのドキュメントは、HTML版のみが存在します。Oracle Database JP Documentation Libraryへのアクセス権限のみを所有している場合は、エラー・メッセージを範囲ごとに参照できます。特定の範囲のページを表示したら、ブラウザの「このページの検索」機能を使用して特定のメッセージを検索できます。インターネットに接続できる場合、Oracleオンライン・ドキュメントのエラー・メッセージ検索機能を使用して特定のエラー・メッセージを検索できます。

1.22 Spatialの例

Oracle Spatialでは、特定の処理をコーディングするための理解を深めたり、モデルを作成するための例を提供しています。Oracle Database Examplesメディアからすでにデモ・ファイルをインストールしている場合は(『Oracle Database Examplesインストレーション・ガイド』を参照)、次のディレクトリにいくつかの例があります。

$ORACLE_HOME/md/demo/examples

ディレクトリに含まれる次のファイルは、Oracle Call Interface(OCI)を使用するアプリケーションに有効です。

  • readgeom.cおよびreadgeom.h

  • writegeom.cおよびwritegeom.h

このマニュアルには、SQLおよびPL/SQLの例も記載されています。これらの例と一緒に各ファンクションまたは各プロシージャの参照情報も提供されています。また、表と索引の作成方法、ファンクションとプロシージャの組合せおよび拡張機能を説明するための単純な例も提供されています。

  • 空間データの挿入、索引付けおよび問合せ(2.1項を参照)

  • 座標系(空間参照システム)(6.13項を参照)

  • 線形参照システム(LRS)(7.7項を参照)

  • ファンクション索引のSDO_GEOMETRYオブジェクト(9.2項を参照)

  • 複雑な問合せ(付録Cを参照)

1.23 Spatialおよび関連機能のREADMEファイル

README.txtファイルには、『Oracle Spatial開発者ガイド』(このマニュアル)、『Oracle Spatial GeoRaster開発者ガイド』、および『Oracle Spatialトポロジおよびネットワーク・データ・モデル開発者ガイド』の内容を補足する情報が記載されています。このファイルは、次の場所にあります。

$ORACLE_HOME/md/doc/README.txt