ヘッダーをスキップ
Oracle Spatial開発者ガイド
11g リリース1(11.1)
E05682-03
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

19 空間演算子

この章では、空間オブジェクト・データ型で使用できる演算子について説明します。空間プロシージャと空間ファンクションとの違いなど、空間演算子の概要については、1.9項を参照してください。表19-1に、主な演算子を示します。

表19-1 主な空間演算子

演算子 説明

SDO_FILTER


指定されたジオメトリと相互作用するジオメトリを特定します。

SDO_JOIN


位相関係に基づいて空間結合を実行します。

SDO_NN


最も近くにあるジオメトリを特定します。

SDO_NN_DISTANCE


SDO_NN演算子によって戻されたオブジェクトの距離を戻します。

SDO_RELATE


2つのジオメトリが指定された方法で相互作用しているかどうかを判断します。(特定のマスク値操作用の簡易形式の代替演算子については、表19-2を参照してください。)

SDO_WITHIN_DISTANCE


2つのジオメトリ間の距離が、指定された距離内にあるかどうかを判断します。


表19-2に、特定のマスク・タイプのSDO_RELATE操作を実行する簡易形式の演算子を示します。

表19-2 SDO_RELATE操作用の簡易演算子

演算子 説明

SDO_ANYINTERACT


表内のジオメトリに、特定のジオメトリとのANYINTERACT位相関係があるかどうかを確認します。

SDO_CONTAINS


表内のジオメトリに、特定のジオメトリとのCONTAINS位相関係があるかどうかを確認します。

SDO_COVEREDBY


表内のジオメトリに、特定のジオメトリとのCOVEREDBY位相関係があるかどうかを確認します。

SDO_COVERS


表内のジオメトリに、特定のジオメトリとのCOVERS位相関係があるかどうかを確認します。

SDO_EQUAL


表内のジオメトリに、特定のジオメトリとのEQUAL位相関係があるかどうかを確認します。

SDO_INSIDE


表内のジオメトリに、特定のジオメトリとのINSIDE位相関係があるかどうかを確認します。

SDO_ON


表内のジオメトリに、特定のジオメトリとのON位相関係があるかどうかを確認します。

SDO_OVERLAPBDYDISJOINT


表内のジオメトリに、特定のジオメトリとのOVERLAPBDYDISJOINT位相関係があるかどうかを確認します。

SDO_OVERLAPBDYINTERSECT


表内のジオメトリに、特定のジオメトリとのOVERLAPBDYINTERSECT位相関係があるかどうかを確認します。

SDO_OVERLAPS


表内のジオメトリが特定のジオメトリと重なっているかどうか(OVERLAPBDYDISJOINTまたはOVERLAPBDYINTERSECT位相関係があるかどうか)を確認します。

SDO_TOUCH


表内のジオメトリに、特定のジオメトリとのTOUCH位相関係があるかどうかを確認します。


この章では、これらの演算子のリファレンス情報をアルファベット順に説明します。

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


SDO_ANYINTERACT

構文

SDO_ANYINTERACT(geometry1, geometry2);

説明

表内のジオメトリに、特定のジオメトリとのANYINTERACT位相関係があるかどうかを確認します。SDO_RELATE演算子に'mask=ANYINTERACT'を含めて指定する場合と同じです。

この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。

キーワードおよびパラメータ

説明
geometry1 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。
geometry2 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。

戻り値

式SDO_ANYINTERACT(geometry1,geometry2) = 'TRUE'は、ANYINTERACT位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。

使用上の注意

この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。

位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。

空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。

次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)とANYINTERACT関係を持つジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)

SELECT c.mkt_id, c.name
  FROM cola_markets c
  WHERE SDO_ANYINTERACT(c.shape,
            SDO_GEOMETRY(2003, NULL, NULL,
              SDO_ELEM_INFO_ARRAY(1,1003,3),
              SDO_ORDINATE_ARRAY(4,6, 8,8))
            ) = 'TRUE';

    MKT_ID NAME
---------- --------------------------------
         2 cola_b
         1 cola_a
         4 cola_d

SDO_CONTAINS

構文

SDO_CONTAINS(geometry1, geometry2);

説明

表内のジオメトリに、特定のジオメトリとのCONTAINS位相関係があるかどうかを確認します。SDO_RELATE演算子に'mask=CONTAINS'を含めて指定する場合と同じです。

この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。

キーワードおよびパラメータ

説明
geometry1 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。
geometry2 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。

戻り値

式SDO_CONTAINS(geometry1,geometry2) = 'TRUE'は、CONTAINS位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。

使用上の注意

この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。

位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。

空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。

次の例では、問合せウィンドウ(ここでは、左下の座標が(2,2)、右上の座標が(4,6)の矩形)とCONTAINS関係を持つジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)この例では、cola_aのみが問合せウィンドウ・ジオメトリを含んでいます。

SELECT c.mkt_id, c.name
  FROM cola_markets c
  WHERE SDO_CONTAINS(c.shape,
            SDO_GEOMETRY(2003, NULL, NULL,
              SDO_ELEM_INFO_ARRAY(1,1003,3),
              SDO_ORDINATE_ARRAY(2,2, 4,6))
            ) = 'TRUE';

    MKT_ID NAME
---------- --------------------------------
         1 cola_a

SDO_COVEREDBY

構文

SDO_COVEREDBY(geometry1, geometry2);

説明

表内のジオメトリに、特定のジオメトリとのCOVEREDBY位相関係があるかどうかを確認します。SDO_RELATE演算子に'mask=COVEREDBY'を含めて指定する場合と同じです。

この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。

キーワードおよびパラメータ

説明
geometry1 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。
geometry2 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。

戻り値

式SDO_COVEREDBY(geometry1,geometry2) = 'TRUE'は、COVEREDBY位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。

使用上の注意

この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。

位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。

空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。

次の例では、問合せウィンドウ(ここでは、左下の座標が(1,1)、右上の座標が(5,8)の矩形)とCOVEREDBY関係を持つジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)この例では、cola_aのみが問合せウィンドウ・ジオメトリに覆われています。

SELECT c.mkt_id, c.name
  FROM cola_markets c
  WHERE SDO_COVEREDBY(c.shape,
            SDO_GEOMETRY(2003, NULL, NULL,
              SDO_ELEM_INFO_ARRAY(1,1003,3),
              SDO_ORDINATE_ARRAY(1,1, 5,8))
            ) = 'TRUE';

    MKT_ID NAME
---------- --------------------------------
         1 cola_a

SDO_COVERS

構文

SDO_COVERS(geometry1, geometry2);

説明

表内のジオメトリに、特定のジオメトリとのCOVERS位相関係があるかどうかを確認します。SDO_RELATE演算子に'mask=COVERS'を含めて指定する場合と同じです。

この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。

キーワードおよびパラメータ

説明
geometry1 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。
geometry2 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。

戻り値

式SDO_COVERS(geometry1,geometry2) = 'TRUE'は、COVERS位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。

使用上の注意

この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。

位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。

空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。

次の例では、問合せウィンドウ(ここでは、左下の座標が(1,1)、右上の座標が(4,6)の矩形)とCOVERS関係を持つジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)この例では、cola_aのみが問合せウィンドウ・ジオメトリを覆っています。

SELECT c.mkt_id, c.name
  FROM cola_markets c
  WHERE SDO_COVERS(c.shape,
            SDO_GEOMETRY(2003, NULL, NULL,
              SDO_ELEM_INFO_ARRAY(1,1003,3),
              SDO_ORDINATE_ARRAY(1,1, 4,6))
            ) = 'TRUE';

    MKT_ID NAME
---------- --------------------------------
         1 cola_a

SDO_EQUAL

構文

SDO_EQUAL(geometry1, geometry2);

説明

