1 Spatialの概念

Oracle Spatial and Graphは、空間分析およびグラフ分析をサポートするファンクション、プロシージャ、データ型およびデータ・モデルを統合したものです。空間フィーチャを使用すると、Oracle Databaseでの空間データの格納、アクセスおよび分析を短時間で効率的に処理することができます。

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

主なトピック:

1.1 Oracle Spatial and Graphとは

Oracle Spatial and Graph (Spatial and Graphとも呼ばれる)には、空間データおよび空間分析と、物理グラフ・アプリケーション、論理グラフ・アプリケーション、ネットワーク・グラフ・アプリケーション、ソーシャル・グラフ・アプリケーションおよびセマンティック・グラフ・アプリケーション用の高度な機能が含まれています。

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

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

ノート:

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

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

Spatial and Graphでは、ジオメトリを表現するオブジェクト・リレーショナル・モデルがサポートされています。このモデルでは、ジオメトリ全体が、ベクトル・データ用のOracle固有の空間データ型(SDO_GEOMETRY)に格納されます。

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

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

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

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

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

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

  • 最適なパフォーマンス

1.3 空間データの概要

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

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

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

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

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

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

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

1.4 ジオメトリ・タイプ

ジオメトリは、直線セグメントまたは円弧を結合した頂点を順番につなげたものです。

ジオメトリのセマンティクスは、そのタイプによって決まります。Spatial and Graphは、いくつかの基本タイプ、および2次元を含む、次のタイプの集合で構成されるジオメトリをサポートしています。

  • 点および点クラスタ

  • 線ストリング

  • N点ポリゴン

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

  • 円弧ポリゴン

  • 複合ポリゴン

  • 複合線ストリング

  • 最適化された矩形

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

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

次の図は、ジオメトリ・タイプを表しています。

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

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

Spatial and Graphは、3次元および4次元のジオメトリ・タイプの格納および索引付けもサポートします。これらのジオメトリ・タイプでは、定義されるオブジェクトの各頂点の定義に3つまたは4つの座標が使用されます。3次元ジオメトリのサポートの詳細は、「3次元の空間オブジェクト」を参照してください。

1.5 データ・モデル

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

1.5.1 要素

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

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

1.5.2 ジオメトリ

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

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

1.5.3 レイヤー

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

1.5.4 座標系

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

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

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

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

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

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

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

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

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

1.5.5 許容差

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

  • 測地データ(経度と緯度の座標によって識別されるデータなど)の場合、許容差はm単位になります。たとえば、許容差10は、10mの許容差を示します。

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

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

測地データおよび投影データの場合、許容差には10より小さい値を指定する必要があります。また、ジオメトリが指定された許容差で有効であることを確認します。

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

ノート:

浮動小数点演算では、計算で使用される桁数が15桁を超えると、精度が失われる傾向があるため、計算に指定されている桁数が15桁未満であることを確認してください。たとえば、数値が123456.789で、許容差が10E-10である場合、これは事実上精度が16 (10+6)桁であることを意味し、推奨される15桁を超えています。

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

  • レイヤーのジオメトリ・メタデータ定義内

  • 特定のファンクションに対する入力パラメータとして

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

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

