2 空間データ型およびメタデータ

Oracle Spatial and Graphの空間フィーチャは、一連のオブジェクト・データ型、タイプ・メソッド、およびこれらのタイプを使用する演算子、ファンクションおよびプロシージャで構成されます。ジオメトリは、オブジェクトとしてSDO_GEOMETRY型の列の1行に格納されています。空間索引は、基本的なデータ定義言語(DDL)文(CREATE、ALTER、DROP)およびデータ操作言語(DML)文(INSERT、UPDATE、DELETE)を使用して作成およびメンテナンスされます。

この章では、最初に、空間データを挿入、索引付けおよび問合せする例を示します。この章の後半に記載するデータ型およびメタデータの詳細情報を読む前に、この例を参照しておくことをお薦めします。

トピック:

2.1 空間データの挿入、索引付けおよび問合せの例

このトピックでは、空間表の作成、データの挿入、空間索引の作成および空間問合せの実行についての例を示します

例では、「Spatialの概念」およびこの章の他の項で説明する内容の概念を示しています。

その内容は、ソフト・ドリンクのメーカーが持っている、数種類の製品(コーラ)に対する市場の関心度についての地域別検証データです。コーラは、その会社、競合他社および数社の共同で生産されています。それぞれの対象領域は、ユーザーが定義した次の基準を表現しています。たとえば、そのコーラが主にマーケットシェアを持つ領域、他社製品よりもシェアが少ない領域、または今後成長が期待できる領域です。それぞれの領域には、都市内の地区、都道府県内の地域、国などがあるとします。

次の図は、4種類のコーラの対象領域を示しています。

図2-1 対象領域の例

図2-1の説明が続きます
図2-1「対象領域の例」の説明

このトピックの例では、次の操作を実行します。

  • 空間データを格納するための表(COLA_MARKETS)を作成する

  • 4つの対象領域(cola_acola_bcola_ccola_d)に行を挿入する

  • USER_SDO_GEOM_METADATAビューを更新し、その領域の次元情報を反映する

  • 空間索引(COLA_SPATIAL_IDX)を作成する

  • 空間問合せを実行する

次の例内の概念および手法の詳細は、この章の他の項を参照してください。

例2-1 空間データの挿入、索引付けおよび問合せの例

-- Create a table for cola (soft drink) markets in a
-- given geography (such as city or state).
-- Each row will be an area of interest for a specific
-- cola (for example, where the cola is most preferred
-- by residents, where the manufacturer believes the
-- cola has growth potential, and so on).
-- (For restrictions on spatial table and column names, see 
-- TABLE_NAME and COLUMN_NAME.)

CREATE TABLE cola_markets (
  mkt_id NUMBER PRIMARY KEY,
  name VARCHAR2(32),
  shape SDO_GEOMETRY);

-- The next INSERT statement creates an area of interest for 
-- Cola A. This area happens to be a rectangle.
-- The area could represent any user-defined criterion: for
-- example, where Cola A is the preferred drink, where
-- Cola A is under competitive pressure, where Cola A
-- has strong growth potential, and so on.
 
INSERT INTO cola_markets VALUES(
  1,
  'cola_a',
  SDO_GEOMETRY(
    2003,  -- two-dimensional polygon
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,1003,3), -- one rectangle (1003 = exterior)
    SDO_ORDINATE_ARRAY(1,1, 5,7) -- only 2 points needed to
          -- define rectangle (lower left and upper right) with
          -- Cartesian-coordinate data
  )
);

-- The next two INSERT statements create areas of interest for 
-- Cola B and Cola C. These areas are simple polygons (but not
-- rectangles).

INSERT INTO cola_markets VALUES(
  2,
  'cola_b',
  SDO_GEOMETRY(
    2003,  -- two-dimensional polygon
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,1003,1), -- one polygon (exterior polygon ring)
    SDO_ORDINATE_ARRAY(5,1, 8,1, 8,6, 5,7, 5,1)
  )
);

INSERT INTO cola_markets VALUES(
  3,
  'cola_c',
  SDO_GEOMETRY(
    2003,  -- two-dimensional polygon
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,1003,1), -- one polygon (exterior polygon ring)
    SDO_ORDINATE_ARRAY(3,3, 6,3, 6,5, 4,5, 3,3)
  )
);

-- Now insert an area of interest for Cola D. This is a
-- circle with a radius of 2. It is completely outside the
-- first three areas of interest.

INSERT INTO cola_markets VALUES(
  4,
  'cola_d',
  SDO_GEOMETRY(
    2003,  -- two-dimensional polygon
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,1003,4), -- one circle
    SDO_ORDINATE_ARRAY(8,7, 10,9, 8,11)
  )
);

---------------------------------------------------------------------------
-- UPDATE METADATA VIEW --
---------------------------------------------------------------------------
-- Update the USER_SDO_GEOM_METADATA view. This is required
-- before the spatial index can be created. Do this only once for each
-- layer (that is, table-column combination; here: COLA_MARKETS and SHAPE).

INSERT INTO user_sdo_geom_metadata
    (TABLE_NAME,
     COLUMN_NAME,
     DIMINFO,
     SRID)
  VALUES (
  'cola_markets',
  'shape',
  SDO_DIM_ARRAY(   -- 20X20 grid
    SDO_DIM_ELEMENT('X', 0, 20, 0.005),
    SDO_DIM_ELEMENT('Y', 0, 20, 0.005)
     ),
  NULL   -- SRID
);

-------------------------------------------------------------------
-- CREATE THE SPATIAL INDEX --
-------------------------------------------------------------------
CREATE INDEX cola_spatial_idx
   ON cola_markets(shape)
   INDEXTYPE IS MDSYS.SPATIAL_INDEX_V2;
-- Preceding statement created an R-tree index.

-------------------------------------------------------------------
-- PERFORM SOME SPATIAL QUERIES --
-------------------------------------------------------------------
-- Return the topological intersection of two geometries.
SELECT SDO_GEOM.SDO_INTERSECTION(c_a.shape, c_c.shape, 0.005)
   FROM cola_markets c_a, cola_markets c_c 
   WHERE c_a.name = 'cola_a' AND c_c.name = 'cola_c';

-- Do two geometries have any spatial relationship?
SELECT SDO_GEOM.RELATE(c_b.shape, 'anyinteract', c_d.shape, 0.005)
  FROM cola_markets c_b, cola_markets c_d
  WHERE c_b.name = 'cola_b' AND c_d.name = 'cola_d';

-- Return the areas of all cola markets.
SELECT name, SDO_GEOM.SDO_AREA(shape, 0.005) FROM cola_markets;

-- Return the area of just cola_a.
SELECT c.name, SDO_GEOM.SDO_AREA(c.shape, 0.005) FROM cola_markets c 
   WHERE c.name = 'cola_a';

-- Return the distance between two geometries.
SELECT SDO_GEOM.SDO_DISTANCE(c_b.shape, c_d.shape, 0.005)
   FROM cola_markets c_b, cola_markets c_d
   WHERE c_b.name = 'cola_b' AND c_d.name = 'cola_d';

-- Is a geometry valid?
SELECT c.name, SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT(c.shape, 0.005)
   FROM cola_markets c WHERE c.name = 'cola_c';

-- Is a layer valid? (First, create the results table.)
CREATE TABLE val_results (sdo_rowid ROWID, result VARCHAR2(2000));
CALL SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT('COLA_MARKETS', 'SHAPE', 
  'VAL_RESULTS', 2);
SELECT * from val_results;

2.2 SDO_GEOMETRYオブジェクト型

Spatial and Graphでは、空間オブジェクトのジオメトリの記述は、ユーザーが定義した表のSDO_GEOMETRYオブジェクト型の1列に、1行で格納されます。

表にSDO_GEOMETRY型の列がある場合、その表に対して一意の主キーを定義する別の列または列のセットが必要です。このような表を、空間表または空間ジオメトリ表ともいいます。

Oracle Spatial and Graphでは、SDO_GEOMETRYオブジェクト型を次のとおり定義します。

CREATE TYPE sdo_geometry AS OBJECT (
 SDO_GTYPE NUMBER, 
 SDO_SRID NUMBER,
 SDO_POINT SDO_POINT_TYPE,
 SDO_ELEM_INFO SDO_ELEM_INFO_ARRAY,
 SDO_ORDINATES SDO_ORDINATE_ARRAY);

Oracle Spatial and Graphでは、SDO_GEOMETRY型定義で使用されるSDO_POINT_TYPE型、SDO_ELEM_INFO_ARRAY型およびSDO_ORDINATE_ARRAY型も次のとおり定義します。

CREATE TYPE sdo_point_type AS OBJECT (
   X NUMBER,
   Y NUMBER,
   Z NUMBER);
CREATE TYPE sdo_elem_info_array AS VARRAY (1048576) of NUMBER;
CREATE TYPE sdo_ordinate_array AS VARRAY (1048576) of NUMBER;

SDO_ORDINATE_ARRAYの最大サイズは1,048,576であるため、SDO_GEOMETRYオブジェクト内の頂点の最大数は、頂点ごとの次元数によって決まります。その数は、2次元の場合は524,288、3次元の場合は349,525、4次元の場合は262,144になります。

次の各項ではそれぞれのSDO_GEOMETRY属性の意味について説明し、続いて使用する場合の考慮点を説明します(「使用上の注意」)。

SDO_GEOMETRYオブジェクト型には、その属性にアクセスする場合に有効なメソッドがあります。これらのメソッドについては、「SDO_GEOMETRYのメソッド」を参照してください。

次のSpatial and Graphのデータ型については、それぞれの項またはマニュアルを参照してください。

トピック:

2.2.1 SDO_GTYPE

SDO_GTYPE属性は、ジオメトリのタイプを示します。有効なジオメトリ・タイプはGeometry Object Model for the OGIS Simple Features for SQL仕様(曲面は例外として)で指定されたジオメトリに対応しています。数値はOGIS仕様の指定とは異なりますが、対応する名前および意味は同じです。

SDO_GTYPE値は、4桁の書式DLTTで表されます。各桁が示す内容は次のとおりです。

  • D は、次元数(2、3または4)を識別します。

  • Lは、(3または4の次元がメジャー値を含む)3次元線形参照システム(LRS)・ジオメトリの線形参照メジャー次元を識別します。非LRSジオメトリの場合、0を指定します。線形参照システム(LRS)については、「線形参照システム」を参照してください。

  • TT は、ジオメトリ・タイプ(有効値は00から09で、10から99は将来使用するために予約されています)を識別します。

表2-1に、有効なSDO_GTYPE値を示します。「ジオメトリ・タイプ」および「説明」の列に示す値は、OGIS仕様を反映しています。

表2-1 有効なSDO_GTYPE値

ジオメトリ・タイプ 説明

DL00

UNKNOWN_GEOMETRY

このジオメトリは、Spatial and Graphでは無視されます。

DL01

POINT

1つの点を含むジオメトリです。

DL02

LINEまたはCURVE

直線セグメントまたは円弧セグメント(あるいはその両方)を含むことができる1つの線ストリングを含むジオメトリです。(LINEおよびCURVEは、このコンテキストでは同義です。)

DL03

POLYGONまたはSURFACE

穴のある(または穴のない)1つのポリゴンを含むジオメトリ注1または1つ以上のポリゴンで構成される1つの表面です。3次元ポリゴンでは、すべての点が同じ平面上にあることが必要です。

DL04

COLLECTION

ジオメトリは、異種の要素の集合です。COLLECTIONは、他のすべてのタイプを含むスーパーセットです。

DL05

MULTIPOINT

ジオメトリに1つ以上の点が存在しています。(MULTIPOINTは、POINTのスーパーセットです。)

DL06

MULTILINEまたはMULTICURVE

ジオメトリに1つ以上の線ストリングが存在しています。(MULTILINEおよびMULTICURVEは、このコンテキストでは同義であり、それぞれLINEおよびCURVEのスーパーセットです。)

DL07

MULTIPOLYGONまたはMULTISURFACE

ジオメトリに複数の非接続ポリゴン(複数の外側の境界)または複数の面が存在している場合があります(MULTIPOLYGONはPOLYGONのスーパーセットで、MULTISURFACEはSURFACEのスーパーセットです)。

DL08

SOLID

複数の面で構成されたジオメトリです。3次元空間で完全に囲まれています。立方形や錐台があります。

DL09

MULTISOLID

ジオメトリには、複数の非接続のソリッド(複数の外側の境界)が存在している場合があります。(MULTISOLIDは、SOLIDのスーパーセットです。)

脚注1

穴のあるポリゴンでは、外側の境界を先に入力し、次に内側の境界を入力します。

表2-1の「値」列に示すDは、次元数(2、3または4)です。たとえば、SDO_GTYPE値2003は、2次元ポリゴンを示します。次元数は、それぞれの頂点(たとえば、2次元オブジェクトのX、Y)を表現する座標の数に影響します。

指定されたレイヤー(列)にあるすべてのジオメトリは、同じ次元数である必要があります。たとえば、2次元と3次元のデータを同じレイヤーに混在させることはできません。

Get_Dims、Get_LRS_DimおよびGet_Gtypeメソッドを使用すると、ジオメトリ・オブジェクトのSDO_GTYPEのDLTTの各桁を戻すことができます。これらのメソッドについては、「SDO_GEOMETRYのメソッド」を参照してください。

3次元ジオメトリのSDO_GTYPE値の詳細は、「3次元の空間オブジェクト」表1-1を参照してください。

2.2.2 SDO_SRID

SDO_SRID属性を使用して、ジオメトリに関連付ける座標系(空間参照システム)を識別できます。SDO_SRIDがnullの場合、ジオメトリには座標系は関連付けられていません。SDO_SRIDがNULL以外である場合、SDO_COORD_REF_SYS表のSRID列の値が含まれている必要があります(「SDO_COORD_REF_SYS表」を参照)。また、この値をUSER_SDO_GEOM_METADATAビューのSRID列に挿入する必要があります(「ジオメトリのメタデータ・ビュー」を参照)。

ジオメトリ列にあるすべてのジオメトリは、その列に空間索引が作成される場合は、同じSDO_SRID値である必要があります。

座標系については、「座標系(空間参照システム)」を参照してください。

2.2.3 SDO_POINT

SDO_POINT属性は、属性X、Y、ZおよびすべてのNUMBER型を持つSDO_POINT_TYPEオブジェクト・タイプを使用して定義されます。(SDO_POINT_TYPEの定義については、「SDO_GEOMETRYオブジェクト型」を参照してください。)SDO_ELEM_INFO配列およびSDO_ORDINATES配列が両方ともNULLで、SDO_POINT属性がNULL以外である場合、X、YおよびZの値は点ジオメトリの座標であるとみなされます。そうでない場合、SDO_POINT属性はSpatial and Graphによって無視されます。点ジオメトリを適切な記憶域のSDO_POINT属性に格納する必要があります。レイヤーに点ジオメトリのみが存在する場合は、点ジオメトリをSDO_POINT属性に格納してください。

点ジオメトリおよびその挿入と問合せの例については、「点」を参照してください。

注意:

線形参照システム(LRS)の点または方向付きの点の定義に、SDO_POINT属性を使用しないでください。LRSについては、「線形参照システム」を参照してください。方向付きの点については、「方向付きの点」を参照してください。

2.2.4 SDO_ELEM_INFO

SDO_ELEM_INFO属性は、数の可変長配列を使用して定義されます。この属性によって、SDO_ORDINATES属性(「SDO_ORDINATES」を参照)に格納されている縦座標の解釈方法がわかります。