表内のジオメトリに、特定のジオメトリとのEQUAL位相関係があるかどうかを確認します。SDO_RELATE演算子に'mask=EQUAL'を含めて指定する場合と同じです。

この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。

キーワードおよびパラメータ

説明
geometry1 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。
geometry2 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。

戻り値

式SDO_EQUAL(geometry1,geometry2) = 'TRUE'は、EQUAL位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。

使用上の注意

この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。

位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。

空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。

次の例では、問合せウィンドウ(ここでは、左下の座標が(1,1)、右上の座標が(5,7)の矩形)とEQUAL関係を持つジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)この例では、cola_aのみが問合せウィンドウ・ジオメトリと同じ境界と内部を持っています。

SELECT c.mkt_id, c.name
  FROM cola_markets c
  WHERE SDO_EQUAL(c.shape,
            SDO_GEOMETRY(2003, NULL, NULL,
              SDO_ELEM_INFO_ARRAY(1,1003,3),
              SDO_ORDINATE_ARRAY(1,1, 5,7))
            ) = 'TRUE';

    MKT_ID NAME
---------- --------------------------------
         1 cola_a

SDO_FILTER

構文

SDO_FILTER(geometry1, geometry2, param);

説明

空間索引を使用して、指定されたオブジェクト(対象領域など)と空間的に作用するオブジェクトの集合を識別したり、指定した2つのオブジェクトが相互作用するかどうかを判別します。非接続でないオブジェクトは、空間的に相互作用します。

この演算子は、1次フィルタ処理のみ実行します。SDO_RELATE演算子によって実行される2次フィルタ処理によって、オブジェクトが空間的に相互作用するかどうかを特定できます。

キーワードおよびパラメータ

説明
geometry1 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。
geometry2 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。
param オプションで、min_resolutionキーワードまたはmax_resolutionキーワード(あるいはその両方)を指定します。データ型はVARCHAR2です。

min_resolutionキーワードに含まれるのは、ジオメトリのMBRのうち少なくとも1つの辺が指定値以上のジオメトリのみです。たとえば、min_resolution=10キーワードに含まれるのは、ジオメトリのMBRの幅または高さ(あるいはその両方)が10以上であるジオメトリのみです。(このキーワードは対象として過小なジオメトリを除外するために使用できます。)

max_resolutionキーワードに含まれるのは、ジオメトリのMBRのうち少なくとも1つの辺が指定値以下のジオメトリのみです。たとえば、max_resolution=10キーワードに含まれるのは、ジオメトリのMBRの幅または高さ(あるいはその両方)が10以下であるジオメトリのみです。(このキーワードは対象として過大なジオメトリを除外するために使用できます。)


戻り値

式SDO_FILTER(geometry1,geometry2) = 'TRUE'は、非接続以外のオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。

使用上の注意

SDO_FILTER演算子は、常にWHERE句で使用される必要があり、この演算子を含む条件式は、SDO_FILTER(arg1, arg2) = 'TRUE'形式である必要があります。

geometry2は表から取り出されるか、または一時的なSDO_GEOMETRYオブジェクト(バインド変数、SDO_GEOMETRYコンストラクタなど)となります。

geometry1およびgeometry2が異なる座標系に基づいている場合、geometry2は、6.10.1項で説明するとおり、操作を実行するため一時的にgeometry1の座標系に変換されます。


RLSの制限事項:

ファイングレイン・アクセス制御ポリシーの表またはビューへの追加に、DBMS_RLS.ADD_POLICYプロシージャが使用されていて、指定されたポリシー・ファンクションが空間演算子を使用する場合、その演算子はSDO_FILTERである必要があります。このコンテキストでは、他の空間演算子はサポートされていません。

空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。

次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)と相互作用するジオメトリを選択します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)

SELECT c.mkt_id, c.name
  FROM cola_markets c
  WHERE SDO_FILTER(c.shape,
    SDO_GEOMETRY(2003, NULL, NULL,
      SDO_ELEM_INFO_ARRAY(1,1003,3),
      SDO_ORDINATE_ARRAY(4,6, 8,8))
    ) = 'TRUE';

    MKT_ID NAME
---------- --------------------------------
         2 cola_b
         1 cola_a
         4 cola_d

次の例は前述の例と同じですが、ジオメトリのMBRのうち少なくとも1つの辺が4.1以上のジオメトリのみを含む、という点で異なります。この場合、cola_aおよびcola_bのみが戻されます。これは、これらのMBRには4.1以上の長さを持つ辺が少なくとも1つあるためです。円cola_dは、そのMBRの各辺の長さが4の四角形であるため、除外されます。

SELECT c.mkt_id, c.name
  FROM cola_markets c
  WHERE SDO_FILTER(c.shape,
    SDO_GEOMETRY(2003, NULL, NULL,
      SDO_ELEM_INFO_ARRAY(1,1003,3),
      SDO_ORDINATE_ARRAY(4,6, 8,8)),
    'min_resolution=4.1'
    ) = 'TRUE';

    MKT_ID NAME
---------- --------------------------------
         2 cola_b
         1 cola_a

次の例では、GEOMETRY列のオブジェクトが、GIDに1の値を持つQUERY_POLYS表のGEOMETRY列オブジェクトと空間的に相互作用する場合に、POLYGONS表からGIDの値を検索します。

SELECT A.gid
  FROM Polygons A, query_polys B
  WHERE B.gid = 1
  AND SDO_FILTER(A.Geometry, B.Geometry) = 'TRUE';

次の例では、GEOMETRY列オブジェクトが、aGeom変数に格納されているジオメトリと空間的に相互作用する場合に、POLYGONS表からGIDの値を検索します。

Select A.Gid
  FROM Polygons A
  WHERE SDO_FILTER(A.Geometry, :aGeom) = 'TRUE';

次の例では、GEOMETRY列オブジェクトが、左下の座標に(x1,y1)、右上の座標に(x2, y2)を持つ、指定した矩形と空間的に相互作用する場合に、POLYGONS表からGIDの値を検索します。

Select A.Gid
  FROM Polygons A
  WHERE SDO_FILTER(A.Geometry, sdo_geometry(2003,NULL,NULL,
                                   sdo_elem_info_array(1,1003,3),
                                   sdo_ordinate_array(x1,y1,x2,y2))
                   ) = 'TRUE';

次の例では、GEOMETRY列オブジェクトが、QUERY_POLYS表のGEOMETRY列オブジェクトに格納されているジオメトリと空間的に相互作用する場合に、POLYGONS表からGIDの値を検索します。この例では、ORDEREDオプティマイザ・ヒントを使用し、FROM句の最初にQUERY_POLYS(geometry2)表を指定します。これは、geometry2の複数のジオメトリが含まれるためです(「使用上の注意」を参照)。

SELECT /*+ ORDERED */
  A.gid
  FROM query_polys B, polygons A
  WHERE SDO_FILTER(A.Geometry, B.Geometry) = 'TRUE';

関連項目


SDO_INSIDE

構文

SDO_INSIDE(geometry1, geometry2);

説明

表内のジオメトリに、特定のジオメトリとのINSIDE位相関係があるかどうかを確認します。SDO_RELATE演算子に'mask=INSIDE'を含めて指定する場合と同じです。

この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。

キーワードおよびパラメータ

説明
geometry1 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。
geometry2 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。

戻り値

式SDO_INSIDE(geometry1,geometry2) = 'TRUE'は、INSIDE位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。

使用上の注意

この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。

位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。

空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。

次の例では、問合せウィンドウ(ここでは、左下の座標が(5,6)、右上の座標が(12,12)の矩形)とINSIDE関係を持つジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)この例では、cola_d(円)のみが問合せウィンドウ・ジオメトリの内部にあります。