ファンクションがオプションのtoleranceパラメータを受け入れ、このパラメータがNULLまたは指定されていない場合は、レイヤーのSDO_TOLERANCE値が使用されます。「空間データの挿入、索引付けおよび問合せの例」の例の非測地データを使用すると、ジオメトリ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 and Graphは、まず考慮する各ジオメトリの周りに許容差(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に指定することをお薦めします。たとえば、ジオメトリが整数で定義されている(「空間データの挿入、索引付けおよび問合せの例」に簡単な例を示す)場合、適切な値は0.5です。ただし、ジオメトリが小数点第4桁までの数値(31.2587など)で定義されている場合、適切な値は0.00005です。

ノート:

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

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

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

多くの空間ファンクションではtoleranceパラメータを受け付けます。このパラメータが指定された場合、レイヤーのデフォルトの許容差がオーバーライドされます(「レイヤーのジオメトリ・メタデータの許容差」を参照)。2点間の距離が許容差以下の場合、Spatial and Graphはその2つの点を単一の点とみなします。そのため、許容差には、空間データを認識させる精度を反映します。

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

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

ジオメトリ・レイヤーの次元情報配列からの許容差値を明示的に使用する必要があり、かつ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 and Graphでは、空間問合せおよび空間結合を解決するために、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 and Graphでは、1次フィルタ機能を実行するために空間索引を使用します。Spatial and Graphでは、1次フィルタと2次フィルタを常に両方とも使用する必要はありません。1次フィルタを使用するのみで十分な場合もあります。たとえば、マップ・アプリケーションのズーム機能では、可視部分の境界を表現する矩形に重なるデータを問い合せます。1次フィルタを使用すると、問合せのスーパーセットが高速に戻されます。その後マップ・アプリケーションは、クリッピング・ルーチンを適用することによって、ターゲット領域を表示します。

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

関連トピック

1.7 空間データの索引付け

Oracle Databaseのエンジンに統合された空間索引付け機能は、Spatial and Graph製品の重要な機能です。

空間索引は、他の索引と同様、検索対象を限定するメカニズムを提供しますが、この場合は、交差および包含のような空間基準に基づきます。たとえば、次の場合に空間索引が使用されます。

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

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

リリース12.2以降では、空間索引の作成および使用は、Oracle Spatial and Graphの機能(SDO_NN演算子を除く)の使用に必須ではありません。ただし、空間索引は推奨であり、空間索引を使用しないと、場合によってはパフォーマンスに悪影響を与えることがあります。

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

これ以降の項では、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ツリー索引は、空間索引表(「空間索引に関する構造」に示す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ツリー索引の品質の低下が原因である場合があります。

Rツリー索引を再構築するには、ALTER INDEX REBUILD文を使用します。

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

Spatial and Graphは、2次フィルタを使用して、データベース内のエンティティ間の空間関係を判断します。空間関係は、ジオメトリの位置に基づいています。

空間関係の最も多くは、位相および距離に基づいています。たとえば、領域の境界は、その他の座標領域から領域を分割する曲線の集合で構成されています。領域の内部は、その境界上の点を除いて、領域のすべての点で構成されています。このため、領域内部の点ではなく境界の一部を共有している場合、2つの領域は接しているといえます。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

図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 and GraphのPL/SQL Application Program Interface (API)には、いくつかの演算子と多くのプロシージャおよびファンクションが含まれています。

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

空間プロシージャと空間ファンクションは、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 and Graphトポロジ・データ・モデルおよびネットワーク・データ・モデル・グラフ開発者ガイド』を参照してください。

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

SQLには、SQL問合せの結果を集計するために使用される、集計ファンクションが存在します。

次の例では、SUM集計ファンクションを使用して、部門ごとの従業員の給与を集計します。

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

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

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

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

ノート:

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

1.10.1 SDOAGGRTYPEオブジェクト型

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

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

ノート:

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

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

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 Spatial and Graphでは、3次元の空間データの格納および取出しがサポートされています(扱うことができる3次元空間データは、点、点群(点の集合)、線、ポリゴン、面、ソリッドなど)。

ノート:

3次元の空間オブジェクトは、Oracle Autonomous Databaseサーバーレス・デプロイメントでOracle JVMが有効になっている場合にのみサポートされます。Oracle JVMを有効にするには、Oracle Autonomous Databaseサーバーレスの使用Oracle Javaの使用で詳細を参照してください。

表1-1に、3次元のジオメトリに該当するSDO_GEOMETRY型のSDO_GTYPE属性および要素に関連する属性を示します。(SDO_GEOMETRY型については、「SDO_GEOMETRYオブジェクト型」を参照してください。)

表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, 1 (線と同じ)

複数面

3007

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

ソリッド

3008

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

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

マルチソリッド

3009

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

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

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

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

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

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

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

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

3次元すべてを使用する空間ファンクション、空間プロシージャおよび空間演算子では、距離および長さの計算は、高さ(標高)を適切に組み込んで行われます。たとえば、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次元空間ジオメトリの作成例は、「3次元のジオメトリ・タイプ」を参照してください。そこでは、3次元ジオメトリの空間メタデータの更新方法および空間索引の作成方法についても例を示しています。

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

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

表1-2では、Oracle Spatial and Graphで特定の測地3次元の計算を内部的に実行する方法について説明します。

表1-2 測地3次元の計算の実行方法

計算のタイプ 実行される内部計算

ANYINTERACT

入力ジオメトリがGnomonic変換を使用して変換された後、結果のジオメトリを使用してANYINTERACT関係が計算されます。

Area

入力ジオメトリがローカル交差平面に投影された後、結果の入力ジオメトリを使用して面積が計算されます。

DistanceまたはLength

2次元の正確な楕円体距離が、2つの最近点の経度と緯度を使用して計算された後、高さまたは長さの差が近似値を使用して含められます。

Volume

入力ジオメトリがローカル交差平面に投影された後、結果の入力ジオメトリを使用して容積が計算されます。

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オブジェクトに変換する場合)。

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「空間オブジェクトの問合せウィンドウとしての錐台」の説明

点群(点の巨大な集合体)を使用して、ソリッド・ジオメトリおよび表面ジオメトリの形状または構造をモデル化することもできます。点群データを使用するほとんどのアプリケーションには、位置に基づく問合せが含まれます。アプリケーションは、位置および可視性の両方に基づく問合せを実行する可視性のロジックを追加するために、Spatial and Graph外に出ることができます。

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

点群データの格納には、SDO_PCオブジェクトまたは平面表のいずれかを使用できます。使用する方法は、ご使用のハードウェア環境と使用方法に応じて異なります。平面形式の利点の1つは、その効果と動的な性質で、点データに対する更新であるため、再ブロック化を必要としません。

点群の一般的な操作手順は、その点群データがSDO_PCオブジェクトに格納されるか、平面表に格納されるかによって、次のようになります。

  • SDO_PCオブジェクトとして格納される点群データを使用するには:

    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オブジェクトに変換する場合)。

  • 平面表に格納される点群データを使用するには:

    1. 点群データのための表(または該当する表に基づくビュー)を作成します。

      各行には、1つの点の最初の3つの空間次元(およびオプションで非空間次元)の値が含まれます。表またはビューの定義は、VAL_D1 NUMBER、VAL_D2 NUMBERおよびVAL_D3 NUMBERの列で始まる必要があります。また、点群の非空間次元の列を含めることもできます。

    2. 表に点群データを移入します。

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

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

