プライマリ・コンテンツに移動
Oracle® Spatial and Graph開発者ガイド
12cリリース1 (12.1)
B72470-07
目次へ移動
目次
索引へ移動
索引

前
次

18.16 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キーワードの有効な値は、TOUCHOVERLAPBDYDISJOINTOVERLAPBDYINTERSECTEQUALINSIDECOVEREDBYCONTAINSCOVERSANYINTERACTONの9つの交差パターンの1つ以上の組合せです。たとえば'mask=inside+touch'のように、複数のマスクが論理Boolean演算子ORで結合されます。9つの交差関係パターンについては、「空間関係およびフィルタ処理」を参照してください。

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'の形式である必要があります。(式は'TRUE'以外のどの値とも等しくない必要があります。)

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

  • geometry2列が空間索引付けされていない場合、演算子は問合せウィンドウをメモリー内で索引付けするため、高いパフォーマンスを実現します。

  • geometry2の2つ以上のジオメトリが演算子に渡される場合は、ORDEREDオプティマイザ・ヒントが指定されている必要があり、geometry2にある表をFROM句の最初に指定する必要があります。

geometry1およびgeometry2が異なる座標系に基づいている場合、geometry2は、「演算子およびファンクションでの座標系が異なるジオメトリの使用」で説明するとおり、操作を実行するため一時的にgeometry1の座標系に変換されます。

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

たとえば'mask=touch+coveredby'のように、論理Boolean演算子ORを使用して複数のマスクを結合できます。リリース12.1からは、SPATIAL_VECTOR_ACCELERATIONシステム・パラメータをTRUEに設定した場合(「SPATIAL_VECTOR_ACCELERATIONシステム・パラメータ」で説明しているように強く推奨されます)、このようなマスクにUNION ALLを使用する必要はありません。ただし、SPATIAL_VECTOR_ACCELERATIONをTRUEに設定しない場合、空間問合せで各マスクを別々に指定し、UNION ALL構文を使用して結果を組み合せるとパフォーマンスが向上する場合があります。これは、マスクが同じSDO_RELATE演算子コールでグループ化されるのではなく、単一指定されるような場合に、Spatial and Graphが適用する内部最適化の結果です。(ただし、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';

SPATIAL_VECTOR_ACCELERATIONがTRUEの場合、前の問合せは最も単純で、パフォーマンスが最適です。ただし、SPATIAL_VECTOR_ACCELEERATIONがFALSEの場合は、この問合せについて、次のように、単一マスクが指定されている複数の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など)を想定します。

  • 線と相互作用する点が1つもない場合、線と点クラスタの関係はDISJOINTです。

  • 1つの点が線の内部に位置し、他の2つの点が非接続である場合、線と点クラスタの関係はOVERLAPBDYDISJOINTです。

  • 1つの点が線の境界(線の開始点または終了点)に位置し、他の2つの点が非接続である場合、線と点クラスタの関係はTOUCHです。

  • 1つの点が線の境界(線の開始点または終了点)に、もう1つの点が線の内部に位置し、残りの1つの点が非接続である場合、線と点クラスタの関係はOVERLAPBDYINTERSECTではなく、OVERLAPBDYDISJOINTです。

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

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

次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)と相互作用するジオメトリを選択します。(例では、「空間データの挿入、索引付けおよび問合せの例」および図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';

関連項目