SELECT c.mkt_id, c.name
  FROM cola_markets c
  WHERE SDO_INSIDE(c.shape,
            SDO_GEOMETRY(2003, NULL, NULL,
              SDO_ELEM_INFO_ARRAY(1,1003,3),
              SDO_ORDINATE_ARRAY(5,6, 12,12))
            ) = 'TRUE';

    MKT_ID NAME
---------- --------------------------------
         4 cola_d

SDO_JOIN

構文

SDO_JOIN(table_name1, column_name1, table_name2, column_name2, params, preserve_join_order, table1_partition, table2_partition) RETURN SDO_ROWIDSET;

説明

位相関係に基づいて空間結合を実行します。

キーワードおよびパラメータ

説明
table_name1 空間結合操作で使用される最初の表の名前を指定します。この表には、SDO_GEOMETRY型の列が含まれている必要があります。データ型はVARCHAR2です。
column_name1 table_name1内のSDO_GEOMETRY型の空間列の名前を指定します。空間Rツリー索引は、この列に定義する必要があります。データ型はVARCHAR2です。
table_name2 空間結合操作で使用される2つ目の表の名前を指定します。(table_name1と同じでも異なるものでもかまいません。table_name2table_name1と同じ場合は、この項の「自己結合の最適化」を参照してください。)この表には、SDO_GEOMETRY型の列が含まれている必要があります。データ型はVARCHAR2です。
column_name2 table_name2内のSDO_GEOMETRY型の空間列の名前を指定します。空間Rツリー索引は、この列に定義する必要があります。データ型はVARCHAR2です。
params キーワードおよび値のオプションのパラメータ文字列です。mask=ANYINTERACTの場合にのみ使用できます。演算子の処理を指定します。使用可能なキーワードについては、「使用上の注意」の表19-3を参照してください。データ型はVARCHAR2です。デフォルトはNULLです。
preserve_join_order 演算子の処理中に結合順序が保持されることが保証されている場合に指定するオプションのパラメータです。この値が0(デフォルト)の場合、表の順序は変更される場合があります。1の場合、表の順序は変更されません。データ型はNUMBERです。デフォルトは0です。
table1_partition table_name1のローカル・パーティション空間索引の名前を指定します。表にパーティション空間索引がある場合は指定する必要があります。表にパーティション空間索引がない場合はNULLである必要があります。(パーティション空間索引の使用については、5.1.3項を参照してください。)データ型はVARCHAR2です。デフォルトはNULLです。
table2_partition table_name2のローカル・パーティション空間索引の名前を指定します。表にパーティション空間索引がある場合は指定する必要があります。表にパーティション空間索引がない場合はNULLである必要があります。(パーティション空間索引の使用については、5.1.3項を参照してください。)データ型はVARCHAR2です。デフォルトはNULLです。

戻り値

SDO_JOINは、SDO_ROWIDSETのオブジェクトを戻します。このオブジェクトは、SDO_ROWIDPAIRのオブジェクトの表で構成されます。Oracle Spatialは、SDO_ROWIDSETデータ型を次のとおり定義します。

CREATE TYPE sdo_rowidset as TABLE OF sdo_rowidpair;

また、SDO_ROWIDPAIRオブジェクト型を次のとおり定義します。

CREATE TYPE sdo_rowidpair AS OBJECT
   (rowid1  VARCHAR2(24),
    rowid2  VARCHAR2(24));

SDO_ROWIDPAIRの定義では、rowid1table_name1のROWIDを示し、rowid2table_name2のROWIDを示します。

使用上の注意

厳密には、SDO_JOINは演算子ではなくテーブル・ファンクションです。(テーブル・ファンクションについては、『Oracle Database PL/SQL言語リファレンス』を参照してください。)ただし、使用方法が演算子に類似し、他のファンクションおよびプロシージャと同じパッケージに同梱されていないため、空間演算子の章で説明しています。

このテーブル・ファンクションは、全表結合を実行する必要がある場合に使用することをお薦めします。

column_name1およびcolumn_name2内のジオメトリのSRID(座標系)値および次元数は、すべて同じである必要があります。

パフォーマンスを向上させるには、/*+ ORDERED */オプティマイザ・ヒントを使用し、FROM句の最初にSDO_JOINテーブル・ファンクションを指定します。

表がバージョン対応(Workspace Manager機能を使用)である場合は、Workspace Managerにより作成された<table_name>_LT表を指定する必要があります。たとえば、COLA_MARKETS表がバージョン対応の場合、その表で空間結合の操作を行うには、SDO_JOINテーブル・ファンクションを使用して、COLA_MARKETS_LT(COLA_MARKETSではなく)を指定します。(ただし、その他すべてのSpatialのファンクション、プロシージャおよび演算子には、<table_name>_LT名は使用できません。)

表19-3に、paramsパラメータのキーワードを示します。

表19-3 SDO_JOIN演算子のparamsキーワード

キーワード 説明

mask

空間結合の位相関係を指定します。有効な値は、'mask=<value>'です。<value>は、SDO_RELATE演算子に有効な1つ以上のマスク値(TOUCHOVERLAPBDYDISJOINTOVERLAPBDYINTERSECTEQUALINSIDECOVEREDBYCONTAINSCOVERSANYINTERACTON)か、またはMBR(フィルタレベルの近似処理)が交差するかどうかを確認するFILTERです。論理ブール演算子ORを使用して、'mask=inside+touch'のように複数のマスクを組み合せることができますが、FILTERは他のマスクと組み合せることはできません。

このパラメータがNULLであるか、または空の文字列を含む場合、mask=FILTERであるとみなされます。

distance

関係チェックが実行される前に許容差に追加される距離値を数値で指定します(1.5.5項を参照)。たとえば、許容差が10mのときに'distance=100 unit=meter'を指定した場合、2つのオブジェクトが互いに110m以内にある場合は空間的に相互作用するとみなされます。distanceを指定してunitを指定しない場合、データに関連付けられた測定単位が使用されます。

unit

距離値に関連付ける測定単位を指定します('distance=100 unit=meter'など)。測定単位の指定の詳細は、2.10項を参照してください。unitを指定した場合、distanceも指定する必要があります。データ型はVARCHAR2です。デフォルトは、データに関連付けられた測定単位です。測地データの場合、デフォルトはmです。


空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。

自己結合の最適化

自己結合(table_name1およびtable_name2が同じ表を指定)を実行する場合、自己結合を最適化することでパフォーマンスを向上できます。

マスク(ANYINTERACTなど)または距離を指定せずにSDO_JOINをコールすると、結合される2つのジオメトリ列の索引構造のみが比較されます。これで、相互に作用するジオメトリのペアを簡単に識別することができます。マスクまたは距離を指定してSDO_JOINをコールすると、相互に作用するジオメトリのペアを識別するために索引が使用された後、ジオメトリのペアが実際に相互作用しているかどうかを確認するためにジオメトリの座標も比較されます。座標の比較は、SDO_JOINの操作で最もコストの高い動作になります。

同じジオメトリ列をそれ自身と比較する自己結合では、各ジオメトリ・ペアが結果セットで2回戻されます。次に例を示します。

自己結合でSDO_JOINをコールする場合、ジオメトリ・ペアの重複する比較や、ペアのID値が同じ座標の比較を行わないことで、このような不要な動作を回避できます。この最適化は、1次フィルタに対してのみSDO_JOINを使用し、SDO_GEOM.RELATEファンクションをコールしてジオメトリ座標を比較します。次の文では、WHERE句の条件としてAND b.rowid < c.rowidを追加することで最適化を行っています。

SQL> set autotrace trace explain
SQL> SELECT /*+ ordered use_nl (a,b) use_nl (a,c) */ b.id, c.id
           FROM TABLE(sdo_join('GEOD_STATES','GEOM','GEOD_STATES','GEOM')) a,
                       GEOD_STATES b,
                       GEOD_STATES c
          WHERE a.rowid1 = b.rowid
               AND a.rowid2 = c.rowid
               AND b.rowid < c.rowid
               AND SDO_GEOM.RELATE (b.geom, 'ANYINTERACT', c.geom, .05) = 'TRUE'