テクスチャは、フィーチャの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型定義(「SDO_GEOMETRYオブジェクト型」を参照)で使用されます。

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

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

1.13 位置データ・エンリッチメント

Oracle Spatial and Graphには、データベースにロードできる、現地点からの階層型の地理データを伴った場所名のデータ・セットが含まれます。

SDO_UTIL.GEO_SEARCHファンクションを使用してこの場所名データ・セットを検索できます。データ・セットには、場所名や住所、住所の一部などの一般的に使用されるテキストの位置データおよび緯度と経度の情報が含まれます。

ロケーション・タグはテキスト・データから抽出され、Oracle Textを使用して既知の場所名と照合され、既知の場所名に関連付けられた他の地理的情報を使用して強化されます。

結果は、元のデータを持つ追加の属性として格納できます。

この機能により、少ない量の構造化された地理的データおよび位置データを処理し、情報を分類、比較、フィルタ処理、および他のデータと関連付けできます。たとえば、名前の一部のみを持つデータを市区町村、郡、州および国を含むように強化し、州レベルの情報を持つ可能性がある他のデータ・セットと結合したり、分析できるようにすることができます。これは、使用可能なシステムおよびデータ・ウェアハウスの構造化された情報とBig Dataの結果を比較する場合に特に役立ちます。

位置データ・エンリッチメント・サポートの設定および使用

位置データ・エンリッチメント・サポートを使用するには、必要なデータベース・オブジェクトを作成してOracle Databaseにデータ・セットをロードするスクリプトの編集やそれらのスクリプトの実行などの特定の設定処理を実行するのみです。

  1. $ORACLE_HOME//md/demo/GeoSearchに移動します。ここには、すべての必要なファイルが含まれています。

  2. 基本的なステップの概要を含んだテキスト・ファイルであるREADMEファイルを読みます。

  3. READMEファイルに記載されている処理を実行します。

    この処理には、LICENSES.TXTファイルの参照、分かれたファイルからの1つのzipファイルの作成、load_data.sqlおよびcreate_index.sqlスクリプト・ファイル(このファイルには説明コメントが含まれる)の編集およびそれらのスクリプトの実行などがあります。

create_index.sqlファイルには、SDO_UTIL.GEO_SEARCHファンクションを使用した問合せの例がいくつか含まれています。それらの例とSDO_UTIL.GEO_SEARCHのリファレンスおよび使用方法の情報を使用して、位置データ・エンリッチメント・サポートの独自の使用法を開発できます。

1.13.1 ELOC_ADMIN_AREA_SEARCH表

ELOC_ADMIN_AREA_SEARCH表は、位置データ・エンリッチメントのデータの格納に使用されます。「位置データ・エンリッチメント」に記載されている必要な設定処理を行った場合にのみ作成され、選択したデータベース・スキーマに作成されます。

この表にはSDO_UTIL.GEO_SEARCHプロシージャでアクセスできます。この表には次の列が含まれます。

表1-3 LOC_ADMIN_AREA_SEARCH表

列名 説明
AREA_ID 場所名の一意のID。
FULL_NAME 検索可能な文字列である場所の名前。たとえば、"NASHUA,HILLSBOROUGH,NEW HAMPSHIRE,NH,UNITED STATES,USA"は、米国ニューハンプシャー州ナシュア市の検索可能な名前です。

このエントリは、名前階層の各レベルの使用可能な名前をすべて連結したリストです。つまり、州の場合、略称とフル・ネームの両方を持てるということです。同様に、国の場合、略称とフル・ネームの両方を持つことができます。これによって、検索でこれらの行政区域に異なる検索語が使用された場合でもこのエントリを検出することができます。