それぞれ3つの数値セットは、次のとおり解釈されます。

  • SDO_STARTING_OFFSET -- この要素の最初の縦座標が保存されているSDO_ORDINATES配列内のオフセットを示します。オフセット値は0ではなく1から始まります。そのため、最初の要素の最初の縦座標はSDO_GEOMETRY.SDO_ORDINATES(1)になります。2つ目の要素がある場合、その要素の1つ目の縦座標はSDO_GEOMETRY.SDO_ORDINATES(n)の位置になります。ここで、nはSDO_ORDINATE_ARRAY定義内の位置を示します(たとえば、「穴のあるポリゴン」図2-4に示すように、19は19番目の位置です)。

  • SDO_ETYPE: 要素のタイプを示します。表2-2に、有効な値を示します。

    SDO_ETYPE値の1、2、1003および2003は、単純な要素とみなされます。それらは、SDO_ELEM_INFO配列の3つのエントリ1組によって定義されます。SDO_ETYPE値が1003および2003の場合、1桁目はexterior (1)またはinterior (2)を示します。

    1003: ポリゴンの外部の輪(反時計回りで指定される必要がある)

    2003: ポリゴンの内部の輪(時計回りで指定される必要がある)

    注意:

    単一ジオメトリのポリゴンの輪の要素には、SDO_ETYPE値として3を使用しないでください。単純なポリゴンが外部であるか内部であるかを判断できない場合にのみ、3を指定してください。その後、「SDO_MIGRATEパッケージ(アップグレード)」で説明するSDO_MIGRATE.TO_CURRENTプロシージャを使用して、表またはレイヤーを現行の形式にアップグレードしてください。

    1桁と4桁のSDO_ETYPE値を単一のジオメトリに混在させることはできません。

    SDO_ETYPE値の4、1005、2005、1006および2006は、複合要素とみなされます。これらは、複合要素に属する一連の3つの値を持つ、1つ以上のヘッダーを含みます。4桁のSDO_ETYPE値の場合、1桁目はexterior (1)またはinterior (2)を示します。

    1005: ポリゴンの外部の輪(反時計回りで指定される必要がある)

    2005: ポリゴンの内部の輪(時計回りで指定される必要がある)

    1006: 1つ以上のポリゴンの輪で構成される外側の表面

    2006: ソリッド要素の内側の表面

    1007: ソリッド要素

    複合要素の要素は、連続しています。複合要素にあるサブ要素の最後の点は、次のサブ要素の最初の点です。点は繰り返されません。

  • SDO_INTERPRETATION: SDO_ETYPEが複合要素であるかどうかによって、次のいずれかを意味します。

    SDO_ETYPEが複合要素の場合(4、1005または2005)、このフィールドは、要素の一部となる後続の3つの数値セットの組数を指定します。

    SDO_ETYPEが複合要素ではない場合(1、2、1003または2003)、SDO_INTERPRETATIONによってこの要素に対する座標の順序の解釈方法が決定されます。たとえば、線ストリングまたはポリゴン境界は、連結された一連の直線セグメントまたは円弧で構成されます。

    有効なSDO_ETYPEおよびSDO_INTERPRETATIONの値の組合せについては、表2-2を参照してください。

ジオメトリが複数の要素で構成される場合、ある要素の最後の縦座標は、常に次の要素の先頭のオフセットより1小さくなります。ジオメトリの最後の要素は、その要素の開始オフセットからSDO_ORDINATES可変長配列の最後までの座標によって記述されます。

複合要素(SDO_ETYPE値が4、1005または2005)では、3つの数値のn組(サブ要素当たり1組)が要素の記述に使用されます。複合要素のサブ要素は、連続しています。サブ要素の最後の点は、次のサブ要素の最初の点です。1からn-1のサブ要素では、あるサブ要素の最後の点は、次のサブ要素の開始点と同じです。サブ要素2...n-2の開始点は、サブ要素1...n-1の終了点と同じです。サブ要素nの最後の縦座標は、ジオメトリの次の要素の開始オフセット-1か、またはSDO_ORDINATES変長配列の最後の縦座標のいずれかです。

可変長配列の現行のサイズは、PL/SQLのvarray_variable.CountファンクションまたはOracle Call Interface(OCI)のOCICollSize関数を使用することによって求められます。

各SDO_ETYPE要素の意味、およびこれらのSDO_ETYPE要素のそれぞれに対するSDO_ELEM_INFOとSDO_ORDINATES可変長配列間の関係を表2-2に示します。

表2-2 SDO_ELEM_INFOにおける値および意味

SDO_ETYPE SDO_INTERPRETATION 意味

0

(任意の数値)

タイプ0 (ゼロ)要素です。Oracle Spatial and Graphによってサポートされないジオメトリ・タイプのモデル化に使用します。詳細は、「タイプ0(ゼロ)要素」を参照してください。

1

1

点のタイプです。

1

0

方向付きの点の方向です。詳細は、「方向付きの点」を参照してください。

1

n > 1

n点の点の集合です。

2

1

頂点が直線セグメントに連結している線ストリングです。

2

2

連結された一連の円弧で構成される線ストリングです。

それぞれの円弧は、円弧の開始点、円弧上の任意の点および円弧の終了点という3つの座標を使用して記述されます。1つの円弧の終了点および次の円弧の開始点に対する座標は、繰り返されません。たとえば、2つの連結した円弧で構成される線ストリングの記述には、5つの座標が使用されます。点1、2および3は、最初の円弧を定義し、点3、4および5は、2つ目の円弧を定義します。ただし、点3は1回だけ格納されます。

2

3

NURBS (Non-Uniform Rational B-Spline)曲線。詳細は、「Oracle Spatial and GraphでのNURBS曲線のサポート」を参照してください。

1003または2003

1

頂点が直線セグメントに連結している単純なポリゴンです。各頂点について点を指定し、ポリゴンを閉じるために、終了点と開始点が一致するように指定する必要があります(許容差内で)。たとえば、4面のポリゴンの場合は、5番目の点が1番目の点と同じになるような5つの点を指定します。

1003または2003

2

それ自身で閉じている連結された一連の円弧で構成されるポリゴンです。最後の円弧の終了点は、最初の円弧の開始点と同じです。

それぞれの円弧は、円弧の開始点、円弧上の任意の点および円弧の終了点という3つの座標を使用して記述されます。1つの円弧の終了点および次の円弧の開始点に対する座標は、繰り返されません。たとえば、2つの連結した円弧で構成されるポリゴンの記述には、5つの座標が使用されます。点1、2および3は、最初の円弧を定義し、点3、4および5は、2つ目の円弧を定義します。点1および5の座標は同じである必要があり(許容差は考慮されません)、点3は繰り返されません。

1003または2003

3

矩形のタイプ(「最適化された矩形」ともいう)です。左下および右上の2点のみの境界矩形で、記述する必要があります。矩形タイプは、測地データまたは非測地データで使用できます。ただし、測地データでは、問合せウィンドウを作成するためにのみ矩形タイプを使用します(データベースにオブジェクトを格納するためには使用しないでください)。

測地データでのこのタイプの使用方法および例については、「測地MBR」を参照してください。3次元の最適化された矩形の作成については、「3次元の最適化された矩形」を参照してください。

1003または2003

4

円のタイプです。すべて円周上にある、非直線上の異なる3つの点によって記述されます。

4

n > 1

直線セグメントおよび円弧によって連結されたいくつかの頂点による複合線ストリングです。INTERPRETATION列にある値nは、線ストリングを構成する、連続するサブ要素の数を指定します。

SDO_ELEM_INFO配列にある次のn組は、これらサブ要素のそれぞれを記述します。SDO_ETYPE 2のもののみサブ要素になります。サブ要素の最後の点は、次のサブ要素の最初の点であり、繰り返すことはできません。

複合線ストリング・ジオメトリの例は、「複合線ストリング」および図2-5を参照してください。

1005または2005

n > 1

直線セグメントおよび円弧によって連結された頂点がある複合ポリゴンです。INTERPRETATION列にある値nは、ポリゴンを形成する、連続するサブ要素の数を指定します。

SDO_ELEM_INFO配列にある次のn組は、これらサブ要素のそれぞれを記述します。SDO_ETYPE 2のもののみサブ要素になります。サブ要素の終了点は、次のサブ要素の開始点であり、繰り返すことはできません。ポリゴンの開始点および終了点は同じである必要があります(許容差は無視されます)。

複合ポリゴン・ジオメトリの例は、「複合ポリゴン」および図2-6を参照してください。

1006または2006

n > 1

1つ以上のポリゴンで構成され、各エッジが2つ以下のポリゴンで共有されている面です。面には面積はありますが、容積はありません。INTERPRETATION列にある値nは、表面を形成するポリゴンの数を指定します。

SDO_ELEM_INFO配列にある次のn組は、これらのポリゴンの各サブ要素を記述します。

表面は3次元である必要があります。Spatial and Graphでの3次元のサポートについては、「3次元の空間オブジェクト」を参照してください。

1007

n = 1または3

複数の面で構成され、完全に3次元空間で囲まれたソリッドです。したがって、ソリッドの内側には容積があります。ソリッド要素には、1006要素で定義された1つの外側の面と、2006要素で定義された0 (ゼロ)個以上の内側の境界が含まれる場合があります。Interpretation列の値nは、1または3である必要があります。

SDO_ELEM_INFO配列の後続の3つの数値セットは、ソリッド要素を構成する外側の面1006とオプションの内側の面2006を記述します。

nが3の場合、ソリッドは最適化されたボックスです。2つの3次元の点のみで定義が可能です。すなわち、そのボックスのX、YおよびZの各次元の最小値と最大値を示す点の2つのみで定義できます。例: SDO_GEOMETRY(3008, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1007,3), SDO_ORDINATE_ARRAY(1,1,1, 3,3,3))

Spatial and Graphでの3次元のサポートについては、「3次元の空間オブジェクト」を参照してください。

2.2.5 SDO_ORDINATES

SDO_ORDINATES属性は、空間オブジェクトの境界を形成する座標の値を格納するNUMBER型の可変長配列(1048576)を使用して定義されます。この配列は、常にSDO_ELEM_INFO可変長配列の論理積で使用されます。配列の値は、次元によって指定されます。たとえば、境界に4つの2次元の点があるポリゴンは、{X1, Y1, X2, Y2, X3, Y3, X4, Y4, X1, Y1}のように格納されます。点が3次元の場合、{X1, Y1, Z1, X2, Y2, Z2, X3, Y3, Z3, X4, Y4, Z4, X1, Y1, Z1}のように格納されます。それぞれの点に関連付けられている次元数は、「ジオメトリのメタデータ・ビュー」で説明するとおり、xxx_SDO_GEOM_METADATAビューのメタデータとして格納されます。

SDO_ORDINATES配列のすべての値は、有効で、NULL以外である必要があります。複数要素のジオメトリにおいて、要素の区切りに使用される特別な値はありません。特定の要素を記述する順序の開始点および終了点は、その要素に対するSTARTING_OFFSET値と、「SDO_ELEM_INFO」で説明したSDO_ELEM_INFO配列における次の要素によって決定されます。オフセット値は、1から開始します。SDO_ORDINATES(1)は、最初の要素の最初の点の最初の縦座標です。

2.2.6 使用上の注意

SDO_GTYPEの値は、表2-1に示すとおりに使用する必要があります(ただし、Spatial and Graphでは、すべてのジオメトリの整合性制約を確認または強制するわけではありません)。Spatial and Graphでは、次の内容については確認されません。

  • SDO_GTYPEの値がd001およびd005の場合、SDO_ETYPE 1以外のサブ要素は無視されます。

  • SDO_GTYPEの値がd002およびd006の場合、SDO_ETYPE 2または4以外のサブ要素は無視されます。

  • SDO_GTYPEの値がd003およびd007の場合、SDO_ETYPE 3または5以外のサブ要素は無視されます。(「SDO_ELEM_INFO」で説明したSDO_ETYPEの変形1003、2003、1005および2005は含まれます)。

SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXTファンクションを使用して、1つのジオメトリ・オブジェクト、または指定されたフィーチャ表にあるすべてのジオメトリ・オブジェクトについての整合性を評価できます。

2.3 SDO_GEOMETRYのメソッド

SDO_GEOMETRYオブジェクト型には、ジオメトリ・オブジェクトの情報を取得するメソッド(メンバー・ファンクション)があります。

表2-3に、これらのメソッドを示します。

表2-3 SDO_GEOMETRYのメソッド

Name 戻り値 説明

Get_Dims

NUMBER

SDO_GTYPE値に指定された、ジオメトリ・オブジェクトの次元数を戻します。Oracle Spatial and Graphでは、Get_DimsメソッドとST_CoordDimメソッドは、同じ結果を戻します。

Get_GeoJson

CLOB

ジオメトリ・オブジェクトのGeoJSON表現を戻します。

Get_GType

NUMBER

SDO_GTYPE値に指定された、ジオメトリ・オブジェクトのジオメトリ・タイプを戻します。

Get_LRS_Dim

NUMBER

SDO_GTYPE値に指定された、LRSジオメトリ・オブジェクトのメジャー次元を戻します。

戻り値0(ゼロ)は、ジオメトリが、標準の(非LRS)ジオメトリであるか、またはリリース1(9.0.1)より前の形式のLRSジオメトリでメジャーがデフォルトの(最後の)次元にあることを示します。3は3つ目の次元にメジャー情報が含まれ、4は4つ目の次元にメジャー情報が含まれていることを示します。

Get_WKB

BLOB

ジオメトリ・オブジェクトのwell-knownバイナリ(WKB)形式を戻します。(戻されるオブジェクトに、SRID情報は含まれません。)

Get_WKT

CLOB

ジオメトリ・オブジェクトのwell-knownテキスト(WKT)形式(「well-knownテキスト(WKT)」を参照)を戻します。(戻されるオブジェクトに、SRID情報は含まれません。)

ST_CoordDim

NUMBER

ジオメトリ・オブジェクトの座標次元(ISO/IEC SQL Multimedia規格により定義)を戻します。Oracle Spatial and Graphでは、Get_DimsメソッドとST_CoordDimメソッドは、同じ結果を戻します。

ST_IsValid

NUMBER

ジオメトリ・オブジェクトが無効な場合は0(ゼロ)、有効な場合は1を戻します。(ISO/IEC SQL Multimedia規格では、このようなコンテキストの場合、「有効」のかわりに「well formed (整形式)」という語句が使用されています。)

このメソッドでは、0.001が許容差として使用されます。(許容差については、「許容差」を参照してください。)許容差を別途指定する場合、またはジオメトリが無効である理由の詳細情報を取得する場合は、SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXTファンクションを使用します。このファンクションの詳細は、「SDO_GEOMパッケージ(ジオメトリ)」を参照してください。

例2-2に、ほとんどのSDO_GEOMETRYメソッドを示します。(Get_WKBメソッドは、出力をSQL*Plusで表示できないため、含まれていません。)

例2-2 SDO_GEOMETRYのメソッド

SELECT c.shape.Get_Dims()
  FROM cola_markets c WHERE c.name = 'cola_b';
 
C.SHAPE.GET_DIMS()                                                              
------------------                                                              
                 2                                                              
 
SELECT c.shape.Get_GeoJson()
  FROM cola_markets c WHERE c.name = 'cola_b';
  