Execution Plan
----------------------------------------------------------
Plan hash value: 1412731386
---------------------------------------------------------------------------------------------------
│ Id  │ Operation                           │ Name        │ Rows  │ Bytes │ Cost (%CPU)│ Time     │
---------------------------------------------------------------------------------------------------
│   0 │ SELECT STATEMENT                    │             │     1 │  1124 │ 12787   (1)│ 00:02:34 │
│   1 │  NESTED LOOPS                       │             │     1 │  1124 │ 12787   (1)│ 00:02:34 │
│   2 │   NESTED LOOPS                      │             │  4574 │  2514K│  8206   (1)│ 00:01:39 │
│   3 │    COLLECTION ITERATOR PICKLER FETCH│ SDO_JOIN    │       │       ││          │
│*  4 │    TABLE ACCESS BY USER ROWID       │ GEOD_STATES │     1 │   561 │1   (0)│ 00:00:01 │
│*  5 │   TABLE ACCESS BY USER ROWID        │ GEOD_STATES │     1 │   561 │1   (0)│ 00:00:01 │
Predicate Information (identified by operation id):
---------------------------------------------------
   4 - access(CHARTOROWID(VALUE(KOKBF$)))
   5 - access(CHARTOROWID(VALUE(KOKBF$)))
       filter("B".ROWID<"C".ROWID AND
               "SDO_GEOM"."RELATE"("B"."GEOM",'ANYINTERACT',"C"."GEOM",.05)='TRUE')

SQL> set autotrace off

前述の例では、AND b.rowid < c.rowidは、WHERE句内でSDO_GEOM.RELATEのコールの前に記述することが重要です。これにより、SDO_GEOM.RELATEファンクションの起動による不要な動作を省略できます。この例では、ORDEREDおよびUSE_NLヒントを使用していること、および実行計画にTABLE ACCESS FULLまたはHASH JOINが含まれていないことに注意してください。

クロススキーマでのSDO_JOINの使用

空間表とその空間表に作成された空間索引の索引表の両方に対するSELECT権限を付与されている場合は、自分のスキーマにない索引付けされた表でSDO_JOINテーブル・ファンクションを起動できます。空間索引の索引表の名前を検索するには、USER_SDO_INDEX_METADATAビューでSDO_INDEX_TABLE列を問い合せます。たとえば、次の文では、COLA_MARKETS_IDX空間索引の索引表の名前が戻されます。

SELECT sdo_index_table FROM user_sdo_index_metadata
  WHERE sdo_index_name = 'COLA_SPATIAL_IDX';

ユーザーAが(索引表MDRT_F9AA$を含む)空間表T1を、ユーザーBが空間表T2を保持し、ユーザーBがT1とT2の両方からジオメトリを結合するとします。また、両方の表のジオメトリ列が、GEOMETRYという名前であると想定します。

ユーザーAまたは適切な権限を付与されたユーザーが、ユーザーAとして接続し、次の文を実行する必要があります。

GRANT select on T1 to B;
GRANT select on MDRT_F9AA$ to B;

これで、ユーザーBが接続し、SDO_JOIN問合せを実行できます。次に例を示します。

SELECT COUNT(*) FROM
  (SELECT * FROM
    TABLE(SDO_JOIN('A.T1', 'GEOMETRY',
                   'B.T2', 'GEOMETRY',
                   'mask=anyinteract')) );

次の例では、COLA_MARKETS表をその表自体と結合し、各ジオメトリを調べてその表と空間的に相互作用する他のすべてのジオメトリを検索します。(例では、2.1項の定義およびデータを使用しています。)この例では、rowid1およびrowid2は、SDO_ROWIDPAIR型の定義内の属性名に対応しています。出力で、cola_d図2-1の円)がそれ自体とのみ相互作用し、他のジオメトリとは相互作用していないことに注意してください。

SELECT /*+ ordered */ a.name, b.name
  FROM TABLE(SDO_JOIN('COLA_MARKETS', 'SHAPE',
                      'COLA_MARKETS', 'SHAPE',
                      'mask=ANYINTERACT')) c,
       cola_markets a,
       cola_markets b
  WHERE c.rowid1 = a.rowid AND c.rowid2 = b.rowid
  ORDER BY a.name;

NAME                             NAME
-------------------------------- --------------------------------
cola_a                           cola_c
cola_a                           cola_b
cola_a                           cola_a
cola_b                           cola_c
cola_b                           cola_b
cola_b                           cola_a
cola_c                           cola_c
cola_c                           cola_b
cola_c                           cola_a
cola_d                           cola_d

10 rows selected.

関連項目


SDO_NN

構文

SDO_NN(geometry1, geometry2, param [, number]);

説明

空間索引で、最も近くにあるジオメトリを識別するために使用します。

キーワードおよびパラメータ