AREA_NAME 行政区域の実際の区域名。
KEY 検索APIから返される標準化されたテキスト・キー。これは、検索語を他の語との結合に使用できる正規化された標準キーです。
LANG_CODE このエントリに使用される言語の3文字のISOコード。
PART_ID この表がパーティション化されている場合に使用される数値(詳細はREADMEを参照してください)。
CENTER_LONG 場所名の経度。
CENTER_LAT 場所名の緯度。
POPULATION 指定された検索語に対して複数の一致が見つかった場合に結果の順序付けに使用される数値。同じ検索語に対して複数の一致が見つかった場合に人口の多い区域を人口の少ない区域より先に戻すことを意図しています。

1.13.2 地名階層へのユーザー・データの追加

Oracleによって提供されるデータに独自のデータを追加して拡張できます。たとえば、ユーザーが市内の公園(ニューヨーク市のセントラル・パークなど)のエントリを作成する場合、この表にそのエントリを作成できます。

たとえば、次のようにできます。

insert into ELOC_ADMIN_AREA_SEARCH values (1469286010, 'CENTRAL PARK,NEW YORK CITY,NEW YORK,NYC,RICHMOND,NEW YORK,NY,UNITED STATES,USA', 'CENTRAL PARK', 'CENTRAL PARK|NEW YORK|RICHMOND|NEW YORK|UNITED STATES', 'ENG', 7, 73.9654,40.7829, 0);
commit;

テキスト索引はコミットが発行された後でのみ同期を実行するため、新規データの挿入後のCOMMIT文は重要です。

この例では、area_idには、表にまだ存在しない値が選択され、ランダムなpartition_id値(ここでは、7)が使用されています。ただし、表に使用されるパーティション化方法に基づいて適切な値が選択される必要があります。(詳細は、READMEを参照)。

これで、セントラル・パークを検索すると、一致の結果が返されます。

select * from table(sdo_util.geo_search('central park,new york,NY,UNITED STATES'));
CENTRAL PARK
CENTRAL PARK|NEW YORK|RICHMOND|NEW YORK|UNITED STATES
ENG	73.9654    40.7829	  100

1.14 Oracle Spatial and GraphでのJSONおよびGeoJSONのサポート

Spatial and Graphでは、JSONおよびGeoJSONオブジェクトを使用したJSON (JavaScript Object Notation)形式の地理データの格納、索引付けおよび管理がサポートされます。

リリース18.1で導入されたJSONのサポートにより、以前のリリースで使用可能な制限付きのGeoJSONのサポートは大幅に拡張されており、2Dおよび3D、ソリッド、面、LRSジオメトリを含む広範囲のジオメトリがサポートされています。Spatial and GraphのGeoJSON固有のAPIは引き続きサポートされますが、より包括的なJSONサポートの使用をお薦めします。

1.14.1 Oracle Spatial and GraphでのJSONのサポート

Spatial and Graphでは、JSONオブジェクトを使用したJSON (JavaScript Object Notation)形式の地理データの格納、索引付けおよび管理がサポートされます。

Oracle Spatial and GraphのSDO_GEOMETRYオブジェクトをJSONジオメトリ・オブジェクトに変換したり、JSONジオメトリ・オブジェクトをSDO_GEOMETRYオブジェクトに変換して戻すことができます。

Spatial and GraphでのJSONのサポートには、次のようなものがあります。

  • SDO_UTIL.TO_JSON: SDO_GEOMETRYオブジェクトをCLOB形式のJSONオブジェクトに変換します。

  • SDO_UTIL.TO_JSON_VARCHAR: SDO_GEOMETRYオブジェクトをVARCHAR2形式のJSONオブジェクトに変換します。

  • SDO_UTIL.FROM_JSON: JSONオブジェクト(CLOBまたはVARCHAR2形式)をSDO_GEOMETRYオブジェクトに変換します。このファンクションは、GeoJSONオブジェクトをSDO_GEOMETRYオブジェクトに変換することもできます。

例1-3 Spatial and GraphでのJSONのサポート

この例では、Oracle Spatial and GraphでJSONサポートを使用した操作をいくつか示します。例では、JSON列とSDO_GEOMETRY列を持つ単純な表を作成し、サンプル・データを挿入して単純な問合せを実行します。空間索引を作成し、SDO_WITHIN_DISTANCE演算子を使用して問合せを実行します。

例では、次のJSON関連のOracle Databaseの機能を使用します(『Oracle Database JSON開発者ガイド』を参照)。

  • 列にJSONデータが含まれていることを確認する、CREATE TABLE文内のチェック制約のIS JSON Oracle SQL条件

例には、説明のコメントとSQL文の出力が含まれます。(出力は、簡単に読むことができるように、再フォーマットされています。)

-- Some operations using JSON support in Spatial and Graph.
-- Create a table with 3 columns: one JSONC (JSON CLOB), one JSONV (JSON VARCHAR2),
-- and one SDO_GEOMETRY.
CREATE TABLE JSON_TBL (
  jsonc CLOB, jsonv VARCHAR2(4000), 
  geom SDO_GEOMETRY,
  CONSTRAINT json_tbl_json CHECK (jsonc IS JSON) );
Table created.