C.SHAPE.GET_GEOJSON()
--------------------------------------------------------------------------------
{ "type": "Polygon", "coordinates": [ [ [5, 1], [8, 1], [8, 6], [5, 7], [5, 1] ]

SELECT c.shape.Get_GType()
  FROM cola_markets c WHERE c.name = 'cola_b';
 
C.SHAPE.GET_GTYPE()                                                             
-------------------                                                             
                  3                                                             
 
SELECT a.route_geometry.Get_LRS_Dim()
  FROM lrs_routes a WHERE  a.route_id = 1;
 
A.ROUTE_GEOMETRY.GET_LRS_DIM()                                                  
------------------------------                                                  
                             3 

SELECT c.shape.Get_WKT()
  FROM cola_markets c WHERE c.name = 'cola_b';
 
C.SHAPE.GET_WKT()                                                               
--------------------------------------------------------------------------------
POLYGON ((5.0 1.0, 8.0 1.0, 8.0 6.0, 5.0 7.0, 5.0 1.0))                         
 
SELECT c.shape.ST_CoordDim()
  FROM cola_markets c WHERE c.name = 'cola_b';
 
C.SHAPE.ST_COORDDIM()                                                           
---------------------                                                           
                    2                                                           
 
SELECT c.shape.ST_IsValid()
  FROM cola_markets c WHERE c.name = 'cola_b';
 
C.SHAPE.ST_ISVALID()                                                            
--------------------                                                            
                   1 

2.4 SDO_GEOMETRYのコンストラクタ

SDO_GEOMETRYオブジェクト型には、CLOB形式またはVARCHAR2形式のwell-knownテキスト(WKT)文字列から、またはBLOB形式のwell-knownバイナリ(WKB)オブジェクトからジオメトリ・オブジェクトを作成するコンストラクタがあります。

使用可能なコンストラクタ書式は、次のとおりです。

SDO_GEOMETRY(wkt CLOB, srid NUMBER DEFAULT NULL);
SDO_GEOMETRY(wkt VARCHAR2, srid NUMBER DEFAULT NULL);
SDO_GEOMETRY(wkb BLOB, srid NUMBER DEFAULT NULL);

作成するジオメトリを表に挿入する場合、コンストラクタで使用するSRID値と、表内のジオメトリのSDO_SRID値は一致する必要があります。

次の例は、well-knownテキスト文字列を使用して点ジオメトリを作成します。(WKTでは、頂点の座標は空白で区切られ、それぞれの頂点はカンマで区切られます。)

SELECT SDO_GEOMETRY('POINT(-79 37)') FROM DUAL;
 
SDO_GEOMETRY('POINT(-7937)')(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_I
--------------------------------------------------------------------------------
SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(-79, 37, NULL), NULL, NULL)

例2-3に、ジオメトリ・オブジェクトを作成して、そのオブジェクトを表に挿入し、表に挿入したオブジェクトを表示するSDO_GEOMETRYコンストラクタを示します。

例2-3 ジオメトリを作成するSDO_GEOMETRYのコンストラクタ

DECLARE
  cola_b_wkb  BLOB;
  cola_b_wkt_clob  CLOB;
  cola_b_wkt_varchar  VARCHAR2(255);
  cola_b_geom  SDO_GEOMETRY;

BEGIN
-- Get cola_b geometry into CLOB, VARCHAR2, and BLOB objects,
-- for use by the constructor.
SELECT c.shape.Get_WKT() INTO cola_b_wkt_clob
  FROM cola_markets c WHERE c.name = 'cola_b';
cola_b_wkt_varchar := cola_b_wkt_clob;
SELECT c.shape.Get_WKB() INTO cola_b_wkb
  FROM cola_markets c WHERE c.name = 'cola_b';

-- Use some SDO_GEOMETRY constructors;
-- insert 3 geometries into the table; display the geometries later.
cola_b_geom := SDO_GEOMETRY(cola_b_wkt_clob);
INSERT INTO cola_markets VALUES (101, 'cola_b_from_clob', cola_b_geom);
cola_b_geom := SDO_GEOMETRY(cola_b_wkt_varchar);
INSERT INTO cola_markets VALUES (102, 'cola_b_from_varchar', cola_b_geom);
cola_b_geom := SDO_GEOMETRY(cola_b_wkb);
INSERT INTO cola_markets VALUES (103, 'cola_b_from_wkb', cola_b_geom);
END;
/
 
PL/SQL procedure successfully completed.
 
-- Display the geometries created using SDO_GEOMETRY constructors.
-- All three geometries are identical.
SELECT name, shape FROM cola_markets WHERE mkt_id > 100;
 
NAME                                                                            
--------------------------------                                                
SHAPE(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES)    
--------------------------------------------------------------------------------
cola_b_from_clob                                                                
SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARR
AY(5, 1, 8, 1, 8, 6, 5, 7, 5, 1))                                               
                                                                                
cola_b_from_varchar                                                             
SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARR
AY(5, 1, 8, 1, 8, 6, 5, 7, 5, 1))                                               
                                                                                
cola_b_from_wkb                                                                 
SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARR
AY(5, 1, 8, 1, 8, 6, 5, 7, 5, 1))

2.5 TINに関連するオブジェクト型

このトピックでは、Triangulated Irregular Network (TIN)のサポートに関連する次のオブジェクト型について説明します。

トピック:

2.5.1 SDO_TINオブジェクト型

TINの記述は、ユーザーが定義した表のSDO_TINオブジェクト型の1列に、1行で格納されます。SDO_TINオブジェクト型の定義は次のとおりです。

CREATE TYPE sdo_tin AS OBJECT
  (base_table          VARCHAR2(70),
   base_table_col      VARCHAR2(1024),
   tin_id              NUMBER.
   blk_table           VARCHAR2(70),
   ptn_params          VARCHAR2(1024),
   tin_extent          SDO_GEOMETRY,
   tin_tol             NUMBER,
   tin_tot_dimensions  NUMBER,
   tin_domain          SDO_ORGSCL_TYPE,
   tin_break_lines     SDO_GEOMETRY,
   tin_stop_lines      SDO_GEOMETRY,
   tin_void_rgns       SDO_GEOMETRY,
   tin_val_attr_tables SDO_STRING_ARRAY,
   tin_other_attrs     XMLTYPE);

SDO_TIN型には、表2-4に示す属性が含まれます。

表2-4 SDO_TIN型の属性

属性 説明

BASE_TABLE

SDO_TIN型の列を含む実表の名前。

BASE_TABLE_COL

実表のSDO_TIN型の列の名前。

TIN_ID

TINのID番号。(この一意のID番号はSpatial and Graphによって生成されます。このID番号は、型SDO_TINの列を含む実表のスキーマ内で一意です。)

BLK_TABLE

TINの各ブロックに関する情報を含む表の名前。この表に含まれる列を、表2-5に示します。

PTN_PARAMS

TINを分割するためのパラメータ。

TIN_EXTENT

TINの空間エクステント(TINに含まれるすべてのオブジェクトを囲む最小境界オブジェクト)を表すSDO_GEOMETRYオブジェクト。

TIN_TOL

TIN内のオブジェクトの許容差。(空間許容差の詳細は、「許容差」を参照してください。)

TIN_TOT_DIMENSIONS

TINの総次元数。空間次元および非空間次元が含まれます(最大値は9)。

TIN_DOMAIN

(現在は使用されていません。)

TIN_BREAK_LINES

(現在は使用されていません。)

TIN_STOP_LINES

(現在は使用されていません。)

TIN_VOID_RGNS

(現在は使用されていません。)。

TIN_VAL_ATTR_TABLES

TINの値属性表の名前を指定するSDO_STRING_ARRAYオブジェクトを指定します。SDO_STRING_ARRAY型は、VARRAY(1048576) OF VARCHAR2(32)として定義されます。

TIN_OTHER_ATTRS

TINのその他の属性を指定するXMLTYPEオブジェクトを指定します。詳細は、SDO_TIN_PKG.INITファンクションの「使用上の注意」を参照してください。

図2-2に、TINデータの記憶域モデルを示します。このモデルでは、(SDO_TIN型のBLK_TABLE属性で指定した)TINブロック表にSDO_TINオブジェクトに関連付けられたブロックが格納されます。

図2-2 TINデータの記憶域

図2-2の説明が続きます
図2-2「TINデータの記憶域」の説明

TINブロック表には、表2-5に示す列が含まれます。

表2-5 TINブロック表の列

列名 データ型 説明

BLK_ID

NUMBER

ブロックのID番号。

BLK_EXTENT

SDO_GEOMETRY

ブロックの空間エクステント。

BLK_DOMAIN

SDO_ORGSCL_TYPE

(現在は使用されていません。)

PCBLK_MIN_RES

NUMBER

点群データの場合は、問合せ時にブロックを可視化できる解像度の最小レベルです。問合せウィンドウがブロックの空間エクステントと重なる場合に、ブロックの最小から最大までの解像度幅が問合せの最小から最大までの解像度幅と重なる場合のみ、ブロックが取得されます。通常、小さい値ほどビュー・ポイントから離れており、高い値ほどビュー・ポイントに近いことを示します。

PCBLK_MAX_RES

NUMBER

点群データの場合は、問合せ時にブロックを可視化できる解像度の最大レベルです。問合せウィンドウがブロックの空間エクステントと重なる場合に、ブロックの最小から最大までの解像度幅が問合せの最小から最大までの解像度幅と重なる場合のみ、ブロックが取得されます。通常、小さい値ほどビュー・ポイントから離れており、高い値ほどビュー・ポイントに近いことを示します。

NUM_POINTS

NUMBER

点群データの場合は、POINTS BLOBに含まれる点の総数。

NUM_UNSORTED_POINTS

NUMBER

点群データの場合は、POINTS BLOB内のソートされていない点の数。

PT_SORT_DIM

NUMBER

点群データの場合は、点の空間次元数(2または3)。

POINTS

BLOB

点群データの場合は、点を含むBLOB。点ごとに次の情報を持つ点の配列で構成されます。

  • d 8バイトIEEE倍精度(dは点群の総次元数)

  • BLK_ID値に対応する4バイトのビッグ・エンディアン整数

  • PT_ID値に対応する4バイトのビッグ・エンディアン整数

TR_LVL

NUMBER

(現在は使用されていません。)

TR_RES

NUMBER

(現在は使用されていません。)

NUM_TRIANGLES

NUMBER

TRIANGLES BLOBに含まれる三角形の数。

TR_SORT_DIM

NUMBER

(現在は使用されていません。)

TRIANGLES

BLOB

三角形を含むBLOB。ブロックの三角形の配列で構成されます。

  • 各三角形は3つの頂点で指定されます。

  • 各頂点は(BLK_ID, PT_ID)のペアで指定され、それぞれの値は4バイトのビッグ・エンディアン整数です。

TINブロック表のPOINTS列の各BLOBは、次のとおりです。

  • 合計サイズは(tdim+1)×8です。tdimは各ブロックの合計次元数です。

  • 合計サイズは、5MB未満(Oracle Databaseリリース11.1.0.6以下の場合)または12MB未満(Oracle Databaseリリース11.1.0.7以上の場合)である必要があります。

属性名は、SDO_TIN型のオブジェクトに対する問合せで使用できます。例2-4に、LANDSCAPESという架空の表に含まれるTERRAIN列のTIN_EXTENT属性を問い合せるSELECT文の一部を示します。

例2-4 SDO_TINの属性の問合せ

SELECT l.terrain.tin_extent FROM landscapes l WHERE ...;

2.5.2 SDO_TIN_BLK_TYPEオブジェクト型およびSDO_TIN_BLKオブジェクト型

SDO_TIN_PKG.CLIP_TINファンクションを使用してクリップ操作を実行する場合、SDO_TIN_BLK_TYPE型のオブジェクトが戻されます。このオブジェクトはTABLE OF SDO_TIN_BLKとして定義されます。

SDO_TIN_BLKオブジェクト型の属性は、TINブロック表に含まれる列と同じです(TINブロック表については、「SDO_TIN_BLK_TYPEオブジェクト型およびSDO_TIN_BLKオブジェクト型」表2-5を参照)。

2.6 点群に関連するオブジェクト型

このトピックでは、点群のサポートに関連する次のオブジェクト型について説明します。

トピック:

2.6.1 SDO_PCオブジェクト型

点群の記述は、ユーザーが定義した表のSDO_PCオブジェクト型の1列に、1行で格納されます。SDO_PCオブジェクト型の定義は次のとおりです。

CREATE TYPE sdo_pc AS OBJECT
  (base_table         VARCHAR2(70),
   base_table_col     VARCHAR2(1024),
   pc_id              NUMBER.
   blk_table          VARCHAR2(70),
   ptn_params         VARCHAR2(1024),
   pc_extent          SDO_GEOMETRY,
   pc_tol             NUMBER,
   pc_tot_dimensions  NUMBER,
   pc_domain          SDO_ORGSCL_TYPE,
   pc_val_attr_tables SDO_STRING_ARRAY,
   pc_other_attrs     XMLTYPE);

SDO_PC型の属性を表2-6に示します。

表2-6 SDO_PC型の属性

属性 説明

BASE_TABLE

SDO_PC型の列を含む実表の名前。

BASE_TABLE_COL

実表のSDO_PC型の列名。

PC_ID

点群のID番号。(この一意のID番号はSpatial and Graphによって生成されます。このID番号は、型SDO_PCの列を含む実表のスキーマ内で一意です。)

BLK_TABLE

点群の各ブロックに関する情報を含む表の名前。この表に含まれる列を、表2-7に示します。

PTN_PARAMS

点群を分割するためのパラメータ。

PC_EXTENT

点群の空間エクステント(点群に含まれるすべてのオブジェクトを囲む最小境界オブジェクト)を表すSDO_GEOMETRYオブジェクト。

PC_TOL

点群内の点の許容差。(空間許容差の詳細は、「許容差」を参照してください。)

PC_TOT_DIMENSIONS

点群の総次元数。空間次元および非空間次元が含まれます(最大値は9)。

PC_DOMAINS

(現在は使用されていません。)

PC_VAL_ATTR_TABLES

点群の値属性表の名前を指定するSDO_STRING_ARRAYオブジェクトを指定します。SDO_STRING_ARRAY型は、VARRAY(1048576) OF VARCHAR2(32)として定義されます。

PC_OTHER_ATTRS

点群のその他の属性を指定するXMLTYPEオブジェクトを指定します。詳細は、SDO_PC_PKG.INITファンクションの「使用上の注意」を参照してください。

点群ブロック表(SDO_PC型のBLK_TABLE属性で指定された)には、表2-7に示す列が含まれます。

表2-7 点群ブロック表の列

列名 データ型 説明

OBJ_ID

NUMBER

点群オブジェクトのID番号。

BLK_ID

NUMBER

ブロックのID番号。

BLK_EXTENT

SDO_GEOMETRY

ブロックの空間エクステント。

BLK_DOMAIN

SDO_ORGSCL_TYPE

(現在は使用されていません。)

PCBLK_MIN_RES

NUMBER

点群データの場合は、問合せ時にブロックを可視化できる解像度の最小レベルです。問合せウィンドウがブロックの空間エクステントと重なる場合に、ブロックの最小から最大までの解像度幅が問合せの最小から最大までの解像度幅と重なる場合のみ、ブロックが取得されます。通常、小さい値ほどビュー・ポイントから離れており、高い値ほどビュー・ポイントに近いことを示します。

PCBLK_MAX_RES

NUMBER

点群データの場合は、問合せ時にブロックを可視化できる解像度の最大レベルです。問合せウィンドウがブロックの空間エクステントと重なる場合に、ブロックの最小から最大までの解像度幅が問合せの最小から最大までの解像度幅と重なる場合のみ、ブロックが取得されます。通常、小さい値ほどビュー・ポイントから離れており、高い値ほどビュー・ポイントに近いことを示します。

NUM_POINTS

NUMBER

点群データの場合は、POINTS BLOBに含まれる点の総数。

NUM_UNSORTED_POINTS

NUMBER

点群データの場合は、POINTS BLOB内のソートされていない点の数。

PT_SORT_DIM

NUMBER

点がソートされる次元数(1は最初の次元、2は2つ目の次元など)。

POINTS

BLOB

点を含むBLOBを指定します。点ごとに次の情報を持つ点の配列で構成されます。

  • d 8バイトIEEE倍精度(dはPC_TOT_DIMENSIONS値)

  • BLK_ID値に対応する4バイトのビッグ・エンディアン整数

  • PT_ID値に対応する4バイトのビッグ・エンディアン整数

属性名は、SDO_PC型のオブジェクトに対する問合せで使用できます。例2-5に、OCEAN_FLOOR_MODELという架空の表に含まれるOCEAN_FLOOR列のPC_EXTENT属性を問い合せるSELECT文の一部を示します。

例2-5 SDO_PCの属性の問合せ

SELECT o.ocean_floor.pc_extent FROM ocean_floor_model o WHERE ...;

2.6.2 SDO_PC_BLK_TYPEオブジェクト型およびSDO_PC_BLKオブジェクト型

SDO_PC_PKG.CLIP_PCファンクションを使用してクリップ操作を実行する場合、SDO_PC_BLK_TYPE型のオブジェクトが戻されます。このオブジェクトはTABLE OF SDO_PC_BLKとして定義されます。

SDO_PC_BLKオブジェクト型の属性は、点群ブロック表に含まれる列と同じです(点群ブロック表については、「SDO_PCオブジェクト型」表2-7を参照)。

2.7 ジオメトリの例

このトピックでは、様々なジオメトリ・タイプの例を示します。

トピック:

2.7.1 矩形

図2-3に、「空間データの挿入、索引付けおよび問合せの例」の例のcola_aを表す矩形を示します。

図2-3に示すジオメトリのSDO_GEOMETRY定義は、次のとおりです。

  • SDO_GTYPE = 2003。2は2次元を示し、3はポリゴンを示します。

  • SDO_SRID = NULL。

  • SDO_POINT = NULL。

  • SDO_ELEM_INFO = (1, 1003, 3)。1,1003,3の最後の3は、これが矩形であることを示しています。これは矩形なので、SDO_ORDINATESに2つの縦座標のみが指定されています(左下と右上)。

  • SDO_ORDINATES = (1,1, 5,7)。これらは、矩形の左下と右上の縦座標を示しています。