説明
geometry1 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。
geometry2 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。geometry1のジオメトリのうち、geometry2に最も近いジオメトリが戻されます。(geometry2は、バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。
param 演算子の処理を指定します。表19-4に、使用可能なキーワードを示します。このパラメータを指定しない場合、演算子によって、すべての行がgeometry2からの距離の昇順で戻されます。データ型はVARCHAR2です。
number SDO_NNへのコールにSDO_NN_DISTANCE補助演算子が含まれている場合、SDO_NN_DISTANCEへのコールに使用されている数と同じ数を指定します。データ型はNUMBERです。

表19-4に、paramパラメータのキーワードを示します。

表19-4 SDO_NN Paramパラメータのキーワード

キーワード 説明

distance

最も近くにあるものの検索を中止する、距離単位の数を指定します。unitキーワードも指定していない場合、デフォルトはデータに関連付けられた計測単位になります。データ型はNUMBERです。

例: 'distance=10 unit=mile'

sdo_batch_size

WHERE句を満たす結果の数を戻すためにSDO_NN式の評価を2回以上行う必要がある場合、一度に評価される行の数を指定します。Rツリー索引が使用される場合のみ使用可能です。sdo_batch_size=0を指定した場合(またはparamパラメータを完全に省略した場合)、結果セットのサイズに適したバッチ・サイズがSpatialによって計算されます。詳細は、「使用上の注意」および「例」を参照してください。データ型はNUMBERです。

例: 'sdo_batch_size=10'

sdo_num_res

sdo_batch_sizeが指定されていない場合、戻される結果(最も近くにあるもの)の数を指定します。sdo_batch_sizeが指定されている場合、このキーワードは無視され、かわりにROWNUM疑似列を使用して結果の数が制限されます。詳細は、「使用上の注意」および「例」を参照してください。データ型はNUMBERです。

例: 'sdo_num_res=5'

unit

SDO_NNへのコールにdistanceキーワードまたはSDO_NN_DISTANCE補助演算子が含まれている場合、測定単位(unit=およびMDSYS.SDO_DIST_UNITS表のSDO_UNIT値を引用符で囲んだ文字列)を指定します。測定単位の指定の詳細は、2.10項を参照してください。データ型はVARCHAR2です。デフォルトは、データに関連付けられた測定単位です。測地データの場合、デフォルトはmです。

例: 'unit=KM'


戻り値

この演算子では、問合せでgeometry2の最も近くにある、sdo_num_resに指定した数のオブジェクトをgeometry1から戻します。2つのオブジェクトの近さを判断するには、各オブジェクトの領域上にある2点間の最短距離が使用されます。

使用上の注意

表に空間索引が含まれない場合、または索引の作成時に指定された次元数と問合せウィンドウの次元数が一致しない場合、この演算子は無効になります。

この演算子は、常にWHERE句で使用される必要があり、この演算子を含む条件式は、SDO_NN(arg1, arg2, '<some_parameter>') = 'TRUE'の形式である必要があります。

この演算子は、次の2つの方法で使用できます。

sdo_batch_sizeキーワードの例のように、RESTAURANTS表に様々なタイプのレストランが含まれ、ホテルに最も近い2軒のイタリアン・レストランを検索する必要があると想定します。問合せは次のようになります。

SELECT r.name FROM restaurants r WHERE
   SDO_NN(r.geometry, :my_hotel, 'sdo_batch_size=10') = 'TRUE'
   AND r.cuisine = 'Italian' AND ROWNUM <=2;

この例では、CUISINEがItalianである場合、結果が3つ以上戻されないように制限するには、ROWNUM <=2句を指定する必要があります。ただし、この例でsdo_batch_sizeキーワードが指定されず、またsdo_num_res=2ROWNUM <=2のかわりに指定されている場合、CUISINE値に関係なく、最も近い2軒のレストランのみが考慮されます。考慮される2つの行のCUISINE値がItalianでない場合、この問合せでは行が戻されない場合があります。

sdo_batch_size値は、最も近くにあるものの問合せのパフォーマンスに影響する可能性があります。一般的なガイドラインとして、WHERE句を満たすと考えられる候補行の数を指定することをお薦めします。イタリアン・レストランに対する問合せの例では、ホテルに近いレストランの約20%がイタリアン・レストランであり、2軒のレストランを検索する場合は、sdo_batch_size値を10に指定すると、最適なパフォーマンスが得られます。一方、ホテルに近いレストランの約5%のみがイタリアン・レストランであり、2軒のレストランを検索する場合は、sdo_batch_size値を40に指定することをお薦めします。

sdo_batch_size=0を指定できます。この場合、結果セットのサイズに適したバッチ・サイズがSpatialによって計算されます。ただし、計算されたバッチ・サイズが最適ではない場合もあり、この計算によって処理オーバーヘッドが発生する場合もあります。問合せに対する適切なsdo_batch_size値を判断できる場合は、sdo_batch_size=0を指定した場合より高いパフォーマンスを得ることができます。

sdo_batch_sizeキーワードが指定されている場合、sdo_num_res値は無視されます。両方のキーワードを指定しないでください。

SDO_NNへのコールでSDO_NN_DISTANCE補助演算子を使用している場合のみ、numberパラメータを指定します。この章に示すSDO_NN_DISTANCE演算子の項を参照してください。

geometry2からの距離が等しい2つ以上のオブジェクトがgeometry1から戻される場合、ファンクションをコールするたびにどのオブジェクトでも戻される可能性があります。たとえば、item_aitem_bおよびitem_cgeometry2に最も近く、かつ等しい距離にある場合、sdo_num_res=2を指定すると、これら3つのオブジェクトのうちの2つが戻されますが、3つのすべてのオブジェクトが、戻される2つのオブジェクトになる可能性があります。

SDO_NN演算子でパーティション化された空間索引(5.1.3項を参照)が使用される場合、問合せ条件に基づく候補行が含まれるパーティションごとに、要求された数のジオメトリが戻されます。たとえば、ある点に最も近い5軒のレストランを要求し、空間索引が4つのパーティションを持つ場合、この演算子によって最大20(5×4)のジオメトリが戻されます。この場合、ROWNUM疑似列(この場合はWHERE ROWNUM <=5)を使用して、5軒の最も近いレストランを戻す必要があります。

geometry1およびgeometry2が異なる座標系に基づいている場合、geometry2は、6.10.1項で説明するとおり、操作を実行するため一時的にgeometry1の座標系に変換されます。

SDO_NNでは空間結合をサポートしていません。

オプティマイザ・ヒントによって索引を強制的に使用しないかぎり、SDO_NN演算子が空間索引を使用しない場合があります。これは、結合を含む問合せを発行した場合に発生します。また、このような場合に、オプティマイザ・ヒントを使用しないと内部エラーが発生します。このようなエラーを防ぐには、問合せの複雑さに関係なく、常にオプティマイザ・ヒントが、SDO_NN演算子とともに空間索引を使用するように指定する必要があります。次に、COLA_MARKETS表で定義されたCOLA_SPATIAL_IDX索引を使用するように指定する問合せの例を示します。

SELECT /*+ INDEX(c cola_spatial_idx) */
  c.mkt_id, c.name, ... FROM cola_markets c, ...;

ただし、WHERE句内の列の条件により、関連付けられた索引を持つgeometry1の表で非空間列が1つでも指定されている場合は、その索引にNO_INDEXヒントを指定して、その索引が使用されないようにする必要があります。たとえば、COLA_NAME_IDXという名前の索引がNAME列に定義されている場合は、次のとおり前述の例にヒントを指定する必要があります。

SELECT /*+ INDEX(c cola_spatial_idx) NO_INDEX(c cola_name_idx) */
  c.mkt_id, c.name, ... FROM cola_markets c, ...;

(ただし、2.1項の例にはCOLA_NAME_IDXという名前の索引は含まれていないことに注意してください。)

SDO_NN演算子を使用して2つ以上の表を結合する場合は、外部表にはLEADINGヒントを、内部表(空間索引を持つ表)にはINDEXヒントを指定し、内部表は最後に指定します。次に例を示します。

SELECT  /*+ LEADING(b)  INDEX(a cola_spatial_idx) */ a.gid
   FROM cola_qry  b,  cola_markets  a
      WHERE b.gid =1 AND
          SDO_NN(a.shape, b.shape, 'sdo_num_res=1')='TRUE';

オプティマイザ・ヒントの使用方法については、『Oracle Databaseパフォーマンス・チューニング・ガイド』を参照してください。

空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。

次の例では、COLA_MARKETS表のSHAPE列から、指定した点(10,7)に最も近い2つのオブジェクトを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)

SELECT /*+ INDEX(c cola_spatial_idx) */
 c.mkt_id, c.name  FROM cola_markets c  WHERE SDO_NN(c.shape,
   sdo_geometry(2001, NULL, sdo_point_type(10,7,NULL), NULL,
   NULL),  'sdo_num_res=2') = 'TRUE';

    MKT_ID NAME
---------- --------------------------------
         2 cola_b
         4 cola_d

次の例では、sdo_batch_sizeキーワードを使用して、COLA_MARKETS表のSHAPE列から、指定された点(10,7)に最も近い、NAME値が「cola_d」未満の2つのオブジェクト(ROWNUM <=2)を検索します。sdo_batch_sizeの3という値は、WHERE句の条件を満たすかどうかを判断する前に評価する必要がある、最も近いジオメトリの数の最適な推測値を表します。(例では、2.1項の定義およびデータを使用しています。)

SELECT /*+ INDEX(c cola_spatial_idx) */ c.mkt_id, c.name
   FROM cola_markets c
   WHERE SDO_NN(c.shape,  sdo_geometry(2001, NULL,
      sdo_point_type(10,7,NULL), NULL,  NULL),
      'sdo_batch_size=3') = 'TRUE'
   AND c.name < 'cola_d' AND ROWNUM <= 2;

    MKT_ID NAME
---------- --------------------------------
         2 cola_b
         3 cola_c

SDO_NNのより複雑な例については、C.3項を参照してください。

関連項目


SDO_NN_DISTANCE

構文

SDO_NN_DISTANCE(number);

説明

SDO_NN演算子によって戻されたオブジェクトの距離を戻します。SDO_NN演算子へのコール内のみで有効です。

キーワードおよびパラメータ

説明
number SDO_NN演算子に渡された最後のパラメータと同じ数を指定します。データ型はNUMBERです。

戻り値

この演算子は、SDO_NN演算子によって戻されたオブジェクトの距離を戻します。2つのオブジェクトの近さを判断するには、各オブジェクトの領域上にある2点間の最短距離が使用されます。