-- Test the constraint
INSERT INTO json_tbl VALUES ('Not JSON', NULL, NULL);
ORA-02290: check constraint (SCOTT.JSON_TBL_JSON) violated
-- Insert some data (2 points).

INSERT INTO JSON_TBL(jsonc)
  VALUES ('{"srid": 8307, "point": {"directposition": [123.4, -10.1]}}');
1 row created.
  
INSERT INTO JSON_TBL(jsonc) 
  VALUES ('{"srid": 8307, "point": {"directposition": [123.5, -10.2]}}');
1 row created. 
 
COMMIT;  
Commit complete. 

-- Update the table with the VARCHAR formatted JSON object and 
-- an SDO_GEOMETRY created from a JSON object
UPDATE JSON_TBL SET
  jsonv=SDO_UTIL.TO_JSON_VARCHAR(SDO_UTIL.FROM_JSON(jsonc)),
  geom=SDO_UTIL.FROM_JSON(jsonc); 
2 rows updated.

COMMIT;

SELECT jsonc, jsonv, geom FROM json_tbl;

JSONC
-------
JSONV
-------
GEOM(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES)
-----------------------------------------------------------------------

{"srid": 8307, "point": {"directposition": [123.4, -10.1]}}
{"srid": 8307, "point": {"directposition": [123.4, -10.1]}}
SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(123.4, -10.1, NULL), NULL, NULL)
{"srid": 8307, "point": {"directposition": [123.5, -10.2]}}
{"srid": 8307, "point": {"directposition": [123.5, -10.2]}}
SDO_GEOMETRY(2001, 8307, SDO_POINT_TYPE(123.5, -10.2, NULL), NULL, NULL)

1.14.2 Oracle Spatial and GraphでのGeoJSONのサポート

Spatial and Graphでは、GeoJSONオブジェクトを使用したJSON (JavaScript Object Notation)形式の地理データの格納、索引付けおよび管理がサポートされます。

Oracle Spatial and GraphのSDO_GEOMETRYオブジェクトをGeoJSONオブジェクトに、また、GeoJSONオブジェクトをSDO_GEOMETRYオブジェクトに変換できます。空間演算子、ファンクションおよび特別なSDO_GEOMETRYメソッドを使用してGeoJSONデータを扱うことができます。

Spatial and GraphでのGeoJSONのサポートには、次のようなものがあります。

  • SDO_GEOMETRYオブジェクトをGeoJSONオブジェクトに変換するSDO_UTIL.TO_GEOJSONファンクション。

  • GeoJSONオブジェクトをSDO_GEOMETRYオブジェクトに変換するSDO_UTIL.FROM_GEOJSONファンクション。

  • SDO_GEOMETRY型のGet_GeoJsonメソッド(メンバー・ファンクション)(説明と例については、「SDO_GEOMETRYのメソッド」を参照)。

例1-4 Spatial and GraphでのGeoJSONのサポート

この例では、Oracle Spatial and GraphでGeoJSONサポートを使用した操作をいくつか示します。例では、GeoJSON列とSDO_GEOMETRY列を持つ単純な表を作成し、サンプル・データを挿入して単純な問合せを実行します。空間索引を作成し、SDO_WITHIN_DISTANCE演算子を使用して問合せを実行します。

例では、次のJSON関連のOracle Databaseの機能を使用します(『Oracle Database JSON開発者ガイド』を参照)。

  • GeoJSONオブジェクトを反映したSDO_GEOMETRYオブジェクトを戻す、RETURNING SDO_GEOMETRYを指定したJSON_VALUE Oracle SQLファンクション

  • 列にJSONデータが含まれていることを確認する、CREATE TABLE文内のチェック制約のIS JSON Oracle SQL条件

例には、説明のコメントとSQL文の出力が含まれます。(出力は、簡単に読むことができるように、再フォーマットされています。)

-- Some operations using GeoJSON support in Spatial and Graph.
-- Create a table with 2 columns: one GeoJSON, one SDO_GEOMETRY.
CREATE TABLE GEO_TABLE (geojson_col VARCHAR2(4000), geom_col SDO_GEOMETRY,
			    CONSTRAINT CHECK (geojson_col IS JSON));

Table created.

-- Insert some data (2 points).
INSERT INTO GEO_TABLE(geojson_col)
	  values ('{"a":{"type":"Point","coordinates":[+123.4,+10.1]}}');

1 row created.

INSERT INTO GEO_TABLE(geojson_col)
	  values ('{"a":{"type":"Point","coordinates":[+123.5,-10.1]}}');

1 row created.

commit;

Commit complete.

SQL> -- For each geojson_col value, return what its SDO_GEOMETRY equivalent would be.
SQL> SELECT JSON_VALUE(geojson_col, '$.a' RETURNING SDO_GEOMETRY) from GEO_TABLE;