例2-6に、図2-3のジオメトリをデータベースに挿入するSQL文を示します。

例2-6 矩形を挿入するSQL文

INSERT INTO cola_markets VALUES(
  1,
  'cola_a',
  SDO_GEOMETRY(
    2003,  -- two-dimensional polygon
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,1003,3), -- one rectangle (1003 = exterior)
    SDO_ORDINATE_ARRAY(1,1, 5,7) -- only 2 points needed to
          -- define rectangle (lower left and upper right) with
          -- Cartesian-coordinate data
  )
);

2.7.2 穴のあるポリゴン

図2-4に、2つの要素(ポリゴンの外部および内部の輪)で構成されるジオメトリを示します。この例で内側の要素は、空間(穴)として扱われます。

図2-4 穴のあるポリゴン

図2-4の説明が続きます
図2-4「穴のあるポリゴン」の説明

図2-4に示すジオメトリのSDO_GEOMETRY定義は、次のとおりです。

  • SDO_GTYPE = 2003。2は2次元を示し、3はポリゴンを示します。

  • SDO_SRID = NULL。

  • SDO_POINT = NULL。

  • SDO_ELEM_INFO = (1,1003,1, 19,2003,1)。3つの値で構成される2つの要素(1,1003,1および19,2003,1)があります。

    1003は、要素がポリゴンの外部の輪であることを示し、2003は、要素がポリゴンの内部の輪であることを示します。

    19は、2番目の要素(ポリゴンの内部の輪)の縦座標の指定が、SDO_ORDINATES配列の19番目の数字から開始している(ここでは7であるため、第1の点は7,5であるという意味になる)ことを示します。

  • SDO_ORDINATES = (2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4, 7,5, 7,10, 10,10, 10,5, 7,5)。

  • ポリゴンの面積(SDO_GEOM.SDO_AREAファンクション)は、ポリゴンの外部面積からポリゴンの内部面積を引きます。この例では、ポリゴンの面積は84(99 - 15)です。

  • ポリゴンの周囲(SDO_GEOM.SDO_LENGTHファンクション)は、ポリゴンの外部の周囲にポリゴンの内部の周囲を足します。この例では、ポリゴンの周囲は52.9193065(36.9193065 + 16)です。

例2-7 穴のあるポリゴンを挿入するSQL文

例2-7に、図2-4のジオメトリをデータベースに挿入するSQL文を示します。

INSERT INTO cola_markets VALUES(
  10,
  'polygon_with_hole',
  SDO_GEOMETRY(
    2003,  -- two-dimensional polygon
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,1003,1, 19,2003,1), -- polygon with hole
    SDO_ORDINATE_ARRAY(2,4, 4,3, 10,3, 13,5, 13,9, 11,13, 5,13, 2,11, 2,4,
        7,5, 7,10, 10,10, 10,5, 7,5)
  )
);

そのような「穴のあるポリゴン」の例としては、中に湖がある広大な土地(国や島など)があります。もちろん、実際の広大な土地にはそのような内部ポリゴンが多数存在する場合があるので、それぞれに対して、SDO_ELEM_INFOの3つ値で構成される要素および座標指定が必要になります。

外部の輪と内部の輪はネストできません。たとえば、ある国に湖があり、湖に島がある(さらに島に湖もある)ような場合は、島に対して別のポリゴンを定義する必要があります。湖を示すポリゴン内部の輪の中に、ポリゴン内部の輪として島を定義することはできません。

複数のポリゴン(ポリゴンの集合)では、輪をポリゴンごとにグループ化し、各ポリゴンの最初の輪を外部の輪にする必要があります。たとえば、2つのポリゴン(AおよびB)を含むポリゴンの集合について考えてみます。

  • ポリゴンA(1つの内部の「穴」): 外部の輪A0、内部の輪A1

  • ポリゴンB(2つの内部の「穴」): 外部の輪B0、内部の輪B1、内部の輪B2

SDO_ELEM_INFOおよびSDO_ORDINATESの要素は、次のいずれかの順序で記述する必要があります(ポリゴンAとBのどちらを最初に指定するかによって異なります)。

  • A0, A1; B0, B1, B2

  • B0, B1, B2; A0, A1

2.7.3 複合線ストリング

図2-5に、1つのまっすぐな線分と1つの円弧で構成される複合線ストリングとして表される三日月形のオブジェクトを示します。この形を表すには4つの点が必要で、(10,10)と(10,14)の点はまっすぐな線分を表し、(10,14)、(6,10)および(14,10)の点は円弧を表します。

図2-5 複合線ストリング

図2-5の説明が続きます
図2-5「複合線ストリング」の説明

図2-5に示すジオメトリのSDO_GEOMETRY定義は、次のとおりです。

  • SDO_GTYPE = 2002。最初の2は2次元を示し、2番目の2は1つ以上の線分を示します。

  • SDO_SRID = NULL。

  • SDO_POINT = NULL。

  • SDO_ELEM_INFO = (1,4,2, 1,2,1, 3,2,2)。3つの値で構成される3つの要素1,4,2、1,2,1および3,2,2があります。

    最初の組は、この要素が、後の2組を使用して記述されている2つのサブ要素線ストリングで構成される複合線ストリングであることを示します。

    2番目の組は、線ストリングが直線セグメントで構成され、かつこの線ストリングに対する座標がオフセット1から開始していることを示しています。この線ストリングの終了点は2番目の線ストリングの開始オフセット(このインスタンスでは3)によって決定されます。

    3つの値で構成される3番目の要素は、2番目の線ストリングが、オフセット3で始まる縦座標が指定された円弧で構成されることを示しています。この線ストリングの終了点は、次の要素の開始オフセットによって決まりますが、これが最後の要素である場合は、SDO_ORDINATES配列の現在の長さで決まります。

  • SDO_ORDINATES = (10,10, 10,14, 6,10, 14,10)。

例2-8に、図2-5のジオメトリをデータベースに挿入するSQL文を示します。

例2-8 複合線ストリングを挿入するSQL文

INSERT INTO cola_markets VALUES(
  11,
  'compound_line_string',
  SDO_GEOMETRY(
    2002,
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,4,2, 1,2,1, 3,2,2), -- compound line string
    SDO_ORDINATE_ARRAY(10,10, 10,14, 6,10, 14,10)
  )
);

2.7.4 複合ポリゴン

図2-6に、1つの直線セグメントおよび1つの円弧で構成される複合ポリゴンとして表現される、アイスクリーム・コーンの形をしたオブジェクトを示します。この形を表すには5つの点が必要で、(6,10)、(10,1)および(14,10)の点は1つの鋭角の線ストリングを表し、(14,10)、(10,14)および(6,10)の点は円弧を表します。線ストリングの開始点と円弧の終了点は同じ点(6,10)です。SDO_ELEM_INFO配列には、この複合線ストリングに対して3つの値の組が3つ含まれます。これらの3つの値の組は{(1,1005,2), (1,2,1), (5,2,2)}です。

図2-6 複合ポリゴン

図2-6の説明が続きます
図2-6「複合ポリゴン」の説明

図2-6に示すジオメトリのSDO_GEOMETRY定義は、次のとおりです。

  • SDO_GTYPE = 2003。2は2次元を示し、3はポリゴンを示します。

  • SDO_SRID = NULL。

  • SDO_POINT = NULL。

  • SDO_ELEM_INFO = (1,1005,2, 1,2,1, 5,2,2)。3つの値で構成される3つの要素1,1005,2、1,2,1および5,2,2があります。

    最初の組は、この要素が、後の2組を使用して記述されている2つのサブ要素線ストリングで構成される複合ポリゴンであることを示します。

    2番目の組は、最初のサブ要素線ストリングが直線セグメントで構成され、かつこの線ストリングに対する座標がオフセット1から開始していることを示しています。この線ストリングの終了点は2番目の線ストリングの開始オフセット(このインスタンスでは5)によって決定されます。1つの頂点はXとYの2つの値で決定されるため、最初の線ストリングの終了点座標はオフセット5および6となります。

    3つの値で構成される3番目の要素は、2番目のサブ要素線ストリングが、オフセット5で始まる縦座標が指定された円弧で構成されることを示しています。この線ストリングの終了点は、次の要素の開始オフセットによって決まりますが、これが最後の要素である場合は、SDO_ORDINATES配列の現在の長さで決まります。

  • SDO_ORDINATES = (6,10, 10,1, 14,10, 10,14, 6,10)。

例2-9に、図2-6のジオメトリをデータベースに挿入するSQL文を示します。

例2-9 複合ポリゴンを挿入するSQL文

INSERT INTO cola_markets VALUES(
  12,
  'compound_polygon',
  SDO_GEOMETRY(
    2003,  -- two-dimensional polygon
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,1005,2, 1,2,1, 5,2,2), -- compound polygon
    SDO_ORDINATE_ARRAY(6,10, 10,1, 14,10, 10,14, 6,10)
  )
);

2.7.5

図2-7に、座標(12,14)にある点のみのジオメトリを示します。

図2-7 点のみのジオメトリ

図2-7の説明が続きます
図2-7「点のみのジオメトリ」の説明

図2-7に示すジオメトリのSDO_GEOMETRY定義は、次のとおりです。

  • SDO_GTYPE = 2001。2は2次元を、1は単一の点を示します。

  • SDO_SRID = NULL。

  • SDO_POINT = SDO_POINT_TYPE(12, 14, NULL)。これは点のみのジオメトリであるため、SDO_POINT属性はSDO_POINT_TYPEオブジェクト型を使用して定義されます。

    SDO_POINT属性の詳細は、「SDO_POINT」を参照してください。

  • SDO_POINT属性が指定されている場合、必要に応じてSDO_ELEM_INFOおよびSDO_ORDINATESの両方がNULLになります。

例2-10に、図2-7のジオメトリをデータベースに挿入するSQL文を示します。

例2-10 点のみのジオメトリを挿入するSQL文

INSERT INTO cola_markets VALUES(
   90,
   'point_only',
   SDO_GEOMETRY(
      2001,
      NULL,
      SDO_POINT_TYPE(12, 14, NULL),
      NULL,
      NULL));

SDO_POINT_TYPEに指定されたX、YおよびZの値に基づいて点のみのジオメトリを検索できます。例2-11は、1つ目の座標(X値)が12であるすべての点を検索する問合せです。この例では、例2-10で挿入した点が検索されます。

例2-11 座標値に基づく点のみのジオメトリの問合せ

SELECT * from cola_markets c WHERE c.shape.SDO_POINT.X = 12;

    MKT_ID NAME                                                                
---------- --------------------------------                                     
SHAPE(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES)    
--------------------------------------------------------------------------------
        90 point_only                                                           
SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(12, 14, NULL), NULL, NULL)

2.7.6 方向付きの点

方向付きの点は、点と仮想の終了点の位置を示す座標を含む特殊な点のジオメトリで、点でのシンボルの回転や点からのラベルの引き出しに使用する方向ベクトルを表すことができます。方向付きの点は、主に地図の視覚化と、シンボル(高速道路を表す盾状のシンボルなど)を含む表示アプリケーションで使用されます。

方向付きの点は、次のように指定します。

  • SDO_GTYPE値(「SDO_GTYPE」を参照)は、単一点または複数点のジオメトリを使用します。

  • SDO_POINT属性には、NULL値を指定します。

  • SDO_ELEM_INFO配列(「SDO_ELEM_INFO」を参照)では、2番目と3番目の値(SDO_ETYPEとSDO_INTERPRETATION)を1と0にして、3つの値の組を追加指定します。たとえば、3つの値が3,1,0であれば、点が方向付きの点で、SDO_ORDINATES配列の3番目の数字が、シンボルやラベルの方向ベクトルを表す終了点の1つ目の座標(X軸値)であることを示されます。

  • SDO_ORDINATES配列(「SDO_ORDINATES」を参照)は、点の方向ベクトルを表す終了点の座標を-1から1の値で指定します。方位の始点は(0,0)とみなされ、対応する物理ポイントの位置に変換されます。

図2-8は、座標(12,14)に方向付きの点のジオメトリがあり、方向ベクトルは約34度(X軸から反時計回り)で、方向座標が0.3,0.2であることを示しています。(方位を特定の角度により正確に一致させるには、三角法のテキストにある表のコタンジェント値またはタンジェント値を参照してください。)この例の方向ベクトルは、(0,0)から(0.3,0.2)を経由しその先に延長されます。i=0.3、j=0.2とすると、角度(ラジアン)はarctan (j/i)で計算できます。この角度は、方向ベクトルに関連付けられた物理点に適用されます。

図2-8 方向付きの点のジオメトリ

図2-8の説明が続きます
図2-8「方向付きの点のジオメトリ」の説明

図2-8に示すジオメトリのSDO_GEOMETRY定義は、次のとおりです。

  • SDO_GTYPE = 2001。2は2次元を、1は単一の点を示します。

  • SDO_SRID = NULL。

  • SDO_POINT = NULL。

  • SDO_ELEM_INFO = (1,1,1, 3,1,0)。3,1,0の末尾の1,0は、方向付きの点であることを示します。

  • SDO_ORDINATES = (12,14, 0.3,0.2)。12,14は点の物理的な座標を識別し、0.3,0.2は方向ベクトルの終了点のx座標とy座標(12,14が原点と仮定)を識別します。この結果、方向ベクトルは、約34度の上向きに傾斜したものになります。

例2-12に、図2-8のジオメトリをデータベースに挿入するSQL文を示します。

例2-12 方向付きの点のジオメトリを挿入するSQL文

INSERT INTO cola_markets VALUES(
  91, 
  'oriented_point', 
  SDO_GEOMETRY(
    2001, 
    NULL, 
    NULL, 
    SDO_ELEM_INFO_ARRAY(1,1,1, 3,1,0), 
    SDO_ORDINATE_ARRAY(12,14, 0.3,0.2)));

方向付きの点を定義する際は、次のことに注意してください。

  • 方向ベクトルは、-1から1の数値で定義する必要があります。(例2-12では、この数値は0.3と0.2です。)

  • 方向付きの点は、複数点でも指定できますが(例2-13を参照)、方向付けをする点の後に方向情報を続ける必要があります。

方向付きの点の方向ベクトルの次元については、次のことに注意してください。

  • 2次元の点の方向ベクトルは2次元です。

  • LRSメジャーを持つ2次元の点(SDO_GTYPE=3301)の方向ベクトルは2次元です。

  • 3次元の点(SDO_GTYPE=3001)の方向ベクトルは3次元です。

  • LRSメジャーを持つ3次元の点(SDO_GTYPE=4401)の方向ベクトルは3次元です。

  • 4次元の点(SDO_GTYPE=4001)の方向ベクトルは3次元です。

例2-13 方向付きの複数点ジオメトリを挿入するSQL文

例2-13に、方向付きの複数点ジオメトリをデータベースに挿入するSQL文を示します。この複数点ジオメトリには、座標(12,14)および(12, 10)の位置に2つの点があり、それぞれが異なる方向ベクトルを保持しています。この文は例2-12の文と類似していますが、例2-13では、方向座標-1,-1を使用して、2つ目の点に左下向き45度(X軸から時計回りに135度)の方向ベクトルが割り当てられています。

-- Oriented multipoint: 2 points, different orientations
INSERT INTO cola_markets VALUES(
  92,
  'oriented_multipoint',
  SDO_GEOMETRY(
    2005, -- Multipoint
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,1,1, 3,1,0, 5,1,1, 7,1,0),
    SDO_ORDINATE_ARRAY(12,14, 0.3,0.2, 12,10, -1,-1)));

2.7.7 タイプ0(ゼロ)要素

タイプ0 (ゼロ)要素は、Oracle Spatial and Graphでサポートされないジオメトリ・タイプ(曲線やスプラインなど)をモデル化するために使用します。タイプ0(ゼロ)要素のSDO_ETYPE値は0(ゼロ)です。(SDO_ETYPEについては、「SDO_ELEM_INFO」を参照。)タイプ0 (ゼロ)要素は、Oracle Spatial and Graphでは索引付けされず、空間ファンクションおよび空間プロシージャでは無視されます。