使用上の注意

SDO_NN_DISTANCEは、SDO_NN演算子の補助演算子です。この補助演算子は、指定されたジオメトリと最も近くにあるオブジェクトの間の距離を戻します。この距離は、補助データとしてSDO_NN演算子に渡されます。(演算子での補助データの使用方法については、『Oracle Databaseデータ・カートリッジ開発者ガイド』のドメイン索引の章に示す補助データの項を参照してください。)

numberパラメータには任意の数を選択できます。ただし、SDO_NN演算子へのコールの最後のパラメータと一致させる必要があります。

距離値を格納および操作するには、バインド変数を使用します。

次の例では、COLA_MARKETS表のSHAPE列から、指定した点(10,7)に最も近い2つのオブジェクトを検索し、各オブジェクトと点の間の距離を戻します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)

SELECT   /*+ INDEX(c cola_spatial_idx) */
   c.mkt_id, c.name, SDO_NN_DISTANCE(1) dist
   FROM cola_markets c
   WHERE SDO_NN(c.shape,  sdo_geometry(2001, NULL,
      sdo_point_type(10,7,NULL), NULL,  NULL),
      'sdo_num_res=2', 1) = 'TRUE' ORDER BY dist;

    MKT_ID NAME                                   DIST
---------- -------------------------------- ----------
         4 cola_d                           .828427125
         2 cola_b                           2.23606798

この例では、次のことに注意してください。

関連項目


SDO_ON

構文

SDO_ON(geometry1, geometry2);

説明

表内のジオメトリに、特定のジオメトリとのON位相関係があるかどうかを確認します。SDO_RELATE演算子に'mask=ON'を含めて指定する場合と同じです。

この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。

キーワードおよびパラメータ

説明
geometry1 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。
geometry2 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。

戻り値

式SDO_ON(geometry1,geometry2) = 'TRUE'は、ON位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。

使用上の注意

この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。

位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。

空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。

次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)とON関係を持つジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)この例では、SHAPE列に線ストリング・ジオメトリが存在しないため、行が戻されません。

SELECT c.mkt_id, c.name
  FROM cola_markets c
  WHERE SDO_ON(c.shape,
            SDO_GEOMETRY(2003, NULL, NULL,
              SDO_ELEM_INFO_ARRAY(1,1003,3),
              SDO_ORDINATE_ARRAY(4,6, 8,8))
            ) = 'TRUE';

no rows selected

SDO_OVERLAPBDYDISJOINT

構文

SDO_OVERLAPBDYDISJOINT(geometry1, geometry2);

説明

表内のジオメトリに、特定のジオメトリとのOVERLAPBDYDISJOINT位相関係があるかどうかを確認します。SDO_RELATE演算子に'mask=OVERLAPBDYDISJOINT'を含めて指定する場合と同じです。

この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。

キーワードおよびパラメータ

説明
geometry1 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。
geometry2 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。

戻り値

式SDO_OVERLAPBDYDISJOINT(geometry1,geometry2) = 'TRUE'は、OVERLAPBDYDISJOINT位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。

使用上の注意

この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。

位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。

空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。

次の例では、線ストリング・ジオメトリ(ここでは、(0,6)から(2,6)の水平な線)とOVERLAPBDYDISJOINT関係があるジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)この例では、cola_aのみが線ストリング・ジオメトリとOVERLAPBDYDISJOINT関係を持っています。

SELECT c.mkt_id, c.name
  FROM cola_markets c
  WHERE SDO_OVERLAPBDYDISJOINT(c.shape,
            SDO_GEOMETRY(2002, NULL, NULL,
              SDO_ELEM_INFO_ARRAY(1,2,1),
              SDO_ORDINATE_ARRAY(0,6, 2,6))
            ) = 'TRUE';

    MKT_ID NAME
---------- --------------------------------
         1 cola_a

SDO_OVERLAPBDYINTERSECT

構文

SDO_OVERLAPBDYINTERSECT(geometry1, geometry2);

説明

表内のジオメトリに、特定のジオメトリとのOVERLAPBDYINTERSECT位相関係があるかどうかを確認します。SDO_RELATE演算子に'mask=OVERLAPBDYINTERSECT'を含めて指定する場合と同じです。

この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。

キーワードおよびパラメータ

説明
geometry1 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。
geometry2 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。

戻り値

式SDO_OVERLAPBDYINTERSECT(geometry1,geometry2) = 'TRUE'は、OVERLAPBDYINTERSECT位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。

使用上の注意

この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。

位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。

空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。

次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)とOVERLAPBDYINTERSECT関係を持つジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)この例では、cola_acola_bおよびcola_dが問合せウィンドウ・ジオメトリとOVERLAPBDYINTERSECT関係を持っています。

SELECT c.mkt_id, c.name
  FROM cola_markets c
  WHERE SDO_OVERLAPBDYINTERSECT(c.shape,
            SDO_GEOMETRY(2003, NULL, NULL,
              SDO_ELEM_INFO_ARRAY(1,1003,3),
              SDO_ORDINATE_ARRAY(4,6, 8,8))
            ) = 'TRUE';

    MKT_ID NAME
---------- --------------------------------
         2 cola_b
         1 cola_a
         4 cola_d

SDO_OVERLAPS

構文

SDO_OVERLAPS(geometry1, geometry2);

説明

表内のジオメトリが特定のジオメトリと重なっているかどうか(OVERLAPBDYDISJOINTまたはOVERLAPBDYINTERSECT位相関係があるかどうか)を確認します。SDO_RELATE演算子に'mask=OVERLAPBDYDISJOINT+OVERLAPBDYINTERSECT'を含めて指定する場合と同じです。

この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。

空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。

キーワードおよびパラメータ

説明
geometry1 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。
geometry2 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。

戻り値

式SDO_OVERLAPS(geometry1,geometry2) = 'TRUE'は、OVERLAPBDYDISJOINTまたはOVERLAPBDYINTERSECT位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。

使用上の注意

この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。

位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。

次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)と重なるジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)この例では、SHAPE列内の3つのジオメトリが問合せウィンドウ・ジオメトリと重なります。

SELECT c.mkt_id, c.name
  FROM cola_markets c
  WHERE SDO_OVERLAPS(c.shape,
            SDO_GEOMETRY(2003, NULL, NULL,
              SDO_ELEM_INFO_ARRAY(1,1003,3),
              SDO_ORDINATE_ARRAY(4,6, 8,8))
            ) = 'TRUE';

    MKT_ID NAME
---------- --------------------------------
         2 cola_b
         1 cola_a
         4 cola_d

SDO_RELATE

構文

SDO_RELATE(geometry1, geometry2, param);

説明

(対象領域のような)指定されたオブジェクトと空間的に相互作用するオブジェクトの集合を識別したり、指定した2つのオブジェクトが相互作用するかどうかを判断します。

この演算子は、1次フィルタおよび2次フィルタ処理を実行します。

キーワードおよびパラメータ

説明
geometry1 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。
geometry2 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。
param maskキーワードを指定します。またオプションで、min_resolutionキーワードまたはmax_resolutionキーワード(あるいはその両方)を指定します。このパラメータのデータ型はVARCHAR2です。

maskキーワードは、相互作用の位相関係を指定します。これは必須パラメータです。有効なmaskキーワード値は、9交差パターン内のTOUCHOVERLAPBDYDISJOINTOVERLAPBDYINTERSECTEQUALINSIDECOVEREDBYCONTAINSCOVERSANYINTERACTONのうちの1つ以上の値です。論理ブール演算子ORを使用して、'mask=inside+touch'のように複数のマスクを組み合せることができますが、UNION ALLを使用する構文の方がパフォーマンスが向上する場合があります。「使用上の注意」を参照してください。9交差部の関係パターンの詳細は、1.8項を参照してください。