JSON_VALUE(GEOJSON_COL,'$.A'RETURNINGSDO_GEOMETRY)(SDO_GTYPE, SDO_SRID, SDO_POIN
--------------------------------------------------------------------------------
SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(123.4, 10.1, NULL), NULL, NULL)         
SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(123.5, -10.1, NULL), NULL, NULL)        

-- For a specified GeoJSON object definition, return what its SDO_GEOMETRY
-- equivalent would be.
SELECT JSON_VALUE('{"type":"Point","coordinates":[+123.5,-10.1]}',
		       '$' RETURNING SDO_GEOMETRY) from DUAL;

JSON_VALUE('{"TYPE":"POINT","COORDINATES":[+123.5,-10.1]}','$'RETURNINGSDO_GEOME
--------------------------------------------------------------------------------
SDO_GEOMETRY(2001, 4326, SDO_POINT_TYPE(123.5, -10.1, NULL), NULL, NULL)        

-- Update to populate geom_col with SDO_GEOMETRY objects reflecting the JSON data
-- in the geojson_col column.
UPDATE GEO_TABLE
	set geom_col = JSON_VALUE(geojson_col, '$.a' RETURNING SDO_GEOMETRY);

2 rows updated.

commit;

Commit complete.

-- Create spatial index on the returned SDO_GEOMETRY objects from the JSON data.
CREATE INDEX GEO_TABLE_IX
	     ON GEO_TABLE
		  (
		  JSON_VALUE(geojson_col, '$.a' RETURNING SDO_GEOMETRY)
		  )
       INDEXTYPE IS MDSYS.SPATIAL_INDEX_V2;

Index created.

-- SDO_WITHIN_DISTANCE query: Are two grometries within 100 miles apart?
SELECT 1
  FROM GEO_TABLE
 WHERE SDO_WITHIN_DISTANCE(
	      JSON_VALUE(geojson_col, '$.a' RETURNING SDO_GEOMETRY),
	      JSON_VALUE('{"type":"Point","coordinates":[+123.5,-10.1]}',
			 '$' RETURNING SDO_GEOMETRY),
       'distance=100 unit=mile') = 'TRUE';

         1                                                                      
----------                                                                      
         1 

1.15 Oracle Spatial and GraphでのNURBS曲線のサポート

Spatial and Graphでは、Non-Uniform Rational B-Spline (NURBS)曲線ジオメトリをサポートしています。

NURBS曲線を使用すると、任意の形状で自由形式の形状の表現が可能になります。NURBS表現では、制御点とノットにより曲線の形状が決定され、わずかなデータで複雑な形状の表現が可能になるため、曲線の形状を制御することができます。

Oracle Spatial and GraphでのNURBS曲線のサポートには、次のものが含まれます。

  • Oracle Spatial and GraphでNURBS曲線ジオメトリをロードおよび格納するためのWKT、WKBおよびGMLファンクション。

  • NURBS曲線ジオメトリの検証。

  • NURBS曲線ジオメトリの空間索引付けと、SDO_FILTER、SDO_RELATEおよび他の演算子。空間演算子では、計算に曲線の近似値が使用されます。

NURBS表現には、制御点と基底関数の指定が必要です。また、基底関数は、ノット・ベクトルおよび曲線の曲度を使用して定義されます。制御点は、NURBS曲線の形状を決定するために使用されます。ノット・ベクトルは、曲線の形状を直接制御しませんが、終点の正確な配置を制御するために使用されます。また、ノット・ベクトルは、ねじれや角で曲線を作成するためにも使用されます。非一様なノット・ベクトルは曲線の操作のために使用されます。

NURBS曲線を表現するには、データ(制御点、ノット・ベクトルおよび曲線の曲度)を格納する必要があります。制御点のセットは、(x, y, z, w) (wは制御点の重みを表す)とするユークリッド形式、または(wx, wy, wz, w)とする同次形式のいずれかで表すことができます。すべてのiに対してwi=1の場合、この曲線は非有理になります。制御点は重み付けユークリッド形式で指定されます。基底関数は、ノット・ベクトルに基づいて一様または非一様になります。非一様なノット・ベクトルは、終点の配置およびねじれや角の作成に有効です。正規化されたノット・ベクトルを指定する必要があります(つまり、ノット・ベクトルの最初のノットを0 (ゼロ)に、ノット・ベクトルの最後のノットを1にする必要があります)。また、ノット・ベクトルは終点で「固定」させる必要があります。この要件は、ノット・ベクトルの最初のd+1の値をすべて0 (ゼロ)に、最後のd+1の値をすべて1にすることで適用されます(dはNURBS曲線の曲度を表します)。

Oracle Spatial and GraphでのNURBS曲線の実装は、SQL/MM規格に準拠しています。NURBS曲線用のSQL/MM規格は、スプライン、多項式スプライン、3次スプライン、Bスプラインおよびベジェ曲線を表現するために使用されます。Oracle Spatial and Graphでは、SDO_GEOMETRYオブジェクト型はNURBS表現のために使用されます。NURBS曲線は、線タイプ、複数線タイプおよびコレクション・タイプのジオメトリ・オブジェクトに含めることができます。これらのジオメトリでは、単純な線ストリングおよび複合線ストリングのタイプの要素のみにNURBSを含めることができます。

少なくとも1つのNURBSセグメントを含む複合線ストリングの場合、前のセグメントの最後の点はNURBSの"固定された"最初の制御点と同じで、NURBSセグメントの最後の"固定された"制御点は次のセグメントの最初の点と同じです。つまり、頂点が繰り返されます。

要素タイプ値が2で線ストリングを表すジオメトリ要素の場合、解釈値3はNURBS曲線を表すために使用され、解釈値1と2は線形セグメントと円弧を表します。NURBS曲線のSDO_ELEM_INFO_ARRAYは、(offset, 2, 3)として格納されます(これらはそれぞれオフセット、要素タイプ、解釈値を表します)。

SDO_ORDINATE_ARRAYには、曲線の曲度dm制御点のセットおよびサイズnのノット・ベクトルが格納されます。したがって、縦座標配列は一連の値(d, m, x1, y1, z1, w1…. xm, ym, zm, wm, n, k1….kn)として格納されます。制御点は、SQL/MM規格で指定されているユークリッド形式で格納されます。NURBS曲線では、ノットの数は曲度、制御点の数および1の合計と等しいことに注意してください。したがって、等式n=d+m+1は、NURBS曲線ジオメトリの検証に役立ちます。

NURBS曲線の定義には、次の考慮事項が適用されます。

  • 曲度が1の曲線は折れ線を表すため、曲度は1より大きい値にする必要があります。

  • 制御点の数は、3以上かつ曲度より大きい値にする必要があります。

  • ノットの数は、(制御点の数+曲度+ 1)と等しい値にする必要があります。

  • 各制御点の重み要素は正の数値にする必要があります。

  • 制御点は、重み付けユークリッド形式[wx, wy, (wz), w]で表されます。

  • ノット値は昇順で指定する必要があり、ノット・ベクトルは正規化されたノット・ベクトル[0, .. ……, 1]である必要があります。

  • dが曲線の曲度である場合、曲線の最初(値0 (ゼロ))にd+1の連続する均等なノット、曲線の最後(値1)にd+1の連続する均等なノットが必要です。これにより、曲線を終点で固定させることができます。

  • dが曲線の曲度である場合、d+1のノットが存在する必要がある曲線の最初または最後以外に、dより大きい連続する均等なノットを指定することはできません。

空間索引を作成または空間操作を実行する前に、NURBSセグメントのあるジオメトリを検証してください。(この推奨は、すべてのジオメトリ・タイプ、NURBSまたはその他に適用されます。)

NURBS曲線ジオメトリを指定する例は、「NURBS曲線」を参照してください。

入力NURBS曲線ジオメトリの近似処理である線ストリング・ジオメトリを取得するには、SDO_UTIL.GETNURBSAPPROX機能を使用します。

1.16 Oracle Spatial and Graphによるシャード・データベースのサポート

Spatial and Graphでは、シャード・データベース・テクノロジの使用をサポートしています。

ただし、MERGE PARTITIONやSPLIT PARTITIONなどのパーティション化管理操作(PMO)は、Spatial and Graphではサポートされません。

Oracleシャーディングの概要は、『Oracle Database管理者ガイド』を参照してください。

1.17 Spatial and Graph Java Application Programming Interface

Oracle Spatial and Graphでは、Java Application Programming Interface (API)を提供しています。

このAPIには次のパッケージが含まれています。

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

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

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

Spatial and Graphでは、インストール中にジョブの実行に必要な最小限の権限を持つユーザー・アカウントが作成されます。

これらのアカウントはロックされた期限切れの状態で作成されます。アカウントを使用する必要がある場合は、ロックを解除する必要があります。表1-4に、Spatial and Graphによって作成される事前定義のユーザー・アカウントを示します。

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

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

MDSYS

サポートされているジオメトリ・データ・タイプの格納方法、構文および意味を規定するためにOracle Spatial and Graphによって使用されるスキーマ。

MDDATA

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

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

Oracle Spatial and Graphアプリケーションのパフォーマンスは、問合せ実行計画に影響するオプティマイザ・ヒントの使用など、多くの要因に影響されます。

このマニュアルでは、特定の項目に関連するパフォーマンスおよびチューニングの情報を示します。たとえば、「Rツリーの品質」では、Rツリーの品質および問合せのパフォーマンスへの影響について説明します。「空間演算子、空間プロシージャおよび空間ファンクション」では、空間演算子を使用すると、プロシージャやファンクションを使用する場合よりパフォーマンスが向上する理由について説明します。

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

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

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

1.20 OGCおよびISOへの準拠

Oracle Databaseリリース10g リリース1 (バージョン10.1.0.4)以降のOracle Spatial and Graphは、Open Geospatial Consortium (OGC)Simple Features Specification 1.1.1 (Document 99-049)に準拠しています。

Geometry Types Implementationに準拠しているということは、その仕様書の3.2項に詳細が述べられているすべての型、ファンクションおよび言語要素がOracle Spatial and Graphでサポートされていることを意味します。

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

Oracle Spatial and Graphは、次の国際標準化機構(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.21 Spatial and Graphのリリース(バージョン)番号

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

たとえば:

SELECT SDO_VERSION FROM DUAL;

SDO_VERSION
--------------------------------------------------------------------------------
12.2.0.1.0

1.22 SPATIAL_VECTOR_ACCELERATIONシステム・パラメータ

空間演算子のパフォーマンスを向上させるために、SPATIAL_VECTOR_ACCELERATIONデータベース・システム・パラメータの値をTRUEに設定し、ベクトル・パフォーマンス・アクセラレータ(VPA)機能を有効化することをお薦めします。(この機能と関連するシステム・パラメータは、ライセンスを付与されたOracle Spatial and Graphユーザーによる使用のみが許可されており、そのパラメータのデフォルト値はFALSEです。)

SPATIAL_VECTOR_ACCELERATIONパラメータをTRUEに設定するメリットは、次のとおりです。

  • 空間演算子および関数のための空間アルゴリズムが向上する

  • メタデータのキャッシュによってあらゆる空間演算子および関数の全体的な性能が向上する

  • すべてのDML演算子用のメタデータのキャッシュによって、空間表における挿入、更新および削除操作の速度が向上する

このパラメータは、システム全体または単一のセッションに対して設定できます。システム全体に対して値を設定するには、次のいずれかを実行します。

  • 適切な権限を持つアカウントから次の文を入力します。

    ALTER SYSTEM SET SPATIAL_VECTOR_ACCELERATION = TRUE;
    
  • データベース初期化ファイル(xxxinit.ora)に次の文を追加します。

    SPATIAL_VECTOR_ACCELERATION = TRUE;
    

現行のセッションに対して値を設定するには、適切な権限を持つアカウントから次の文を入力します。

ALTER SESSION SET SPATIAL_VECTOR_ACCELERATION = TRUE;

関連項目:

1.23 表の空間的な有効化

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

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

  1. (SDO_GEOMETRY)列を追加するために表を変更します。
  2. 位置に関連するデータの値を使用してSDO_GEOMETRYオブジェクトを移入するために、表を更新します。
  3. 空間メタデータ(USER_SDO_GEOM_METADATA)を更新します。
  4. 表に空間索引を作成します。

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

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

例1-5に関するノートは、次のとおりです。

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

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

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

データベース管理者(DBA)は、MDSYS.MOVE_SDOプロシージャを使用して、すべてのOracle Spatial and Graphメタデータ表を、指定したターゲット表領域に移動できます。

デフォルトでは、空間メタデータ表は、リリース11.1以降のリリースではSYSAUX表領域に、また11.1より前のリリースではSYSTEM表領域に作成されます。

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

MDSYS.MOVE_SDO(
   target_tablespace_name IN VARCHAR2);

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

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

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

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

EXECUTE MDSYS.MOVE_SDO('SYSAUX');

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

このトピックでは、Oracle Spatial and Graphを使用するアプリケーションに必要なディスク領域の容量およびCPUの能力に影響する一般的なガイドラインについて説明します。

このガイドラインは、一般的なアプリケーションのサイズ指定に使用するその他のガイドラインに代わるものではなく、それらのガイドラインを補足することを目的としています。

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

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

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

1.26 Spatial and Graphのエラー・メッセージ

Spatial and Graphには、一連のエラー・メッセージがあります。

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

Oracleエラー・メッセージのマニュアルは、HTML形式でのみ提供されています。エラー・メッセージを範囲ごとに参照できます(特定の範囲のページを表示したら、ブラウザの「このページの検索」機能を使用して特定のメッセージを検索できます)。また、Oracleオンライン・ドキュメントのエラー・メッセージ検索機能を使用して特定のエラー・メッセージを検索することもできます。

1.27 Spatialの例

Oracle Spatial and Graphでは、特定の処理をコーディングするための理解を深めたり、モデルを作成するための例を提供しています。

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

1.28 Spatial and Graphおよび関連する機能のREADMEファイル

README.txtファイルには、いくつかのマニュアルを補足する情報が含まれています。

これらのマニュアルは、『Oracle Spatial and Graph開発者ガイド』(このマニュアル)、『Oracle Spatial and Graph GeoRaster開発者ガイド』および『Oracle Spatial and Graphトポロジ・データ・モデルおよびネットワーク・データ・モデル・グラフ開発者ガイド』です。このファイルは次の場所にあります。

$ORACLE_HOME/md/doc/README.txt