タイプ0(ゼロ)要素を使用するジオメトリは、0(ゼロ)以外の要素(SDO_ETYPE値が0(ゼロ)以外の要素)を1つ以上含む必要があります。0(ゼロ)以外の要素は、サポートされないジオメトリの近似値である必要があるため、次の両方の値を持つ必要があります。

  • Spatial and Graphでサポートされているジオメトリ・タイプに関連付けられたSDO_ETYPE値

  • そのSDO_ETYPE値に有効なSDO_INTERPRETATION値(表2-2を参照)

    (タイプ0(ゼロ)要素のSDO_INTERPRETATION値には、任意の数値を指定できます。その値の妥当性および有効性は、アプリケーションが判断します。)

0 (ゼロ)以外の要素は、Spatial and Graphによって索引付けされ、空間索引によって戻されます。

タイプ0(ゼロ)要素を含むジオメトリのSDO_GTYPE値は、0(ゼロ)以外の要素のジオメトリ・タイプの値に設定する必要があります。

図2-9に、曲線(サポートされないジオメトリ)およびその曲線に近い矩形(0(ゼロ)以外の要素)の2つの要素を含むジオメトリを示します。曲線は文字「S」のように見え、矩形は破線で表されています。

図2-9 タイプ0(ゼロ)要素を含むジオメトリ

図2-9の説明が続きます
図2-9「タイプ0 (ゼロ)要素を含むジオメトリ」の説明

図2-9に示すジオメトリの定義は、次のとおりです。

  • ジオメトリのSDO_GTYPE値は2003(2次元ポリゴンを示す)です。

  • SDO_ELEM_INFO配列には、この複合線ストリングに対して3つの値の組が2つ含まれます。たとえば、{(1,0,57), (11,1003,3)}という組が含まれているとします。つまり、次のようになります。

    縦座標の開始オフセット(SDO_STARTING_OFFSET) 要素タイプ(SDO_ETYPE) 解釈(SDO_INTERPRETATION)

    1

    0

    57

    11

    1003

    3

この例では、次のようになります。

  • タイプ0(ゼロ)要素のSDO_ETYPE値は0(ゼロ)です。

  • 0(ゼロ)以外の要素(矩形)のSDO_ETYPE値は1003です。これは、ポリゴンの外部の輪を示します。

  • 縦座標x6はジオメトリの11番目の縦座標であるため、0(ゼロ)以外の要素のSDO_STARTING_OFFSET値は11です。

  • タイプ0(ゼロ)要素のSDO_INTERPRETATIONには、アプリケーション固有の値が指定されます。この例では、SDO_INTERPRETATION値は57です。

  • 0 (ゼロ)以外の要素のSDO_INTERPRETATION値は、値が1003のSDO_ETYPEに対して有効な値です。この例では、SDO_INTERPRETATION値は3です。これは、2点(左下および右上)によって定義される矩形を示します。

例2-14に、タイプ0(ゼロ)要素を含むジオメトリ(図2-9に示すジオメトリに類似)をデータベースに挿入するSQL文を示します。このSDO_ORDINATE_ARRAY構造では、曲線は点(6,6)、(12,6)、(9,8)、(6,10)および(12,10)によって定義され、矩形は点(6,4)および(12,12)によって定義されています。

例2-14 タイプ0(ゼロ)要素を含むジオメトリを挿入するSQL文

INSERT INTO cola_markets VALUES(
  13,
  'type_zero_element_geom',
  SDO_GEOMETRY(
    2003,  -- two-dimensional polygon
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,0,57, 11,1003,3), -- 1st is type 0 element
    SDO_ORDINATE_ARRAY(6,6, 12,6, 9,8, 6,10, 12,10, 6,4, 12,12)
  )
);

2.7.8 NURBS曲線

NURBS (Non-Uniform Rational B-Spline)曲線を使用すると、任意の形状で自由形式の形状の表現が可能になります。NURBS表現では、制御点とノットにより曲線の形状が決定され、わずかなデータで複雑な形状の表現が可能になるため、曲線の形状を制御することができます。NURBS曲線の説明およびNURBS曲線ジオメトリを定義するための要件については、「Oracle Spatial and GraphでのNURBS曲線のサポート」を参照してください。

例2-15に、NURBS曲線ジオメトリをデータベースに挿入するSQL文を示します。

例2-15に示すジオメトリのSDO_GEOMETRY定義は、次のとおりです。

  • SDO_GTYPE = 2002。1つ目の2は2次元を、2つ目の2は単一線ストリングを示します。

  • SDO_SRID = NULL。Oracle Spatial and Graphでは、測地NURBS曲線が許可されていないことに注意してください。

  • SDO_POINT = NULL。

  • SDO_ELEM_INFO_ARRAY = (1,2,3)。SDO_INTERPRETATION値3は、NURBS曲線を示します。

  • SDO_ORDINATE_ARRAYで、3はNURBS曲線の曲度、7は重み付け制御点の数、11はノット数値です。

例2-15 NURBS曲線ジオメトリを挿入するSQL文

CREATE TABLE nurbs_test (gid  integer, geom sdo_geometry);
 
INSERT INTO nurbs_test values(
  1,
  SDO_GEOMETRY(
    2002,
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1, 2, 3),  /* Element type 2 = SDO_ETYPE_CURVE and Interpretation value 3 = NURBS curve */
    SDO_ORDINATE_ARRAY
      (3,        /* Degree of the NURBS curve */
       7,        /* Number of weighted Control Points */
       0, 0, 1,  /* x1, y1, w1 where w1 denotes the weight of the control point and x1, y1 are weighted values. Implies the actual coordinate values have been multiplied by w1 */
       -0.5, 1, 1,
       0.2, 2, 1,
       0.5, 3.5, 1,
       0.8, 2, 1,
       0.9, 1, 1,
       0.3, 0, 1,
       11,     /* Number of knot values = Number of control points + degree + 1 */
       0, 0, 0, 0,  0.25, 0.5, 0.75, 1.0, 1.0, 1.0, 1.0)));  /* Normalized knot vector; values start at zero and end at 1. Clamped at end points as multiplicity of zero and one is 4, which is equal to the degree of the curve + 1 */

例2-16 NURBS複合曲線ジオメトリを挿入するSQL文

例2-16に、NURBSセグメントを持つ複合曲線ジオメトリの共通部分を示します。例2-15で作成したのと同じNURBS_TEST表を使用します。

INSERT INTO nurbs_test VALUES(
  1, 
  SDO_GEOMETRY(2002, NULL, NULL, 
    SDO_ELEM_INFO_ARRAY(1, 4, 2, 1, 2, 1, 5, 2, 3), 
    SDO_ORDINATE_ARRAY(-1, -1, 0, 0, 3, 7, 0, 0, 1, -0.5, 1, 1, 
      0.2, 2, 1, 0.5, 3.5, 1, 0.8, 2, 1, 0.9, 1, 1, 0.3, 
      0, 1, 11, 0, 0, 0, 0, 0.25, 0.5, 0.75, 1.0, 1.0, 1.0, 1.0)
    ));

例2-16に示すジオメトリのSDO_GEOMETRY定義は、次のとおりです。

  • SDO_GTYPE = 2002。1つ目の2は2次元を、2つ目の2は単一線ストリングを示します。

  • SDO_SRID = NULL。Oracle Spatial and Graphでは、測地NURBS曲線が許可されていないことに注意してください。

  • SDO_POINT = NULL。

  • SDO_ELEM_INFO_ARRAY = (1, 4, 2, 1, 2, 1, 5, 2, 3)。最初の3つ組は、2つの要素を持つ複合線ストリング(共通部分 = 4)を示します。次の2つの3つ組は、複合線ストリングのセグメントを定義します。最初のセグメントはオフセット1で開始する線ストリング、2つ目のセグメントはオフセット5で開始するNURBSセグメントです。

  • SDO_ORDINATE_ARRAYでは、最初の4つ値は、単純な線ストリングである最初のセグメントを定義します。少なくとも1つのNURBSセグメントを含む複合線ストリングでは、共通の頂点はセグメント間で繰り返されます。この例では、線ストリングの最後の点(0,0)はNURBS曲線の最初の"固定された"点(0,0)と等しい必要があります。NURBSセグメントはオフセット5で開始するように定義され、最初の制御点は(0,0)であり、これが度(3)と制御点の数(7)に続きます。NURBSセグメントには11のノット値があります。

2.7.9 2次元の各種ジオメトリ・タイプ

例2-17は、1つの表を作成し、複数点(点クラスタ)、複数ポリゴン、コレクションなどの2次元の各種ジオメトリを挿入します。最後に、SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXTファンクションをコールして、挿入したジオメトリの有効性を検証します。なお、一部のジオメトリは、意図的に無効にしてあります(ジオメトリの説明に、INVALIDという文字列が書かれています)。

例2-17 2次元の各種ジオメトリを挿入するSQL文

CREATE TABLE t1 (
  i NUMBER,
  d VARCHAR2(50),
  g SDO_GEOMETRY
);
INSERT INTO t1 (i, d, g)
VALUES (
  1,
  'Point',
  sdo_geometry (2001, null, null, sdo_elem_info_array (1,1,1), 
    sdo_ordinate_array (10,5))
);
INSERT INTO t1 (i, d, g)
VALUES (
  2,
  'Line segment',
  sdo_geometry (2002, null, null, sdo_elem_info_array (1,2,1), 
    sdo_ordinate_array (10,10, 20,10))
);
INSERT INTO t1 (i, d, g)
VALUES (
  3,
  'Arc segment',
  sdo_geometry (2002, null, null, sdo_elem_info_array (1,2,2), 
    sdo_ordinate_array (10,15, 15,20, 20,15))
);
INSERT INTO t1 (i, d, g)
VALUES (
  4,
  'Line string',
  sdo_geometry (2002, null, null, sdo_elem_info_array (1,2,1), 
    sdo_ordinate_array (10,25, 20,30, 25,25, 30,30))
);
INSERT INTO t1 (i, d, g)
VALUES (
  5,
  'Arc string',
  sdo_geometry (2002, null, null, sdo_elem_info_array (1,2,2), 
    sdo_ordinate_array (10,35, 15,40, 20,35, 25,30, 30,35))
);
INSERT INTO t1 (i, d, g)
VALUES (
  6,
  'Compound line string',
  sdo_geometry (2002, null, null, 
    sdo_elem_info_array (1,4,3, 1,2,1, 3,2,2, 7,2,1), 
    sdo_ordinate_array (10,45, 20,45, 23,48, 20,51, 10,51))
);
INSERT INTO t1 (i, d, g)
VALUES (
  7,
  'Closed line string',
  sdo_geometry (2002, null, null, sdo_elem_info_array (1,2,1), 
    sdo_ordinate_array (10,55, 15,55, 20,60, 10,60, 10,55))
);
INSERT INTO t1 (i, d, g)
VALUES (
  8,
  'Closed arc string',
  sdo_geometry (2002, null, null, sdo_elem_info_array (1,2,2), 
    sdo_ordinate_array (15,65, 10,68, 15,70, 20,68, 15,65))
);
INSERT INTO t1 (i, d, g)
VALUES (
  9,
  'Closed mixed line',
  sdo_geometry (2002, null, null, sdo_elem_info_array (1,4,2, 1,2,1, 7,2,2), 
    sdo_ordinate_array (10,78, 10,75, 20,75, 20,78, 15,80, 10,78))
);
INSERT INTO t1 (i, d, g)
VALUES (
  10,
  'Self-crossing line',
  sdo_geometry (2002, null, null, sdo_elem_info_array (1,2,1), 
    sdo_ordinate_array (10,85, 20,90, 20,85, 10,90, 10,85))
);
INSERT INTO t1 (i, d, g)
VALUES (
  11,
  'Polygon',
  sdo_geometry (2003, null, null, sdo_elem_info_array (1,1003,1), 
    sdo_ordinate_array (10,105, 15,105, 20,110, 10,110, 10,105))
);
INSERT INTO t1 (i, d, g)
VALUES (
  12,
  'Arc polygon',
  sdo_geometry (2003, null, null, sdo_elem_info_array (1,1003,2), 
    sdo_ordinate_array (15,115, 20,118, 15,120, 10,118, 15,115))
);
INSERT INTO t1 (i, d, g)
VALUES (
  13,
  'Compound polygon',
  sdo_geometry (2003, null, null, sdo_elem_info_array (1,1005,2, 1,2,1, 7,2,2), 
    sdo_ordinate_array (10,128, 10,125, 20,125, 20,128, 15,130, 10,128))
);
INSERT INTO t1 (i, d, g)
VALUES (
  14,
  'Rectangle',
  sdo_geometry (2003, null, null, sdo_elem_info_array (1,1003,3), 
    sdo_ordinate_array (10,135, 20,140))
);
INSERT INTO t1 (i, d, g)
VALUES (
  15,
  'Circle',
  sdo_geometry (2003, null, null, sdo_elem_info_array (1,1003,4), 
    sdo_ordinate_array (15,145, 10,150, 20,150))
);
INSERT INTO t1 (i, d, g)
VALUES (
  16,
  'Point cluster',
  sdo_geometry (2005, null, null, sdo_elem_info_array (1,1,3), 
    sdo_ordinate_array (50,5, 55,7, 60,5))
);
INSERT INTO t1 (i, d, g)
VALUES (
  17,
  'Multipoint',
  sdo_geometry (2005, null, null, sdo_elem_info_array (1,1,1, 3,1,1, 5,1,1), 
    sdo_ordinate_array (65,5, 70,7, 75,5))
);
INSERT INTO t1 (i, d, g)
VALUES (
  18,
  'Multiline',
  sdo_geometry (2006, null, null, sdo_elem_info_array (1,2,1, 5,2,1), 
    sdo_ordinate_array (50,15, 55,15, 60,15, 65,15))
);
INSERT INTO t1 (i, d, g)
VALUES (
  19,
  'Multiline - crossing',
  sdo_geometry (2006, null, null, sdo_elem_info_array (1,2,1, 5,2,1), 
    sdo_ordinate_array (50,22, 60,22, 55,20, 55,25))
);
INSERT INTO t1 (i, d, g)
VALUES (
  20,
  'Multiarc',
  sdo_geometry (2006, null, null, sdo_elem_info_array (1,2,2, 7,2,2), 
    sdo_ordinate_array (50,35, 55,40, 60,35, 65,35, 70,30, 75,35))
);
INSERT INTO t1 (i, d, g)
VALUES (
  21,
  'Multiline - closed',
  sdo_geometry (2006, null, null, sdo_elem_info_array (1,2,1, 9,2,1), 
    sdo_ordinate_array (50,55, 50,60, 55,58, 50,55, 56,58, 60,55, 60,60, 56,58))
);
INSERT INTO t1 (i, d, g)
VALUES (
  22,
  'Multiarc - touching',
  sdo_geometry (2006, null, null, sdo_elem_info_array (1,2,2, 7,2,2), 
    sdo_ordinate_array (50,65, 50,70, 55,68, 55,68, 60,65, 60,70))
);
INSERT INTO t1 (i, d, g)
VALUES (
  23,
  'Multipolygon - disjoint',
  sdo_geometry (2007, null, null, sdo_elem_info_array (1,1003,1, 11,1003,3), 
    sdo_ordinate_array (50,105, 55,105, 60,110, 50,110, 50,105, 62,108, 65,112))
);
INSERT INTO t1 (i, d, g)
VALUES (
  24,
  'Multipolygon - touching',
  sdo_geometry (2007, null, null, sdo_elem_info_array (1,1003,3, 5,1003,3), 
    sdo_ordinate_array (50,115, 55,120, 55,120, 58,122))
);
INSERT INTO t1 (i, d, g)
VALUES (
  25,
  'Multipolygon - tangent * INVALID 13351',
  sdo_geometry (2007, null, null, sdo_elem_info_array (1,1003,3, 5,1003,3), 
    sdo_ordinate_array (50,125, 55,130, 55,128, 60,132))
);
INSERT INTO t1 (i, d, g)
VALUES (
  26,
  'Multipolygon - multi-touch',
  sdo_geometry (2007, null, null, sdo_elem_info_array (1,1003,1, 17,1003,1), 
    sdo_ordinate_array (50,95, 55,95, 53,96, 55,97, 53,98, 55,99, 50,99, 50,95, 
      55,100, 55,95, 60,95, 60,100, 55,100))
);
INSERT INTO t1 (i, d, g)
VALUES (
  27,
  'Polygon with void',
  sdo_geometry (2003, null, null, sdo_elem_info_array (1,1003,3, 5,2003,3), 
    sdo_ordinate_array (50,135, 60,140, 51,136, 59,139))
);
INSERT INTO t1 (i, d, g)
VALUES (
  28,
  'Polygon with void - reverse',
  sdo_geometry (2003, null, null, sdo_elem_info_array (1,2003,3, 5,1003,3), 
    sdo_ordinate_array (51,146, 59,149, 50,145, 60,150))
);
INSERT INTO t1 (i, d, g)
VALUES (
  29,
  'Crescent (straight lines) * INVALID 13349',
  sdo_geometry (2003, null, null, sdo_elem_info_array (1,1003,1), 
    sdo_ordinate_array (10,175, 10,165, 20,165, 15,170, 25,170, 20,165, 
      30,165, 30,175, 10,175))
);
INSERT INTO t1 (i, d, g)
VALUES (
  30,
  'Crescent (arcs) * INVALID 13349',
  sdo_geometry (2003, null, null, sdo_elem_info_array (1,1003,2), 
    sdo_ordinate_array (14,180, 10,184, 14,188, 18,184, 14,180, 16,182, 
      14,184, 12,182, 14,180))
);
INSERT INTO t1 (i, d, g)
VALUES (
  31,
  'Heterogeneous collection',
  sdo_geometry (2004, null, null, sdo_elem_info_array (1,1,1, 3,2,1, 7,1003,1), 
    sdo_ordinate_array (10,5, 10,10, 20,10, 10,105, 15,105, 20,110, 10,110,
      10,105))
);
INSERT INTO t1 (i, d, g)
VALUES (
  32,
  'Polygon+void+island touch',
  sdo_geometry (2007, null, null, 
    sdo_elem_info_array (1,1003,1, 11,2003,1, 31,1003,1), 
    sdo_ordinate_array (50,168, 50,160, 55,160, 55,168, 50,168,  51,167,
      54,167, 54,161, 51,161, 51,162, 52,163, 51,164, 51,165, 51,166, 51,167, 
      52,166, 52,162, 53,162, 53,166, 52,166))
);
COMMIT;
SELECT i, d, SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT (g, 0.5) FROM t1;