min_resolutionキーワードに含まれるのは、ジオメトリのMBRのうち少なくとも1つの辺が指定値以上のジオメトリのみです。たとえば、min_resolution=10キーワードに含まれるのは、ジオメトリのMBRの幅または高さ(あるいはその両方)が10以上であるジオメトリのみです。(このキーワードは対象として過小なジオメトリを除外するために使用できます。)

max_resolutionキーワードに含まれるのは、ジオメトリのMBRのうち少なくとも1つの辺が指定値以下のジオメトリのみです。たとえば、max_resolution=10キーワードに含まれるのは、ジオメトリのMBRの幅または高さ(あるいはその両方)が10以下であるジオメトリのみです。(このキーワードは対象として過大なジオメトリを除外するために使用できます。)

下位互換性のために、リリース1(10.1)より前のリリースでサポートされていた、paramパラメータのすべての追加キーワードも動作しますが、これらのキーワードは使用しないことをお薦めします。また、これらのキーワードは、この演算子の新しい使用方法ではサポートされません。


戻り値

式SDO_RELATE(geometry1,geometry2, 'mask = <some_mask_val>') = 'TRUE'は、<some_mask_val>で指定した位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。

使用上の注意

表に空間索引が含まれない場合、または索引の作成時に指定された次元数と問合せウィンドウの次元数が一致しない場合、この演算子は無効になります。

この演算子は、常にWHERE句で使用される必要があり、この演算子を含む条件式は、SDO_RELATE(arg1, arg2, 'mask = <some_mask_val>') = 'TRUE'の形式である必要があります。

geometry2は表から取り出されるか、または一時的なSDO_GEOMETRYオブジェクト(バインド変数、SDO_GEOMETRYコンストラクタなど)となります。

geometry1およびgeometry2が異なる座標系に基づいている場合、geometry2は、6.10.1項で説明するとおり、操作を実行するため一時的にgeometry1の座標系に変換されます。

SDO_GEOM.RELATEファンクションとは異なり、DISJOINTおよびDETERMINEマスクは、SDO_RELATE演算子との関係マスクで許可されていません。これは、SDO_RELATEが、相互作用する候補を空間索引を使用して検索するため、DISJOINTまたはDETERMINEを満たす情報が索引に存在しないためです。

論理ブール演算子ORを使用して、'mask=touch+coveredby'のように複数のマスクを組み合せることは可能ですが、空間問合せで各マスクを別々に指定し、UNION ALL構文を使用して結果を組み合せるとパフォーマンスが向上する場合があります。これは、マスクが同じSDO_RELATE演算子コールでグループ化されるのではなく、単一指定されるような場合に、Spatialが適用する内部最適化の結果です。(ただし、2つの例外として、inside+coveredbyおよびcontains+coversでは、UNION ALL構文よりも組合せのパフォーマンスが向上します。)たとえば、論理ブール演算子ORを使用して複数のマスクをグループ化する次の問合せについて考えてみます。

SELECT a.gid
  FROM polygons a, query_polys B
  WHERE B.gid = 1
  AND SDO_RELATE(A.Geometry, B.Geometry,
                   'mask=touch+coveredby') = 'TRUE';

この問合せについて、次のように、単一マスクが指定されている複数のSDO_RELATE演算子コールの結果を、UNION ALLを使用して組み合せると、パフォーマンスが向上します。

SELECT a.gid
      FROM polygons a, query_polys B
      WHERE B.gid = 1
      AND SDO_RELATE(A.Geometry, B.Geometry,
                   'mask=touch') = 'TRUE'
UNION ALL
SELECT a.gid
      FROM polygons a, query_polys B
      WHERE B.gid = 1
      AND SDO_RELATE(A.Geometry, B.Geometry,
                   'mask=coveredby') = 'TRUE';

線と複数点ジオメトリ(点クラスタ内の複数の点)の関係には次のことを考慮してください。単一線と、3つの点で構成される複数点ジオメトリの例(SDO_GTYPE = 2005など)を想定します。

空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。

次の例はSDO_FILTER演算子の例に類似しています。ただし、これらの例では、(maskキーワードを使用して)相互作用の特定のタイプを識別し、空間的に相互作用しているかどうかも(概算ではなく)正確に判断します。

次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)と相互作用するジオメトリを選択します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)

SELECT c.mkt_id, c.name
  FROM cola_markets c
  WHERE SDO_RELATE(c.shape,
    SDO_GEOMETRY(2003, NULL, NULL,
      SDO_ELEM_INFO_ARRAY(1,1003,3),
      SDO_ORDINATE_ARRAY(4,6, 8,8)),
    'mask=anyinteract') = 'TRUE';

    MKT_ID NAME
---------- --------------------------------
         2 cola_b
         1 cola_a
         4 cola_d

次の例は前述の例と同じですが、ジオメトリのMBRのうち少なくとも1つの辺が4.1以上のジオメトリのみを含む、という点で異なります。この場合、cola_aおよびcola_bのみが戻されます。これは、これらのMBRには4.1以上の長さを持つ辺が少なくとも1つあるためです。円cola_dは、そのMBRの各辺の長さが4の四角形であるため、除外されます。

SELECT c.mkt_id, c.name
  FROM cola_markets c
  WHERE SDO_RELATE(c.shape,
    SDO_GEOMETRY(2003, NULL, NULL,
      SDO_ELEM_INFO_ARRAY(1,1003,3),
      SDO_ORDINATE_ARRAY(4,6, 8,8)),
    'mask=anyinteract min_resolution=4.1') = 'TRUE';

    MKT_ID NAME
---------- --------------------------------
         2 cola_b
         1 cola_a

次の例では、GEOMETRY列のオブジェクトが、GIDに1の値を持つQUERY_POLYS表のGEOMETRY列オブジェクトと空間的に相互作用する場合に、POLYGONS表からGIDの値を検索します。

SELECT A.gid
  FROM Polygons A, query_polys B
  WHERE B.gid = 1
  AND SDO_RELATE(A.Geometry, B.Geometry,
                   'mask=ANYINTERACT') = 'TRUE';

次の例では、GEOMETRY列オブジェクトが、aGeom変数に格納されているジオメトリと空間的に相互作用する場合に、POLYGONS表からGIDの値を検索します。

SELECT A.Gid
  FROM Polygons A
  WHERE SDO_RELATE(A.Geometry, :aGeom, 'mask=ANYINTERACT') = 'TRUE';

次の例では、GEOMETRY列オブジェクトが、左下の座標に(x1,y1)、右上の座標に(x2, y2)を持つ指定した矩形と空間的に相互作用する場合に、POLYGONS表からGIDの値を検索します。

SELECT A.Gid
  FROM Polygons A
  WHERE SDO_RELATE(A.Geometry, sdo_geometry(2003,NULL,NULL,
                                   sdo_elem_info_array(1,1003,3),
                                   sdo_ordinate_array(x1,y1,x2,y2)),
                     'mask=ANYINTERACT') = 'TRUE';

次の例では、GEOMETRY列オブジェクトが、QUERY_POLYS表のGEOMETRY列オブジェクトに格納されているジオメトリと空間的に相互作用する場合に、POLYGONS表からGIDの値を検索します。この例では、ORDEREDオプティマイザ・ヒントを使用し、FROM句の最初にQUERY_POLYS(geometry2)表を指定します。これは、geometry2の複数のジオメトリが含まれるためです(「使用上の注意」を参照)。

SELECT /*+ ORDERED */
  A.gid
  FROM query_polys B, polygons A
  WHERE SDO_RELATE(A.Geometry, B.Geometry, 'mask=ANYINTERACT') = 'TRUE';

関連項目


SDO_TOUCH

構文

SDO_TOUCH(geometry1, geometry2);

説明

