2.7 ジオメトリの例

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

2.7.1 矩形

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

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

  • SDO_GTYPE = SDO_POLYGON2D。これは、2次元のポリゴンを示します。

  • 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-8に、図2-3のジオメトリをデータベースに挿入するSQL文を示します。

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

INSERT INTO cola_markets VALUES(
  1,
  'cola_a',
  SDO_GEOMETRY(
    SDO_POLYGON2D,  -- 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 = SDO_POLYGON2D。これは、2次元のポリゴンを示します。

  • 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-9 穴のあるポリゴンを挿入するSQL文

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

INSERT INTO cola_markets VALUES(
  10,
  'polygon_with_hole',
  SDO_GEOMETRY(
    SDO_POLYGON2D,  -- 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 = SDO_CURVE2D。1つ目は、2次元の線セグメントを示します。

  • 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-10に、図2-5のジオメトリをデータベースに挿入するSQL文を示します。

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

INSERT INTO cola_markets VALUES(
  11,
  'compound_line_string',
  SDO_GEOMETRY(
    SDO_CURVE2D,
    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 = SDO_POLYGON2D。これは、2次元のポリゴンを示します。

  • 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-11に、図2-6のジオメトリをデータベースに挿入するSQL文を示します。

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

INSERT INTO cola_markets VALUES(
  12,
  'compound_polygon',
  SDO_GEOMETRY(
    SDO_POLYGON2D,  -- 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 = SDO_POINT2D。これは、2次元の単一点を示します。

  • 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-12に、図2-7のジオメトリをデータベースに挿入するSQL文を示します。

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

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

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

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

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 = SDO_POINT2D。これは、2次元の単一点を示します。

  • 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-14に、図2-8のジオメトリをデータベースに挿入するSQL文を示します。

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

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

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

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

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

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

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

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

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

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

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

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

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

-- Oriented multipoint: 2 points, different orientations
INSERT INTO cola_markets VALUES(
  92,
  'oriented_multipoint',
  SDO_GEOMETRY(
    SDO_MULTIPOINT2D, -- 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でサポートされないジオメトリ・タイプ(曲線やスプラインなど)をモデル化するために使用します。タイプ0(ゼロ)要素のSDO_ETYPE値は0(ゼロ)です。(SDO_ETYPEについては、「SDO_ELEM_INFO」を参照。)タイプ0 (ゼロ)要素は、Oracle Spatialでは索引付けされず、空間ファンクションおよび空間プロシージャでは無視されます。

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

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

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

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

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

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

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

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

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

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

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

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

INSERT INTO cola_markets VALUES(
  13,
  'type_zero_element_geom',
  SDO_GEOMETRY(
    SDO_POLYGON2D,  -- 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でのNURBS曲線のサポートを参照してください。

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

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

  • SDO_GTYPE = SDO_CURVE2D。これは、2次元の単一線ストリングを示します。

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

  • SDO_POINT = NULL。

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

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

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

CREATE TABLE nurbs_test (gid  integer, geom sdo_geometry);
 
INSERT INTO nurbs_test values(
  1,
  SDO_GEOMETRY(
    SDO_CURVE2D,
    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-18 NURBS複合曲線ジオメトリを挿入するSQL文

例2-18に、NURBSセグメントを持つ複合曲線ジオメトリの挿入を示します。例2-17で作成したのと同じNURBS_TEST表を使用します。

INSERT INTO nurbs_test VALUES(
  1, 
  SDO_GEOMETRY(SDO_CURVE2D, 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-18に示すジオメトリのSDO_GEOMETRY定義は、次のとおりです。

  • SDO_GTYPE = SDO_CURVE2D。これは、2次元の単一線ストリングを示します。

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

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

CREATE TABLE t1 (
  i NUMBER,
  d VARCHAR2(50),
  g SDO_GEOMETRY
);
INSERT INTO t1 (i, d, g)
VALUES (
  1,
  'Point',
  sdo_geometry (SDO_POINT2D, 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 (SDO_LINESTRING2D, 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 (SDO_LINESTRING2D, 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 (SDO_LINESTRING2D, 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 (SDO_LINESTRING2D, 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 (SDO_LINESTRING2D, 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 (SDO_LINESTRING2D, 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 (SDO_LINESTRING2D, 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 (SDO_LINESTRING2D, 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 (SDO_LINESTRING2D, 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 (SDO_POLYGON2D, 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 (SDO_POLYGON2D, 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 (SDO_POLYGON2D, 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 (SDO_POLYGON2D, 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 (SDO_POLYGON2D, 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 (SDO_MULTIPOINT2D, 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 (SDO_MULTIPOINT2D, 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 (SDO_MULTICURVE2D, 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 (SDO_MULTICURVE2D, 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 (SDO_MULTICURVE2D, 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 (SDO_MULTICURVE2D, 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 (SDO_MULTICURVE2D, 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 (SDO_MULTIPOLYGON2D, 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 (SDO_MULTIPOLYGON2D, 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 (SDO_MULTIPOLYGON2D, 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 (SDO_MULTIPOLYGON2D, 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 (SDO_POLYGON2D, 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 (SDO_POLYGON2D, 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 (SDO_POLYGON2D, 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 (SDO_POLYGON2D, 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 (SDO_COLLECTION2D, 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 (SDO_MULTIPOLYGON2D, 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次元のジオメトリ・タイプ

ノート:

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

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

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

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

create table points3d(id number, geometry sdo_geometry);
insert into points3d values(1, sdo_geometry(SDO_POINT3D,null,
             sdo_point_type(0,0,0), null, null));
insert into points3d values(2, sdo_geometry(SDO_POINT3D,null,
             sdo_point_type(1,1,1), null, null));
insert into points3d values(3, sdo_geometry(SDO_POINT3D,null,
             sdo_point_type(0,1,1), null, null));
insert into points3d values(4, sdo_geometry(SDO_POINT3D,null,
             sdo_point_type(0,0,1), null, null));
insert into points3d values(5, sdo_geometry(SDO_POINT3D,null,
             sdo_point_type(1,1,0), null, null));
insert into points3d values(6, sdo_geometry(SDO_POINT3D,null,
             sdo_point_type(1,0,1), null, null));
insert into points3d values(7, sdo_geometry(SDO_POINT3D,null,
             sdo_point_type(1,0,0), null, null));
insert into points3d values(8, sdo_geometry(SDO_POINT3D,null,
             sdo_point_type(0,1,0), null, null));
insert into points3d values(9, sdo_geometry(SDO_MULTIPOINT3D,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(SDO_LINESTRING3D,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(SDO_LINESTRING3D,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(SDO_LINESTRING3D,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(SDO_LINESTRING3D,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(SDO_LINESTRING3D,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 (SDO_POLYGON3D,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 (SDO_POLYGON3D,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 (SDO_MULTIPOLYGON3D,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 (SDO_POLYGON3D,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 (SDO_POLYGON3D,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(SDO_POLYGON3D,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 (SDO_POLYGON3D,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 (SDO_POLYGON3D,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 (SDO_POLYGON3D,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 (SDO_POLYGON3D,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-21 3次元ジオメトリのメタデータの更新と索引の作成

例2-21では、例2-20で作成した表(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');