2.7.10 3次元のジオメトリ・タイプ

例2-18では、複数の表(POINTS3D、LINES3DおよびPOLYGONS3D)を作成し、それぞれの表に対応する3次元オブジェクトを(点はPOINTS3Dに、線はLINES3Dに、ポリゴン、面およびソリッドはPOLYGONS3Dに)挿入します。続いて例2-19では、各表のメタデータと空間索引を作成します。

3次元ジオメトリのサポートの詳細は、「3次元の空間オブジェクト」を参照してください。

例2-18 3次元のジオメトリを挿入するSQL文

create table points3d(id number, geometry sdo_geometry);
insert into points3d values(1, sdo_geometry(3001,null,
             sdo_point_type(0,0,0), null, null));
insert into points3d values(2, sdo_geometry(3001,null,
             sdo_point_type(1,1,1), null, null));
insert into points3d values(3, sdo_geometry(3001,null,
             sdo_point_type(0,1,1), null, null));
insert into points3d values(4, sdo_geometry(3001,null,
             sdo_point_type(0,0,1), null, null));
insert into points3d values(5, sdo_geometry(3001,null,
             sdo_point_type(1,1,0), null, null));
insert into points3d values(6, sdo_geometry(3001,null,
             sdo_point_type(1,0,1), null, null));
insert into points3d values(7, sdo_geometry(3001,null,
             sdo_point_type(1,0,0), null, null));
insert into points3d values(8, sdo_geometry(3001,null,
             sdo_point_type(0,1,0), null, null));
insert into points3d values(9, sdo_geometry(3005,null, null,
             sdo_elem_info_array(1,1,1, 4,1,1),
             sdo_ordinate_array(1,1,1, 0,0,0)));
 
create table lines3d(id number, geometry sdo_geometry);
insert into lines3d values(1, sdo_geometry(3002,null, null,
             sdo_elem_info_array(1,2,1),
             sdo_ordinate_array(1,1,1, 0,0,0)));
insert into lines3d values(2, sdo_geometry(3002,null, null,
             sdo_elem_info_array(1,2,1),
             sdo_ordinate_array(1,0,1, 0,1,0)));
insert into lines3d values(2, sdo_geometry(3002,null, null,
             sdo_elem_info_array(1,2,1),
             sdo_ordinate_array(0,1,1, 1,0,0)));
insert into lines3d values(3, sdo_geometry(3002,null, null,
             sdo_elem_info_array(1,2,1),
             sdo_ordinate_array(0,1,1, 1,0,0)));
insert into lines3d values(4, sdo_geometry(3002,null, null,
             sdo_elem_info_array(1,2,1),
             sdo_ordinate_array(0,1,0, 1,0,1)));
 
create table polygons3d(id number, geometry sdo_geometry);
 
-- Simple Polygon
-- All points have to be on the same plane.
insert into polygons3d values(1, 
SDO_Geometry (3003,NULL,NULL ,  
 SDO_Elem_Info_Array(1,1003,1),  
 SDO_Ordinate_Array(0.5,0.0,0.0,
0.5,1.0,0.0,
0.0,1.0,1.0,
0.0,0.0,1.0,
0.5,0.0,0.0
)));
insert into polygons3d values(2, 
SDO_Geometry (3003,NULL,NULL ,  
 SDO_Elem_Info_Array(1,1003,1),  
 SDO_Ordinate_Array(6.0,6.0,6.0,
5.0,6.0,10.0,
3.0,4.0,8.0,
4.0,4.0,4.0,
6.0,6.0,6.0
)));
insert into polygons3d values(3, 
SDO_Geometry (3007,NULL,NULL ,  
 SDO_Elem_Info_Array(1,1003,1,16,1003,1),  
 SDO_Ordinate_Array(6.0,6.0,6.0,
5.0,6.0,10.0,
3.0,4.0,8.0,
4.0,4.0,4.0,
6.0,6.0,6.0,
0.5,0.0,0.0,
0.5,1.0,0.0,
0.0,1.0,1.0,
0.0,0.0,1.0,
0.5,0.0,0.0
)));
-- Polygon with a Hole (same rules as 2D) plus all points on the same plane
insert into polygons3d values(4, 
SDO_Geometry (3003,NULL,NULL ,  
 SDO_Elem_Info_Array(1,1003,1,16,2003,1),  
 SDO_Ordinate_Array(0.5,0.0,0.0,
0.5,1.0,0.0,
0.0,1.0,1.0,
0.0,0.0,1.0,
0.5,0.0,0.0,
0.25,0.5,0.5,
0.15,0.5,0.7,
0.15,0.6,0.7,
0.25,0.6,0.5,
0.25,0.5,0.5
)));
-- Surface with 2 3D polygons (on same plane)
insert into polygons3d values(5, 
SDO_Geometry (3003,NULL,NULL ,  
 SDO_Elem_Info_Array(1,1006,2,1,1003,1,16,1003,1),  
 SDO_Ordinate_Array(0.5,0.0,0.0,
0.5,1.0,0.0,
0.0,1.0,0.0,
0.0,0.0,0.0,
0.5,0.0,0.0,
1.5,0.0,0.0,
2.5,1.0,0.0,
1.5,2.0,0.0,
0.5,2.0,0.0,
0.5,0.0,0.0,
1.5,0.0,0.0
)));
-- Surface with 2 3D polygons (on two planes)
insert into polygons3d values(5, 
SDO_Geometry(3003,NULL,NULL , 
 SDO_Elem_Info_Array(1,1006,2,1,1003,3,7,1003,3),  
 SDO_Ordinate_Array(2,2,2,
4,4,2,
2,2,2,
4,2,4
)));
-- Surface with 2 3D polygons
-- First polygon has one ext and one int.
insert into polygons3d values(6, 
SDO_Geometry (3003,NULL,NULL ,  
 SDO_Elem_Info_Array(1,1006,2,1,1003,1,16,2003,1,31,1003,1),  
 SDO_Ordinate_Array(0.5,0.0,0.0,
0.5,1.0,0.0,
0.0,1.0,1.0,
0.0,0.0,1.0,
0.5,0.0,0.0,
0.25,0.5,0.5,
0.15,0.5,0.7,
0.15,0.6,0.7,
0.25,0.6,0.5,
0.25,0.5,0.5,
1.5,0.0,0.0,
2.5,1.0,0.0,
1.5,2.0,0.0,
0.5,2.0,0.0,
0.5,0.0,0.0,
1.5,0.0,0.0
)));
--3D Surface with 3 3D polygons
insert into polygons3d values(7, 
SDO_Geometry (3003,NULL,NULL ,  
 SDO_Elem_Info_Array(1,1006,3,1,1003,1,16,1003,1,34,1003,1),  
 SDO_Ordinate_Array(0.5,0.0,0.0,
0.5,1.0,0.0,
0.0,1.0,1.0,
0.0,0.0,1.0,
0.5,0.0,0.0,
1.5,0.0,0.0,
2.5,1.0,0.0,
1.5,2.0,0.0,
0.5,2.0,0.0,
0.5,0.0,0.0,
1.5,0.0,0.0,
1.5,0.0,0.0,
2.5,0.0,0.0,
2.5,1.0,0.0,
1.5,0.0,0.0
)));
-- 3D surface with 3 3D polygons
insert into polygons3d values(8, 
SDO_Geometry (3003,NULL,NULL ,  
 SDO_Elem_Info_Array(1,1006,3,1,1003,1,16,2003,1,31,1003,1,49,1003,1),  
 SDO_Ordinate_Array(0.5,0.0,0.0,
0.5,1.0,0.0,
0.0,1.0,1.0,
0.0,0.0,1.0,
0.5,0.0,0.0,
0.25,0.5,0.5,
0.15,0.5,0.7,
0.15,0.6,0.7,
0.25,0.6,0.5,
0.25,0.5,0.5,
1.5,0.0,0.0,
2.5,1.0,0.0,
1.5,2.0,0.0,
0.5,2.0,0.0,
0.5,0.0,0.0,
1.5,0.0,0.0,
0.5,1.0,0.0,
0.5,2.0,0.0,
0.0,2.0,0.0,
0.0,1.0,0.0,
0.5,1.0,0.0
)));
-- Simple 3D polygon
insert into polygons3d values(9, 
SDO_Geometry (3003,NULL,NULL ,  
 SDO_Elem_Info_Array(1,1003,1),  
 SDO_Ordinate_Array(0.0,-4.0,1.0,
4.0,-4.0,1.0,
5.0,-3.0,1.0,
5.0,0.0,1.0,
3.0,1.0,1.0,
-1.0,1.0,1.0,
-3.0,0.5,1.0,
0.0,0.0,1.0,
-6.0,-2.0,1.0,
-6.0,-3.5,1.0,
-2.0,-3.5,1.0,
0.0,-4.0,1.0
)));
-- SOLID with 6 polygons
insert into polygons3d values(10, 
SDO_Geometry (3008,NULL,NULL ,  
 SDO_Elem_Info_Array(1,1007,1,1,1006,6,1,1003,1,16,1003,1,31,1003,1,46,1003,1,61,1003,1,76,1003,1),  
 SDO_Ordinate_Array(1.0,0.0,-1.0,
1.0,1.0,-1.0,
1.0,1.0,1.0,
1.0,0.0,1.0,
1.0,0.0,-1.0,
1.0,0.0,1.0,
0.0,0.0,1.0,
0.0,0.0,-1.0,
1.0,0.0,-1.0,
1.0,0.0,1.0,
0.0,1.0,1.0,
0.0,1.0,-1.0,
0.0,0.0,-1.0,
0.0,0.0,1.0,
0.0,1.0,1.0,
1.0,1.0,-1.0,
0.0,1.0,-1.0,
0.0,1.0,1.0,
1.0,1.0,1.0,
1.0,1.0,-1.0,
1.0,1.0,1.0,
0.0,1.0,1.0,
0.0,0.0,1.0,
1.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,-1.0,
1.0,0.0,-1.0,
0.0,0.0,-1.0,
0.0,1.0,-1.0,
1.0,1.0,-1.0
)));
-- Simple SOLID with 6 polygons
-- All polygons are described using the optimized rectangle representation.
insert into polygons3d values(11,
SDO_Geometry (3008,NULL,NULL , SDO_Elem_Info_Array(1,1007,1,1,1006,6,1,1003,3,7,1003,3,13,1003,3,19,1003,3,25,1003,3,31,1003,3), 
SDO_Ordinate_Array(1.0,0.0,-1.0,
1.0,1.0,1.0,
1.0,0.0,1.0,
0.0,0.0,-1.0,
0.0,1.0,1.0,
0.0,0.0,-1.0,
0.0,1.0,-1.0,
1.0,1.0,1.0,
0.0,0.0,1.0,
1.0,1.0,1.0,
1.0,1.0,-1.0,
0.0,0.0,-1.0
)));
-- Multi-Solid
-- Both solids use optimized representation.
insert into polygons3d values(12, 
SDO_Geometry (3009,NULL,NULL ,  
 SDO_Elem_Info_Array(1,1007,3,7,1007,3),  
 SDO_Ordinate_Array(-2.0,1.0,3.0,
-3.0,-1.0,0.0,
0.0,0.0,0.0,
1.0,1.0,1.0
)));
-- Multi-Solid - like multipolygon in 2D
-- disjoint solids
insert into polygons3d values(13,
SDO_Geometry (3009,NULL,NULL , SDO_Elem_Info_Array(1,1007,1,1,1006,6,1,1003,1,16,1003,1,31,1003,1,46,1003,1,61,1003,1,76,1003,1,91,1007,1,91,1006,7,91,1003,1,106,1003,1,121,1003,1,136,1003,1,151,1003,1,166,1003,1,184,1003,1), 
SDO_Ordinate_Array(1.0,0.0,4.0,
1.0,1.0,4.0,
1.0,1.0,6.0,
1.0,0.0,6.0,
1.0,0.0,4.0,
1.0,0.0,6.0,
0.0,0.0,6.0,
0.0,0.0,4.0,
1.0,0.0,4.0,
1.0,0.0,6.0,
0.0,1.0,6.0,
0.0,1.0,4.0,
0.0,0.0,4.0,
0.0,0.0,6.0,
0.0,1.0,6.0,
1.0,1.0,4.0,
0.0,1.0,4.0,
0.0,1.0,6.0,
1.0,1.0,6.0,
1.0,1.0,4.0,
1.0,1.0,6.0,
0.0,1.0,6.0,
0.0,0.0,6.0,
1.0,0.0,6.0,
1.0,1.0,6.0,
1.0,1.0,4.0,
1.0,0.0,4.0,
0.0,0.0,4.0,
0.0,1.0,4.0,
1.0,1.0,4.0,
2.0,0.0,3.0,
2.0,0.0,0.0,
4.0,2.0,0.0,
4.0,2.0,3.0,
2.0,0.0,3.0,
4.5,-2.0,3.0,
4.5,-2.0,0.0,
2.0,0.0,0.0,
2.0,0.0,3.0,
4.5,-2.0,3.0,
4.5,-2.0,3.0,
-2.0,-2.0,3.0,
-2.0,-2.0,0.0,
4.5,-2.0,0.0,
4.5,-2.0,3.0,
-2.0,-2.0,3.0,
-2.0,2.0,3.0,
-2.0,2.0,0.0,
-2.0,-2.0,0.0,
-2.0,-2.0,3.0,
4.0,2.0,3.0,
4.0,2.0,0.0,
-2.0,2.0,0.0,
-2.0,2.0,3.0,
4.0,2.0,3.0,
2.0,0.0,3.0,
4.0,2.0,3.0,
-2.0,2.0,3.0,
-2.0,-2.0,3.0,
4.5,-2.0,3.0,
2.0,0.0,3.0,
2.0,0.0,0.0,
4.5,-2.0,0.0,
-2.0,-2.0,0.0,
-2.0,2.0,0.0,
4.0,2.0,0.0,
2.0,0.0,0.0
)));
 