表内のジオメトリに、特定のジオメトリとのTOUCH位相関係があるかどうかを確認します。SDO_RELATE演算子に'mask=TOUCH'を含めて指定する場合と同じです。

この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。

キーワードおよびパラメータ

説明
geometry1 表のジオメトリ列を指定します。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。
geometry2 表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。

戻り値

式SDO_TOUCH(geometry1,geometry2) = 'TRUE'は、TOUCH位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。

使用上の注意

この章に示すSDO_RELATE演算子の「使用上の注意」を参照してください。

位相関係およびSpatialで使用される9交差モデルについては、1.8項を参照してください。

空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。

次の例では、問合せウィンドウ(ここでは、左下の座標が(1,1)、右上の座標が(5,7)の矩形)とTOUCH関係を持つジオメトリを検索します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。)この例では、cola_bのみが問合せウィンドウ・ジオメトリとTOUCH関係を持っています。

SELECT c.mkt_id, c.name
  FROM cola_markets c
  WHERE SDO_TOUCH(c.shape,
            SDO_GEOMETRY(2003, NULL, NULL,
              SDO_ELEM_INFO_ARRAY(1,1003,3),
              SDO_ORDINATE_ARRAY(1,1, 5,7))
            ) = 'TRUE';
  FROM cola_markets c

    MKT_ID NAME
---------- --------------------------------
         2 cola_b

SDO_WITHIN_DISTANCE

構文

SDO_WITHIN_DISTANCE(geometry1, aGeom, params);

説明

空間索引を使用して、対象領域または対象となる点など指定されたオブジェクトの、指定された距離内にある空間オブジェクトの集合を識別します。

キーワードおよびパラメータ

説明
geometry1 表のジオメトリ列を指定します。この列には、オブジェクト(aGeom)から指定した距離内にあると判断されたジオメトリ・オブジェクトが格納されます。列は、空間索引付けされている必要があります。データ型はSDO_GEOMETRYです。
aGeom geometry1にあるジオメトリ・オブジェクトからの距離を調べるオブジェクトを指定します。(バインド変数を使用した)表のジオメトリか、または(SDO_GEOMETRYコンストラクタを使用した)ジオメトリの一時的なインスタンスを指定します。データ型はSDO_GEOMETRYです。
params 1つ以上のキーワード(値を含む)を引用符で囲んで、演算子の動作を判断する文字列を指定します。後続の項目(distancemax_resolutionmin_resolutionquerytypeおよびunit)は、paramsパラメータに使用可能なキーワードです。データ型はVARCHAR2です。
distance 距離値を指定します。座標系がジオメトリに関連付けられている場合、距離の単位は座標系に関連付けられた単位であると想定されます。これは必須キーワードです。データ型はNUMBERです。
max_resolution ジオメトリのMBRのうち少なくとも1つの辺が指定値以下のジオメトリのみを含みます。たとえば、max_resolution=10キーワードに含まれるのは、ジオメトリのMBRの幅または高さ(あるいはその両方)が10以下であるジオメトリのみです。(このキーワードは対象として過大なジオメトリを除外するために使用できます。)
min_resolution ジオメトリのMBRのうち少なくとも1つの辺が指定値以上のジオメトリのみを含みます。たとえば、min_resolution=10キーワードに含まれるのは、ジオメトリのMBRの幅または高さ(あるいはその両方)が10以上であるジオメトリのみです。(このキーワードは対象として過小なジオメトリを除外するために使用できます。)
querytype 'querytype=FILTER'を設定し、1次フィルタ処理のみを実行します。querytypeが指定されていない場合、1次フィルタ処理および2次フィルタ処理の両方が実行されます(デフォルト)。データ型はVARCHAR2です。
unit 測定単位(unit=およびMDSYS.SDO_DIST_UNITS表のSDO_UNIT値を引用符で囲んだ文字列で、たとえば'unit=KM')を指定します。測定単位の指定の詳細は、2.10項を参照してください。データ型はNUMBERです。デフォルトは、データに関連付けられた測定単位です。測地データの場合、デフォルトはmです。

戻り値

式SDO_WITHIN_DISTANCE(arg1, arg2, arg3) = 'TRUE'は、指定した距離内にあるオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。

使用上の注意

2つの拡張オブジェクト(たとえば、線やポリゴンなど、点のないオブジェクト)の距離は、それら2つのオブジェクト間の最短距離です。そのため、2つの隣接したポリゴン間の距離は0(ゼロ)です。

表に空間索引が含まれない場合、または索引の作成時に指定された次元数と問合せウィンドウの次元数が一致しない場合、この演算子は無効になります。

この演算子は、常にWHERE句で使用される必要があり、この演算子を含む条件は、次の形式である必要があります。

SDO_WITHIN_DISTANCE(arg1, arg2, 'distance = <some_dist_val>') = 'TRUE'

ジオメトリ列には、空間索引が作成されている必要があります。測地データの場合、空間索引がRツリー索引である必要があります。

SDO_WITHIN_DISTANCEは、空間結合でサポートされていません。 SDO_WITHIN_DISTANCE演算子で空間結合を実行する方法については、5.2.1.3項を参照してください。

空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、1.11項を参照してください。

次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)から10距離以内のジオメトリを選択します。(例では、2.1項および図2-1に示す定義およびデータを使用しています。この場合、図中のすべてのジオメトリが戻されます。)

SELECT c.name FROM cola_markets c WHERE SDO_WITHIN_DISTANCE(c.shape,
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(4,6, 8,8)),
  'distance=10') = 'TRUE';

NAME
--------------------------------
cola_b
cola_a
cola_c
cola_d

次の例は前述の例と同じですが、ジオメトリのMBRのうち少なくとも1つの辺が4.1以上のジオメトリのみを含む、という点で異なります。この場合、cola_aおよびcola_bのみが戻されます。これは、これらのMBRには4.1以上の長さを持つ辺が少なくとも1つあるためです。台形cola_cは、そのMBRの各辺の長さが3と2であるため除外されます。また円cola_dも、そのMBRの各辺の長さが4の四角形であるため除外されます。

SELECT c.name FROM cola_markets c WHERE SDO_WITHIN_DISTANCE(c.shape,
  SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(4,6, 8,8)),
  'distance=10 min_resolution=4.1') = 'TRUE';

NAME
--------------------------------
cola_b
cola_a

次の例では、GEOMETRY列オブジェクトが、aGeom変数に格納されているジオメトリの10距離単位内にある場合に、POLYGONS表からGIDの値を検索します。

SELECT A.GID    FROM POLYGONS A    WHERE      SDO_WITHIN_DISTANCE(A.Geometry, :aGeom, 'distance = 10') = 'TRUE';

次の例では、GEOMETRY列オブジェクトが、左下の座標に(x1,y1)、右上の座標に(x2, y2)を持つ指定した矩形の10距離単位内にある場合に、POLYGONS表からGIDの値を検索します。

SELECT A.GID    FROM POLYGONS A    WHERE      SDO_WITHIN_DISTANCE(A.Geometry, sdo_geometry(2003,NULL,NULL,                              sdo_elem_info_array(1,1003,3),                              sdo_ordinate_array(x1,y1,x2,y2)),                      'distance = 10') = 'TRUE';

次の例では、QUERY_POINTS表のGIDの値が1で、POLYGONS.GEOMETRYオブジェクトがQUERY_POINTS.GEOMETRYオブジェクトの10距離単位内にある場合に、POLYGONS表からGIDの値を検索します。

SELECT A.GID    FROM POLYGONS A, Query_Points B    WHERE B.GID = 1 AND      SDO_WITHIN_DISTANCE(A.Geometry, B.Geometry, 'distance = 10') = 'TRUE';

SDO_WITHIN_DISTANCEのより複雑な例については、C.2項を参照してください。

関連項目