-- SOLID with a hole 
-- etype = 1007 exterior solid
-- etype = 2007 is interior solid
-- All polygons of etype=2007 are described as 2003's.
insert into polygons3d values(14, 
SDO_Geometry (3008,NULL,NULL ,  
 SDO_Elem_Info_Array(1,1007,1,1,1006,7,1,1003,1,16,1003,1,31,1003,1,46,1003,1,61,1003,1,76,1003,1,94,1003,1,112,2006,6,112,2003,1,127,2003,1,142,2003,1,157,2003,1,172,2003,1,187,2003,1),  
 SDO_Ordinate_Array(2.0,0.0,3.0,
2.0,0.0,0.0,
4.0,2.0,0.0,
4.0,2.0,3.0,
2.0,0.0,3.0,
4.5,-2.0,3.0,
4.5,-2.0,0.0,
2.0,0.0,0.0,
2.0,0.0,3.0,
4.5,-2.0,3.0,
4.5,-2.0,3.0,
-2.0,-2.0,3.0,
-2.0,-2.0,0.0,
4.5,-2.0,0.0,
4.5,-2.0,3.0,
-2.0,-2.0,3.0,
-2.0,2.0,3.0,
-2.0,2.0,0.0,
-2.0,-2.0,0.0,
-2.0,-2.0,3.0,
4.0,2.0,3.0,
4.0,2.0,0.0,
-2.0,2.0,0.0,
-2.0,2.0,3.0,
4.0,2.0,3.0,
2.0,0.0,3.0,
4.0,2.0,3.0,
-2.0,2.0,3.0,
-2.0,-2.0,3.0,
4.5,-2.0,3.0,
2.0,0.0,3.0,
2.0,0.0,0.0,
4.5,-2.0,0.0,
-2.0,-2.0,0.0,
-2.0,2.0,0.0,
4.0,2.0,0.0,
2.0,0.0,0.0,
1.0,1.0,2.5,
-1.0,1.0,2.5,
-1.0,1.0,0.5,
1.0,1.0,0.5,
1.0,1.0,2.5,
-1.0,1.0,2.5,
-1.0,-1.0,2.5,
-1.0,-1.0,0.5,
-1.0,1.0,0.5,
-1.0,1.0,2.5,
-1.0,-1.0,2.5,
1.0,-1.0,2.5,
1.0,-1.0,0.5,
-1.0,-1.0,0.5,
-1.0,-1.0,2.5,
1.0,-1.0,2.5,
1.0,1.0,2.5,
1.0,1.0,0.5,
1.0,-1.0,0.5,
1.0,-1.0,2.5,
-1.0,-1.0,2.5,
-1.0,1.0,2.5,
1.0,1.0,2.5,
1.0,-1.0,2.5,
-1.0,-1.0,2.5,
1.0,1.0,0.5,
-1.0,1.0,0.5,
-1.0,-1.0,0.5,
1.0,-1.0,0.5,
1.0,1.0,0.5
)));
-- Gtype = SOLID
-- The elements make up one composite solid (non-disjoint solids) like a cube
-- on a cube on a cube.
-- This is made up of two solid elements.
-- Each solid element here is a simple solid.
insert into polygons3d values(15, 
SDO_Geometry (3008,NULL,NULL ,  
 SDO_Elem_Info_Array(1,1008,2,1,1007,1,1,1006,6,1,1003,1,16,1003,1,31,1003,1,46,1003,1,61,1003,1,76,1003,1,91,1007,1,91,1006,7,91,1003,1,106,1003,1,121,1003,1,136,1003,1,151,1003,1,166,1003,1,184,1003,1),  
 SDO_Ordinate_Array(-2.0,1.0,3.0,
-2.0,1.0,0.0,
-3.0,1.0,0.0,
-3.0,1.0,3.0,
-2.0,1.0,3.0,
-3.0,1.0,3.0,
-3.0,1.0,0.0,
-3.0,-1.0,0.0,
-3.0,-1.0,3.0,
-3.0,1.0,3.0,
-3.0,-1.0,3.0,
-3.0,-1.0,0.0,
-2.0,-1.0,0.0,
-2.0,-1.0,3.0,
-3.0,-1.0,3.0,
-2.0,-1.0,3.0,
-2.0,-1.0,0.0,
-2.0,1.0,0.0,
-2.0,1.0,3.0,
-2.0,-1.0,3.0,
-2.0,-1.0,3.0,
-2.0,1.0,3.0,
-3.0,1.0,3.0,
-3.0,-1.0,3.0,
-2.0,-1.0,3.0,
-2.0,1.0,0.0,
-2.0,-1.0,0.0,
-3.0,-1.0,0.0,
-3.0,1.0,0.0,
-2.0,1.0,0.0,
2.0,0.0,3.0,
2.0,0.0,0.0,
4.0,2.0,0.0,
4.0,2.0,3.0,
2.0,0.0,3.0,
4.5,-2.0,3.0,
4.5,-2.0,0.0,
2.0,0.0,0.0,
2.0,0.0,3.0,
4.5,-2.0,3.0,
4.5,-2.0,3.0,
-2.0,-2.0,3.0,
-2.0,-2.0,0.0,
4.5,-2.0,0.0,
4.5,-2.0,3.0,
-2.0,-2.0,3.0,
-2.0,2.0,3.0,
-2.0,2.0,0.0,
-2.0,-2.0,0.0,
-2.0,-2.0,3.0,
4.0,2.0,3.0,
4.0,2.0,0.0,
-2.0,2.0,0.0,
-2.0,2.0,3.0,
4.0,2.0,3.0,
2.0,0.0,3.0,
4.0,2.0,3.0,
-2.0,2.0,3.0,
-2.0,-2.0,3.0,
4.5,-2.0,3.0,
2.0,0.0,3.0,
2.0,0.0,0.0,
4.5,-2.0,0.0,
-2.0,-2.0,0.0,
-2.0,2.0,0.0,
4.0,2.0,0.0,
2.0,0.0,0.0
)));

例2-19 3次元ジオメトリのメタデータの更新と索引の作成

例2-19では、例2-18で作成した表(POINTS3D、LINES3DおよびPOLYGONS3D)に関する必要な情報を使用してUSER_SDO_GEOM_METADATAビューを更新し、各表のジオメトリ列(GEOMETRY)に空間索引を作成します。索引の作成にはPARAMETERS ('sdo_indx_dims=3')句を使用し、3次元ジオメトリをサポートする演算に3つの次元すべてが使用されるようにします。

INSERT INTO user_sdo_geom_metadata VALUES('POINTS3D', 'GEOMETRY',
  sdo_dim_array( sdo_dim_element('X', -100,100, 0.000005),
  sdo_dim_element('Y', -100,100, 0.000005),
  sdo_dim_element('Z', -100,100, 0.000005)), NULL);
 
CREATE INDEX points3d_sidx on points3d(geometry)
  INDEXTYPE IS mdsys.spatial_index_v2
  PARAMETERS ('sdo_indx_dims=3');
 
INSERT INTO user_sdo_geom_metadata VALUES('LINES3D', 'GEOMETRY',
  sdo_dim_array( sdo_dim_element('X', -100,100, 0.000005),
  sdo_dim_element('Y', -100,100, 0.000005),
  sdo_dim_element('Z', -100,100, 0.000005)), NULL);
 
CREATE INDEX lines3d_sidx on lines3d(geometry)
  INDEXTYPE IS mdsys.spatial_index_v2
  PARAMETERS ('sdo_indx_dims=3');
 
INSERT INTO user_sdo_geom_metadata VALUES('POLYGONS3D', 'GEOMETRY',
  sdo_dim_array( sdo_dim_element('X', -100,100, 0.000005),
  sdo_dim_element('Y', -100,100, 0.000005),
  sdo_dim_element('Z', -100,100, 0.000005)), NULL);
 
CREATE INDEX polygons3d_sidx on polygons3d(geometry)
  INDEXTYPE IS mdsys.spatial_index_v2
  PARAMETERS ('sdo_indx_dims=3');

2.8 ジオメトリのメタデータ・ビュー

次元、上限と下限および各次元の許容差を記述するジオメトリのメタデータは、MDSYSが所有するグローバル表に格納されます。ユーザーは、このグローバル表を直接更新しないでください。Spatial and Graphのユーザーは、ユーザーに関連付けられたスキーマで使用可能な次のビューを持っています。

  • USER_SDO_GEOM_METADATAには、ユーザーが所有するすべての空間表(スキーマ)についてのメタデータ情報が含まれます。このビューのみが更新可能であり、Spatial and Graphのユーザーは、空間表に関連するメタデータをこのビューに挿入する必要があります。

  • ALL_SDO_GEOM_METADATAには、ユーザーがSELECT権限を持つ、すべての空間表のメタデータ情報が含まれます。

これらのビューの移入は、Spatial and Graphのユーザーの責任において行います。各空間列について、USER_SDO_GEOM_METADATAビューに対応する行を挿入する必要があります。Oracle Spatial and Graphでは、ALL_SDO_GEOM_METADATAビューも更新され、USER_SDO_GEOM_METADATAに挿入した行が確実に反映されます。

各メタデータ・ビューは、次のとおり定義されています。

(
  TABLE_NAME   VARCHAR2(32),
  COLUMN_NAME  VARCHAR2(32),
  DIMINFO      SDO_DIM_ARRAY,
  SRID         NUMBER
);

また、ALL_SDO_GEOM_METADATAビューには、TABLE_NAMEで指定した表を所有するスキーマを識別するOWNER列があります。

次に、Oracle Spatial and Graphメタデータ・ビューに格納されるスキーマ名、表名、列名、索引名およびSDO_DIMNAME値に関する注意事項を示します。

  • これらは、文字、数字およびアンダースコアのみで構成する必要があります。たとえば、このような名前には、空白( )、アポストロフィ(')、引用符(")またはカンマ(,)を含めることはできません。

  • 名前がジオメトリのメタデータ・ビューに格納される前、または表がアクセスされる前に、名前に含まれるすべての文字が大文字に変換されます。表名で指定されるすべてのスキーマ名も、同様に変換されます。

    注意:

    引用符で囲まれた、大/小文字が混在する(キャメルケースの)名前を使用する場合、大/小文字の変換は適用されません。ただし、多くの専門家が大/小文字が混在する名前の使用を推奨していないことに注意してください。

トピック:

2.8.1 TABLE_NAME

TABLE_NAME列には、COLA_MARKETSなどのフィーチャ表の名前が含まれます。このフィーチャ表には、SDO_GEOMETRY型の列があります。

表名は、空間メタデータ・ビューにすべて大文字で格納されます。

表名をUSER_SDO_GEOM_METADATAビューに挿入する場合、空白または大/小文字が混在した文字列を引用符で囲んで指定することはできません。また、問合せで使用する場合は、(すべて大文字でないかぎり)引用符で囲むことはできません。

空間列に空間索引を作成する場合、空間フィーチャ表を索引構成表にすることはできません。

2.8.2 COLUMN_NAME

COLUMN_NAME列には、SDO_GEOMETRY型の列名が含まれます。COLA_MARKETS表の場合、この列をSHAPEといいます。

列名は、空間メタデータ・ビューにすべて大文字で格納されます。

列名は、USER_SDO_GEOM_METADATAビューに挿入する場合、空白または大/小文字が混在した文字列を引用符で囲んで指定することができません。また、問合せで使用する場合は、(すべて大文字でないかぎり)引用符で囲むことはできません。

2.8.3 DIMINFO

DIMINFO列は、オブジェクト型の可変長配列であり、次元によって指定され、次元ごとに1つのエントリがあります。SDO_DIM_ARRAY型は、次のとおり定義されます。

Create Type SDO_DIM_ARRAY as VARRAY(4) of SDO_DIM_ELEMENT; 

SDO_DIM_ELEMENT型は、次のとおり定義されます。

Create Type SDO_DIM_ELEMENT as OBJECT (
  SDO_DIMNAME VARCHAR2(64),
  SDO_LB NUMBER,
  SDO_UB NUMBER,
  SDO_TOLERANCE NUMBER);

n次元の場合、SDO_DIM_ARRAYインスタンスは、サイズがnのインスタンスです。DIMINFOには、2次元のジオメトリに対して2つ、3次元のジオメトリに対して3つ、4次元のジオメトリに対して4つのSDO_DIM_ELEMENTインスタンスが含まれます。配列の各SDO_DIM_ELEMENTインスタンスには、SDO_LB、SDO_UBおよびSDO_TOLERANCE属性に対する有効な(NULL以外の)値が必要です。

注意:

DIMINFO情報に反映される次元数は、レイヤー内の各ジオメトリ・オブジェクトの次元数に一致している必要があります。

許容差の説明および適切なSDO_TOLERANCE値の決定方法については、「許容差」(特に「レイヤーのジオメトリ・メタデータの許容差」)を参照してください。

Spatial and Graphでは、可変長配列は次元によって指定されるとみなされます。DIMINFO可変長配列は、SDO_ORDINATES可変長配列の点の縦座標と同じ方法で、次元によって指定される必要があります。たとえば、SDO_ORDINATES可変長配列に{X1, Y1, ..., Xn, Yn}が含まれる場合、最初のDIMINFOエントリはX次元を定義し、2番目のDIMINFOエントリはY次元を定義する必要があります。

「空間データの挿入、索引付けおよび問合せの例」では、SDO_GEOMETRY型とSDO_DIM_ARRAY型の使用方法を示しています。その例は、ジオメトリ・オブジェクト(コーラの仮想マーケット領域)の表現方法、およびCOLA_MARKETSフィーチャ表とUSER_SDO_GEOM_METADATAビューにそれらのオブジェクトのデータを移入する方法を示しています。

2.8.4 SRID

SRID列は、列にあるすべてのジオメトリに対する座標系のSRID値、またはジオメトリに座標系が関連付けられていない場合はNULLを含む必要があります。

2.9 その他の空間メタデータ・ビュー

Oracle Spatial and Graphでは、次のその他のメタデータ・ビューを使用します。

  • USER_SDO_3DTHEMESおよびALL_SDO_3DTHEMESには、3次元のテーマに関する情報が含まれます。

  • USER_SDO_SCENESおよびALL_SDO_SCENESには、シーンに関する情報が含まれます。

  • USER_SDO_VIEWFRAMESおよびALL_SDO_VIEWFRAMESには、ビューフレームに関する情報が含まれます。

USER_SDO_xxxビューには、ユーザー(スキーマ)が所有するオブジェクトに関するメタデータ情報が含まれ、ALL_SDO_xxxビューには、ユーザーがSELECT権限を持つオブジェクトに関するメタデータ情報が含まれます。

ALL_SDO_xxxビューには、オブジェクト所有者のスキーマを識別するOWNER列が含まれます。USER_SDO_xxxビューに、OWNER列は含まれません。

トピック:

2.9.1 xxx_SDO_3DTHEMESビュー

USER_SDO_3DTHEMESビューおよびALL_SDO_3DTHEMESビューには、表2-8に示す列があります。

表2-8 xxx_SDO_3DTHEMESビュー

列名 データ型 説明

OWNER

VARCHAR2(32)

テーマを所有するスキーマ(ALL_SDO_3DTHEMESのみ)

NAME

VARCHAR2(32)

テーマに関連付ける一意の名前

DESCRIPTION

VARCHAR2(4000)

テーマに関するオプションの記述テキスト

BASE_TABLE

VARCHAR2(64)

空間ジオメトリ列が含まれる表またはビュー

THEME_COLUMN

VARCHAR2(2048)

テーマ列の名前

STYLE_COLUMN

VARCHAR2(32)

スタイル列の名前

THEME_TYPE

VARCHAR2(32)

テーマのタイプ

DEFINITION

CLOB

テーマのXML定義

2.9.2 xxx_SDO_SCENESビュー

USER_SDO_SCENESビューおよびALL_SDO_SCENESビューには、表2-9に示す列があります。

表2-9 xxx_SDO_SCENESビュー

列名 データ型 説明

OWNER

VARCHAR2(32)

シーンを所有するスキーマ(ALL_SDO_SCENESのみ)

NAME

VARCHAR2(32)

シーンに関連付ける一意の名前

DESCRIPTION

VARCHAR2(4000)

シーンに関するオプションの説明テキスト

DEFINITION

CLOB

シーンのXML定義

2.9.3 xxx_SDO_VIEWFRAMESビュー

USER_SDO_VIEWFRAMESビューおよびALL_SDO_VIEWFRAMESビューには、表2-10に示す列があります。

表2-10 xxx_SDO_VIEWFRAMESビュー

列名 データ型 説明

OWNER

VARCHAR2(32)

シーンを所有するスキーマ(ALL_SDO_VIEWFRAMESのみ)

NAME

VARCHAR2(32)

ビューフレームに関連付ける一意の名前

DESCRIPTION

VARCHAR2(4000)

ビューフレームに関するオプションの説明テキスト

SCENE_NAME

VARCHAR2(32)

ビューフレームに関連付けられたシーンの名前

DEFINITION

CLOB

ビューフレームのXML定義

2.10 空間索引に関する構造

このトピックでは、空間索引データおよびメタデータを含む表の構造について説明します。

空間索引付けの概念および使用上の注意は、「空間データの索引付け」を参照してください。空間索引データおよびメタデータは、ともにSpatial and Graphの索引付けルーチンによって作成およびメンテナンスされる表に格納されています。これらの表は、(基になる)フィーチャ表の所有者のスキーマに作成され、フィーチャ表には、SDO_GEOMETRY型の列に作成された空間索引があります。

空間索引名には、「ジオメトリのメタデータ・ビュー」で説明している、空間表および空間列、またこれらを含むスキーマの名前と同じ制限と注意事項があります。

トピック:

2.10.1 空間索引ビュー

スキーマ(ユーザー)ごとに、xxx_SDO_INDEX_INFOとxxx_SDO_INDEX_METADATAという2つの空間索引メタデータ・ビューがあります。xxxはUSERまたはALLです。これらのビューは、ユーザーに対して読込み専用であり、空間索引付けルーチンによって作成およびメンテナンスされます。

トピック:

2.10.1.1 xxx_SDO_INDEX_INFOビュー

次のビューには、空間索引についての基本情報が含まれます。

  • USER_SDO_INDEX_INFOには、ユーザーが所有するすべての空間表の索引情報が含まれます。

  • ALL_SDO_INDEX_INFOには、ユーザーがSELECT権限を持つ、すべての空間表の索引情報が含まれます。

USER_SDO_INDEX_INFOビューおよびALL_SDO_INDEX_INFOビューには、表2-11に示すとおり、同じ列が含まれます。ただし、USER_SDO_INDEX_INFOビューには、SDO_INDEX_OWNER列は含まれません。列をビュー定義の順に示します。

表2-11 xxx_SDO_INDEX_INFOビューの列

列名 データ型 説明

SDO_INDEX_OWNER

VARCHAR2

索引の所有者です(ALL_SDO_INDEX_INFOビューのみ)。

INDEX_NAME

VARCHAR2

索引の名前。

TABLE_OWNER

VARCHAR2

この索引が作成された列を含む表の所有者の名前です。

TABLE_NAME

VARCHAR2

この索引が作成された列を含む表の名前です。

COLUMN_NAME

VARCHAR2

この索引が作成された列の名前です。

SDO_INDEX_TYPE

VARCHAR2

RTREEが含まれます(Rツリー索引の場合)。

SDO_INDEX_TABLE

VARCHAR2

空間索引表(「空間索引表の定義」を参照)の名前です。

SDO_INDEX_STATUS

VARCHAR2

(Oracleで使用するために予約されています。)

2.10.1.2 xxx_SDO_INDEX_METADATAビュー

次のビューには、空間索引メタデータについての詳細情報が含まれます。

  • USER_SDO_INDEX_METADATAには、ユーザーが所有するすべての空間表の索引情報が含まれます。

  • ALL_SDO_INDEX_METADATAには、ユーザーがSELECT権限を持つ、すべての空間表の索引情報が含まれます。

USER_SDO_INDEX_METADATAとALL_SDO_INDEX_METADATAビューには、表2-12に示す、同じ列が含まれます。列をビュー定義の順に示します。

表2-12 xxx_SDO_INDEX_METADATAビューの列

列名 データ型 説明

SDO_INDEX_OWNER

VARCHAR2

索引の所有者です。

SDO_INDEX_TYPE

VARCHAR2

RTREEが含まれます(Rツリー索引の場合)。

SDO_LEVEL

NUMBER

(該当なし、サポートされなくなった機能で使用。)

SDO_NUMTILES

NUMBER

(該当なし、サポートされなくなった機能で使用。)

SDO_MAXLEVEL

NUMBER

(該当なし、サポートされなくなった機能で使用。)

SDO_COMMIT_INTERVAL

NUMBER

(該当なし、サポートされなくなった機能で使用。)

SDO_INDEX_TABLE

VARCHAR2

空間索引表(「空間索引表の定義」を参照)の名前です。

SDO_INDEX_NAME

VARCHAR2

索引の名前。

SDO_INDEX_PRIMARY

NUMBER

1次索引か2次索引かを示します。1は1次索引、2は2次索引です。

SDO_TSNAME

VARCHAR2

SDO_INDEX_TABLEのスキーマ名です。

SDO_COLUMN_NAME

VARCHAR2

この索引が作成された列の名前です。

SDO_RTREE_HEIGHT

NUMBER

Rツリーの高さです。

SDO_RTREE_NUM_NODES

NUMBER

Rツリーのノード数です。

SDO_RTREE_DIMENSIONALITY

NUMBER

Spatial and Graphが内部的に使用する次元数です。これは、索引付けされる次元数(CREATE INDEX文またはALTER INDEX文のsdo_indx_dimsキーワードで制御され、このビューのSDO_INDEX_DIMS列に格納)とは異なる場合があります。たとえば、測地データの索引の場合、SDO_RTREE_DIMENSIONALITYの値は3ですが、SDO_INDEX_DIMSの値は2です。

SDO_RTREE_FANOUT

NUMBER

Rツリー・ノードにある子の最大数です。

SDO_RTREE_ROOT

VARCHAR2

索引表にあるRツリーのルート・ノードに対応するROWIDです。

SDO_RTREE_SEQ_NAME

VARCHAR2

Rツリーに関連付けられた順序名です。

SDO_FIXED_META

RAW

使用可能な場合、この列には固定レベル索引に対するSDO_GROUPCODEまたはSDO_CODEのメタデータ部分が含まれます。

SDO_TABLESPACE

VARCHAR2

SQLのCREATE TABLE文の場合と同様です。SDOINDEX表を作成するための表領域です。

SDO_INITIAL_EXTENT

VARCHAR2

SQLのCREATE TABLE文の場合と同様です。

SDO_NEXT_EXTENT

VARCHAR2

SQLのCREATE TABLE文の場合と同様です。

SDO_PCTINCREASE

NUMBER

SQLのCREATE TABLE文の場合と同様です。

SDO_MIN_EXTENTS

NUMBER

SQLのCREATE TABLE文の場合と同様です。

SDO_MAX_EXTENTS

NUMBER

SQLのCREATE TABLE文の場合と同様です。

SDO_INDEX_DIMS

NUMBER

この索引が構築された列内のジオメトリ・オブジェクトの次元数です。この値は、CREATE INDEX文またはALTER INDEX文のsdo_indx_dimsキーワードの値で決定されます。

SDO_LAYER_GTYPE

VARCHAR2

DEFAULT(レイヤーが点およびポリゴン・データの両方を含むことができる場合)または「SDO_GTYPE」表2-1の「ジオメトリ・タイプ」列に示す値が含まれます。

SDO_RTREE_PCTFREE

NUMBER

Rツリー索引の作成時は空にしておく、各索引ツリー・ノードのスロットの最小割合です。

SDO_INDEX_PARTITION

VARCHAR2

パーティション索引の場合は、索引パーティションの名前です。

SDO_PARTITIONED

NUMBER

索引がパーティション索引でない場合は0(ゼロ)、パーティション索引の場合は1が含まれます。

SDO_RTREE_QUALITY

NUMBER

索引の品質スコアです。Rツリーの品質については、「Rツリーの品質」を参照してください。

SDO_INDEX_VERSION

NUMBER

索引の内部バージョン番号です。

SDO_INDEX_GEODETIC

VARCHAR2

索引が測地索引の場合はTRUE、測地索引でない場合はFALSEです。

SDO_INDEX_STATUS

VARCHAR2

(Oracleで使用するために予約されています。)

SDO_NL_INDEX_TABLE

VARCHAR2

索引の非リーフ・ノードに対する個別の索引表の名前(名前の形式はMDNT_...$)です。詳細は、「空間データを索引付けするためのSQL文」CREATE INDEX文のsdo_non_leaf_tblパラメータの説明を参照してください。

SDO_DML_BATCH_SIZE

NUMBER

コミット操作後に、それぞれの更新バッチで処理する索引更新数です。詳細は、「空間データを索引付けするためのSQL文」CREATE INDEX文のsdo_dml_batch_sizeパラメータの説明を参照してください。

SDO_RTREE_EXT_XPND

NUMBER

(将来使用するために予約済)

SDO_NUM_ROWS

NUMBER

空間実表(この索引が作成された列を含む表)の(NULL以外のジオメトリを含む)行数です。

SDO_NUM_BLKS

NUMBER

空間索引表(SDO_INDEX_TABLE)内のブロックの数を指定します。

SDO_ROOT_MBR

SDO_GEOMETRY

空間レイヤーの最大エクステントに対する最小境界矩形です。これは、現在のエクステントのMBRに等しいかまたは大きくなります。索引が再構築されると、現在のエクステントを反映するように再設定されます。

2.10.2 空間索引表の定義

Rツリー索引の場合、空間索引表(「xxx_SDO_INDEX_METADATAビュー」に示すSDO_INDEX_TABLEの各エントリ)には、表2-13に示す列が含まれます。

表2-13 Rツリー空間索引データ表の列

列名 データ型 説明

NODE_ID

NUMBER

ツリーのこのノードに対する一意のID番号です。

NODE_LEVEL

NUMBER

ツリー内のノードのレベルです。リーフ・ノード(エントリが実表のデータ項目を指すノード)はレベル1、その親ノードはレベル2などのようになります。

INFO

BLOB

ノード内のその他の情報です。<child_mbr, child_rowid>のペア(fanoutの最大値、または各Rツリー・ノード内のペアの子の数)の配列が含まれます。ここで、child_rowidは子ノードのROWID、または実表のデータ項目のROWIDです。

2.10.3 Rツリー索引における順序オブジェクト

各Rツリー空間索引表は、それぞれ関連付けられた順序オブジェクト(「xxx_SDO_INDEX_METADATAビュー」に示すUSER_SDO_INDEX_METADATAビューのSDO_RTREE_SEQ_NAME列を参照)を持ちます。順序によって、複数の同時ユーザーによる索引の同時更新が可能になります。

順序名は、アンダースコアの前にある「T」「S」に置き換えた索引表名です。たとえば、索引表MDRT_5C01$は、順序オブジェクトMDRS_5C01$に関連付けられます。

2.11 測定単位のサポート

地理参照座標系(SDO_SRID値)が入力ジオメトリに関連付けられている場合、測定を伴うジオメトリ・ファンクションを使用すると、オプションのunitパラメータを使用して、特定の距離または面積の測定単位を指定できます。

unitパラメータは、SDO_SRID値がNULLであるジオメトリ(垂直デカルト・システム)には無効です。座標系のサポートについては、「座標系(空間参照システム)」を参照してください。

デフォルトの測定単位は、地理参照座標系に関連付けられた測定単位です。ほとんどの座標系の測定単位はmです。この場合、デフォルトの距離単位はmで、デフォルトの面積単位はm2です。ただし、unitパラメータを使用すると、アプリケーション・ユーザーにとってより有効な結果(レストランまでの距離のマイル表示など)をSpatialで自動的に換算し、戻すことができます。

unitパラメータは、文字列unit=およびSDO_UNITS_OF_MEASURE表(「SDO_UNITS_OF_MEASURE表」を参照)の有効なUNIT_OF_MEAS_NAME値を一重引用符で囲む必要があります。たとえば、次の例(「座標系変換の例」例6-17のデータおよび定義を使用)に示す'unit=KM'は、測定単位としてkmを指定しています。

SELECT c.name, SDO_GEOM.SDO_LENGTH(c.shape, m.diminfo, 'unit=KM')
  FROM cola_markets_cs c, user_sdo_geom_metadata m 
  WHERE m.table_name = 'COLA_MARKETS_CS' AND m.column_name = 'SHAPE';

Spatial and Graphでは、有効な単位名や、異なる単位間での比較や変換に使用する比率を決定するために、SDO_UNITS_OF_MEASURE表(「SDO_UNITS_OF_MEASURE表」を参照)内の情報が使用されます。また、次のレガシー・ビューを使用すると、メジャーの角度、面積および距離の単位を簡単に確認することもできます。

トピック:

2.11.1 ユーザー定義の測定単位の作成

Oracleから提供されている面積および距離の測定単位でニーズを十分に満たすことができない場合は、ユーザー定義の面積および距離の単位を作成できます。(ユーザー定義の角度の単位は作成できません。)ユーザー定義の測定単位を作成するには、DBAロールが付与されているユーザーとしてデータベースに接続し、SDO_UNITS_OF_MEASURE表に必要な単位ごとに1行挿入する必要があります(「SDO_UNITS_OF_MEASURE表」を参照)。

表2-14に、ユーザー定義の測定単位に対応する行を挿入する場合に使用するSDO_UNITS_OF_MEASURE表の列と、各列の要件および推奨値を示します。

表2-14 ユーザー定義の単位で使用するSDO_UNITS_OF_MEASURE表のエントリ

列名 説明

UOM_ID

任意の測定単位ID番号で、Oracle提供の単位または別のユーザー定義の単位で現在使用されていないIDです。例: 1000001

UNIT_OF_MEAS_NAME

ユーザー定義の測定単位の名前を指定します。例: HALF_METER

SHORT_NAME

測定単位の短縮名を指定します(オプションの短縮名がある場合)。

UNIT_OF_MEAS_TYPE

その単位が使用される測定の種類です。area (面積単位の場合)またはlength (距離単位の場合)のいずれかを指定する必要があります。

TARGET_UOM_ID

サポート用のオプションとして、面積単位の場合は10008 (10008はSQ_METERのUOM_ID)、距離単位の場合は10032 (10032はMETERのUOM_ID)を入力することをお薦めします。

FACTOR_B

浮動小数点数として表現できる値の場合は、ユーザー定義の1単位と等しい平方m (面積単位の場合)の数値またはm (距離単位の場合)の数値を指定します。たとえば、標準の1mの半分として定義された単位の場合は、.5を指定します。

単純な浮動小数点数として表現できない値の場合は、ユーザー定義の単位の1つと等しい平方mの数値(面積単位の場合)またはmの数値(距離単位の場合)を決定する式FACTOR_B/FACTOR_Cの被除数を指定します。

FACTOR_C

浮動小数点数として表現できる値の場合は、1を指定します。

単純な浮動小数点数として表現できない値の場合は、ユーザー定義の単位の1つと等しい平方mの数値(面積単位の場合)またはmの数値(距離単位の場合)を決定する式FACTOR_B/FACTOR_Cの除数を指定します。

INFORMATION_SOURCE

USER_DEFINEDを指定します。

DATA_SOURCE

単位を説明する短い文です。例: User-defined half meter

IS_LEGACY

FALSEを指定します。

LEGACY_CODE

(ユーザー定義の単位には使用しないでください。)

例2-20では、HALF_METERという名前のユーザー定義の距離単位を作成し、作成した単位を問合せで使用して、指定した店舗の400,000半メートル(200km)以内に居住するすべての顧客を検索します。

例2-20 ユーザー定義の測定単位の作成および使用

-- Distance unit: HALF_METER
-- FACTOR_B specifies how many meters = one of this unit.

INSERT INTO MDSYS.SDO_UNITS_OF_MEASURE
  (UOM_ID, UNIT_OF_MEAS_NAME, UNIT_OF_MEAS_TYPE, TARGET_UOM_ID,
   FACTOR_B, FACTOR_C, INFORMATION_SOURCE, DATA_SOURCE, IS_LEGACY)
VALUES
  (100001, 'HALF_METER', 'length', 100001,
   .5, 1, 'User-defined half meter', 'USER_DEFINED', 'FALSE');
 
. . .
-- Find all the customers within 400,000 half-meters of store_id = 101
SELECT /*+ordered*/
    c.customer_id,
    c.first_name,
    c.last_name
FROM stores s,
    customers c
WHERE s.store_id = 101
AND sdo_within_distance (c.cust_geo_location,
    s.store_geo_location,
    'distance = 400000 unit = HALF_METER') = 'TRUE';
 
CUSTOMER_ID FIRST_NAME                     LAST_NAME                           
----------- ------------------------------ ------------------------------      
       1005 Carla                          Rodriguez                           
       1004 Thomas                         Williams                            
       1003 Marian                         Chang                               
       1001 Alexandra                      Nichols