20 空間演算子
この章では、空間オブジェクト・データ型で使用できる演算子について説明します。
空間プロシージャと空間ファンクションとの違いなど、空間演算子の概要については、「空間演算子、空間プロシージャおよび空間ファンクション」を参照してください。表20-1に、主な演算子を示します。
表20-1 主な空間演算子
演算子 | 説明 |
---|---|
指定されたジオメトリと相互作用するジオメトリを特定します。 |
|
位相関係に基づいて空間結合を実行します。 |
|
最も近くにあるジオメトリを特定します。 |
|
SDO_NN演算子によって戻されたオブジェクトの距離を戻します。 |
|
1番目の列が点のx座標の値で、2番目の列が点のy座標の値である一連の行を使用して、指定したポリゴン・ジオメトリ内のこれらの行を戻します。 |
|
2つのジオメトリが指定された方法で相互作用しているかどうかを判断します。(特定のマスク値操作用の簡易形式の代替演算子については、表20-2を参照してください。) |
|
2つのジオメトリ間の距離が、指定された距離内にあるかどうかを判断します。 |
表20-2に、特定のマスク・タイプのSDO_RELATE操作を実行する簡易形式の演算子を示します。
表20-2 SDO_RELATE操作用の簡易演算子
演算子 | 説明 |
---|---|
表内のジオメトリに、特定のジオメトリとのANYINTERACT位相関係があるかどうかを確認します。 |
|
表内のジオメトリに、特定のジオメトリとのCONTAINS位相関係があるかどうかを確認します。 |
|
表内のジオメトリに、特定のジオメトリとのCOVEREDBY位相関係があるかどうかを確認します。 |
|
表内のジオメトリに、特定のジオメトリとのCOVERS位相関係があるかどうかを確認します。 |
|
表内のジオメトリに、特定のジオメトリとのEQUAL位相関係があるかどうかを確認します。 |
|
表内のジオメトリに、特定のジオメトリとのINSIDE位相関係があるかどうかを確認します。 |
|
表内のジオメトリに、特定のジオメトリとのON位相関係があるかどうかを確認します。 |
|
表内のジオメトリに、特定のジオメトリとのOVERLAPBDYDISJOINT位相関係があるかどうかを確認します。 |
|
表内のジオメトリに、特定のジオメトリとのOVERLAPBDYINTERSECT位相関係があるかどうかを確認します。 |
|
表内のジオメトリが特定のジオメトリと重なっているかどうか(OVERLAPBDYDISJOINTまたはOVERLAPBDYINTERSECT位相関係があるかどうか)を確認します。 |
|
表内のジオメトリに、特定のジオメトリとのTOUCH位相関係があるかどうかを確認します。 |
ノート:
Spatial and Graphの演算子やサブプログラムに対する文字列(VARCHAR2)パラメータの中に数値がある場合は、ロケールにかかわらず、小数点にはピリオド(.)を使用する必要があります。例: 'distance=3.7'
この章では、これらの演算子のリファレンス情報をアルファベット順に説明します。
トポロジで演算子を使用する方法は、『Oracle Spatial and Graphトポロジ・データ・モデルおよびネットワーク・データ・モデル・グラフ開発者ガイド』を参照してください。
- SDO_ANYINTERACT
- SDO_CONTAINS
- SDO_COVEREDBY
- SDO_COVERS
- SDO_EQUAL
- SDO_FILTER
- SDO_INSIDE
- SDO_JOIN
- SDO_NN
- SDO_NN_DISTANCE
- SDO_ON
- SDO_OVERLAPBDYDISJOINT
- SDO_OVERLAPBDYINTERSECT
- SDO_OVERLAPS
- SDO_POINTINPOLYGON
- SDO_RELATE
- SDO_TOUCH
- SDO_WITHIN_DISTANCE
親トピック: リファレンス情報
20.1 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_ANYINTERACT演算子は、共有デプロイメントのOracle Autonomous DatabaseインスタンスでOracle JVMが有効になっている場合にのみサポートされます。Oracle JVMを有効にするには、共有ExadataインフラストラクチャでのOracle Autonomous Databaseの使用のOracle Javaの使用を参照してください。この章に示すSDO_RELATE演算子の「使用上のノート」を参照してください。
位相関係およびSpatial and Graphで使用される9交差モデルについては、「空間関係およびフィルタ処理」を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、「3次元の空間オブジェクト」を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)とANYINTERACT関係を持つジオメトリを検索します。(例では、「空間データの挿入、索引付けおよび問合せの例」に示し、説明している定義およびデータを使用しています。)
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
親トピック: 空間演算子
20.2 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 and Graphで使用される9交差モデルについては、「空間関係およびフィルタ処理」を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、「3次元の空間オブジェクト」を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(2,2)、右上の座標が(4,6)の矩形)とCONTAINS関係を持つジオメトリを検索します。(例では、「空間データの挿入、索引付けおよび問合せの例」に示し、説明している定義およびデータを使用しています。)この例では、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
親トピック: 空間演算子
20.3 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 and Graphで使用される9交差モデルについては、「空間関係およびフィルタ処理」を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、「3次元の空間オブジェクト」を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(1,1)、右上の座標が(5,8)の矩形)とCOVEREDBY関係を持つジオメトリを検索します。(例では、「空間データの挿入、索引付けおよび問合せの例」に示し、説明している定義およびデータを使用しています。)この例では、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
親トピック: 空間演算子
20.4 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 and Graphで使用される9交差モデルについては、「空間関係およびフィルタ処理」を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、「3次元の空間オブジェクト」を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(1,1)、右上の座標が(4,6)の矩形)とCOVERS関係を持つジオメトリを検索します。(例では、「空間データの挿入、索引付けおよび問合せの例」に示し、説明している定義およびデータを使用しています。)この例では、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
親トピック: 空間演算子
20.5 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 and Graphで使用される9交差モデルについては、「空間関係およびフィルタ処理」を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、「3次元の空間オブジェクト」を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(1,1)、右上の座標が(5,7)の矩形)とEQUAL関係を持つジオメトリを検索します。(例では、「空間データの挿入、索引付けおよび問合せの例」に示し、説明している定義およびデータを使用しています。)この例では、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
親トピック: 空間演算子
20.6 SDO_FILTER
構文
SDO_FILTER(geometry1, geometry2, param);
説明
特定のオブジェクト(対象領域など)と空間的に相互作用する可能性のある空間オブジェクトのセット、または空間的に相互作用する可能性のある空間オブジェクトのペアを識別します。非接続でないオブジェクトは、空間的に相互作用します。
この演算子は、1次フィルタ処理のみ実行します。SDO_RELATE演算子によって実行される2次フィルタ処理によって、オブジェクトが空間的に相互作用するかどうかを特定できます。
キーワードおよびパラメータ
値 | 説明 |
---|---|
geometry1 |
表のジオメトリ列を指定します。この列の空間索引をお薦めします。データ型はSDO_GEOMETRYです。 |
geometry2 |
表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。 |
param |
オプションで、
|
戻り値
式SDO_FILTER(geometry1,geometry2) = 'TRUE'は、非接続以外のオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。
使用上のノート
ノート:
SDO_FILTER演算子は、共有デプロイメントのOracle Autonomous DatabaseインスタンスでOracle JVMが有効になっている場合にのみサポートされます。Oracle JVMを有効にするには、共有ExadataインフラストラクチャでのOracle Autonomous Databaseの使用のOracle Javaの使用を参照してください。SDO_FILTER演算子は、常にWHERE句で使用される必要があり、この演算子を含む条件式は、SDO_FILTER(arg1, arg2) = 'TRUE'形式である必要があります。(式は'TRUE'以外のどの値とも等しくない必要があります。)
geometry2
は表から取り出されるか、または一時的なSDO_GEOMETRYオブジェクト(バインド変数、SDO_GEOMETRYコンストラクタなど)となります。
-
geometry2
列が空間索引付けされていない場合、演算子は問合せウィンドウをメモリー内で索引付けするため、高いパフォーマンスを実現します。 -
geometry2
の2つ以上のジオメトリが演算子に渡される場合は、ORDEREDオプティマイザ・ヒントが指定されている必要があり、geometry2
にある表をFROM句の最初に指定する必要があります。
geometry1
およびgeometry2
が異なる座標系に基づいている場合、geometry2
は、「演算子およびファンクションでの座標系が異なるジオメトリの使用」で説明するとおり、操作を実行するため一時的にgeometry1
の座標系に変換されます。
ノート:
ファイングレイン・アクセス制御ポリシーの表またはビューへの追加に、DBMS_RLS.ADD_POLICYプロシージャが使用されていて、指定されたポリシー・ファンクションが空間演算子を使用する場合、その演算子はSDO_FILTERである必要があります。このコンテキストでは、他の空間演算子はサポートされていません。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、「3次元の空間オブジェクト」を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)と相互作用するジオメトリを選択します。(例では、「空間データの挿入、索引付けおよび問合せの例」に示し、説明している定義およびデータを使用しています。)
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';
関連トピック
親トピック: 空間演算子
20.7 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_INSIDE演算子は、共有デプロイメントのOracle Autonomous DatabaseインスタンスでOracle JVMが有効になっている場合にのみサポートされます。Oracle JVMを有効にするには、共有ExadataインフラストラクチャでのOracle Autonomous Databaseの使用のOracle Javaの使用を参照してください。この章に示すSDO_RELATE演算子の「使用上のノート」を参照してください。
位相関係およびSpatial and Graphで使用される9交差モデルについては、「空間関係およびフィルタ処理」を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、「3次元の空間オブジェクト」を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(5,6)、右上の座標が(12,12)の矩形)とINSIDE関係を持つジオメトリを検索します。(例では、「空間データの挿入、索引付けおよび問合せの例」に示し、説明している定義およびデータを使用しています。)この例では、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
親トピック: 空間演算子
20.8 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_name2 |
空間結合操作で使用される2つ目の表の名前を指定します。( |
column_name2 |
|
params |
キーワードおよび値のオプションのパラメータ文字列です。 |
preserve_join_order |
演算子の処理中に結合順序が保持されることが保証されている場合に指定するオプションのパラメータです。この値が |
table1_partition |
|
table2_partition |
|
戻り値
SDO_JOINは、SDO_ROWIDSETのオブジェクトを戻します。このオブジェクトは、SDO_ROWIDPAIRのオブジェクトの表で構成されます。Oracle Spatial and Graphは、SDO_ROWIDSET型を次のとおり定義します。
CREATE TYPE sdo_rowidset as TABLE OF sdo_rowidpair;
Oracle Spatial and Graphは、SDO_ROWIDPAIRオブジェクト型を次のとおり定義します。
CREATE TYPE sdo_rowidpair AS OBJECT (rowid1 VARCHAR2(24), rowid2 VARCHAR2(24));
SDO_ROWIDPAIRの定義では、rowid1
はtable_name1
のROWIDを示し、rowid2
はtable_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ではなく)を指定します。(ただし、その他すべての空間ファンクション、空間プロシージャおよび空間演算子には、<table_name>
_LT
名は使用できません。)
表20-3に、params
パラメータのキーワードを示します。
表20-3 SDO_JOIN演算子のparamsキーワード
キーワード | 説明 |
---|---|
mask |
空間結合の位相関係を指定します。有効な値は、'mask=<value>'です。<value>は、SDO_RELATE演算子に有効な1つ以上のマスク値( このパラメータがNULLであるか、または空の文字列を含む場合、 |
距離 |
関係チェックが実行される前に許容差(「許容差」を参照)に追加される距離値を数値で指定します。たとえば、許容差が10 mのときに |
unit |
距離値に関連付ける測定単位を指定します( |
SDO_JOINをコールする前に、セッション内で前のすべてのDML文をコミットする必要があります。コミットしない場合、「ORA-13236: R-treeの処理で内部エラーが発生しました: [SDO_Join in active txns not supported]」
というエラーが戻されます。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、「3次元の空間オブジェクト」を参照してください。
自己結合の最適化
自己結合(table_name1
およびtable_name2
が同じ表を指定)を実行する場合、自己結合を最適化することでパフォーマンスを向上できます。
マスク(ANYINTERACT
など)または距離を指定せずにSDO_JOINをコールすると、結合される2つのジオメトリ列の索引構造のみが比較されます。これで、相互に作用するジオメトリのペアを簡単に識別することができます。マスクまたは距離を指定してSDO_JOINをコールすると、相互に作用するジオメトリのペアを識別するために索引が使用された後、ジオメトリのペアが実際に相互作用しているかどうかを確認するためにジオメトリの座標も比較されます。座標の比較は、SDO_JOINの操作で最もコストの高い動作になります。
同じジオメトリ列をそれ自身と比較する自己結合では、各ジオメトリ・ペアが結果セットで2回戻されます。次に例を示します。
-
ID値(1,2)を持つジオメトリ・ペアの場合、そのペア(2,1)も戻されます。SDO_JOINでは、同じジオメトリ・ペアの座標が、不要であるにもかかわらず、1回ではなく2回比較されます。
-
同じIDペアが2回戻されます。たとえば、50,000行を持つ表では、IDペア(1,1)が2回、IDペア(2,2)が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が空間表T1 (および索引表MDRT_F9AA$)を所有し、ユーザーBが空間表T2を所有し、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表をその表自体と結合し、各ジオメトリを調べてその表と空間的に相互作用する他のすべてのジオメトリを検索します。(例では、「空間データの挿入、索引付けおよび問合せの例」の定義およびデータを使用しています。)この例では、rowid1
およびrowid2
は、SDO_ROWIDPAIR型の定義内の属性名に対応しています。出力で、cola_d
(円)がそれ自体とのみ相互作用し、他のジオメトリとは相互作用していないことに注意してください。
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.
関連トピック
親トピック: 空間演算子
20.9 SDO_NN
構文
SDO_NN(geometry1, geometry2, param [, number]);
説明
最も近くにあるジオメトリを識別します。
キーワードおよびパラメータ
値 | 説明 |
---|---|
geometry1 |
表のジオメトリ列を指定します。この列には空間索引が必要です。データ型はSDO_GEOMETRYです。 |
geometry2 |
表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。 |
param |
演算子の処理を指定します。表20-4に、使用可能なキーワードを示します。このパラメータを指定しない場合、演算子によって、すべての行が |
number |
SDO_NNへのコールにSDO_NN_DISTANCE補助演算子が含まれている場合、SDO_NN_DISTANCEへのコールに使用されている数と同じ数を指定します。データ型はNUMBERです。 |
表20-4に、param
パラメータのキーワードを示します。
表20-4 SDO_NN Paramパラメータのキーワード
キーワード | 説明 |
---|---|
距離 |
最も近くにあるものの検索を中止する、距離単位の数を指定します。 例: 'distance=10 unit=mile' |
ellipsoidal |
測地データに楕円体距離を常に使用するか( 例: 'ellipsoidal=true' |
sdo_batch_size |
WHERE句を満たす結果の数を戻すためにSDO_NN式の評価を2回以上行う必要がある場合、一度に評価される行の数を指定します。Rツリー索引が使用される場合のみ使用可能です。 例: 'sdo_batch_size=10' |
sdo_num_res |
戻される結果(最も近くにあるもの)の数を指定します。 例: 'sdo_num_res=5' |
unit |
SDO_NNへのコールに 例: 'unit=KM' |
戻り値
この演算子では、問合せでgeometry2
の最も近くにある、sdo_num_res
に指定した数のオブジェクトをgeometry1
から戻します。2つのジオメトリ・オブジェクトの近さを決定する際、各オブジェクトの表面上の2点間の最短距離が使用されます。
使用上のノート
ノート:
SDO_NN演算子は、共有デプロイメントのOracle Autonomous DatabaseインスタンスでOracle JVMが有効になっている場合にのみサポートされます。Oracle JVMを有効にするには、共有ExadataインフラストラクチャでのOracle Autonomous Databaseの使用のOracle Javaの使用を参照してください。表に空間索引が含まれない場合、または索引の作成時に指定された次元数と問合せウィンドウの次元数が一致しない場合、この演算子は無効になります。
この演算子は、常にWHERE句で使用される必要があり、この演算子を含む条件式は、SDO_NN(arg1, arg2, '<some_parameter>') = 'TRUE'の形式である必要があります。(式は'TRUE'以外のどの値とも等しくない必要があります。)
この演算子は、次の方法で使用できます。
-
レイヤーのすべてのジオメトリが候補である場合、
sdo_num_res
キーワードを使用して、戻されるジオメトリの数を指定します。sdo_num_res
キーワードは、近接性のみを考慮する場合に特に役立ちます(たとえば、銀行名に関係なく、最も近い3つの銀行など)。 -
表のジオメトリが、WHERE句で指定されたジオメトリより近くにある場合、
sdo_batch_size
キーワードを使用し、WHERE句(ROWNUM疑似列を含む)を使用して、戻されるジオメトリの数を制限します。sdo_batch_size
キーワードは、同じ表の1つ以上の列を、WHERE句の最も近くにある検索列として考慮する必要がある場合に特に役立ちます(たとえば、名前にMegaBankが含まれる最も近い3つの銀行など)。 -
また、「使用上のノート」で後述するように、
sdo_num_res
キーワードとsdo_batch_size
キーワードの両方を指定することもできます。
sdo_batch_size
キーワードの例のように、RESTAURANTS表に様々なタイプのレストランが含まれ、ホテルに最も近い2軒のイタリアン・レストラン(ただし、2マイル以内)を検索する必要があると想定します。問合せは次のようになります。
SELECT r.name FROM restaurants r WHERE SDO_NN(r.geometry, :my_hotel, 'sdo_batch_size=10 distance=2 unit=mile') = 'TRUE' AND r.cuisine = 'Italian' AND ROWNUM <=2;
この例では、CUISINEがItalian
である場合、結果が3つ以上戻されないように制限するには、ROWNUM <=2
句を指定する必要があります。ただし、この例でsdo_batch_size
キーワードが指定されず、またsdo_num_res=2
がROWNUM <=2
のかわりに指定されている場合、CUISINE値に関係なく、2マイル以内にある最も近い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 and Graphによって計算されます。ただし、計算されたバッチ・サイズが最適ではない場合もあり、この計算によって処理オーバーヘッドが発生する場合もあります。問合せに対する適切なsdo_batch_size
値を判断できる場合は、sdo_batch_size=0
を指定した場合より高いパフォーマンスを得ることができます。
SDO_NNへのコールでSDO_NN_DISTANCE
補助演算子を使用している場合のみ、numberパラメータを指定します。この章に示すSDO_NN_DISTANCE演算子の項を参照してください。
geometry2
からの距離が等しい2つ以上のオブジェクトがgeometry1
から戻される場合、ファンクションをコールするたびにどのオブジェクトでも戻される可能性があります。たとえば、item_a
、item_b
およびitem_c
がgeometry2
に最も近く、かつ等しい距離にある場合、sdo_num_res=2
を指定すると、これら3つのオブジェクトのうちの2つが戻されますが、3つのすべてのオブジェクトが、戻される2つのオブジェクトになる可能性があります。
SDO_NN演算子でパーティション化された空間索引(「パーティション空間索引の使用」を参照)が使用される場合、問合せ条件に基づく候補行が含まれるパーティションごとに、要求された数のジオメトリが戻されます。たとえば、ある点に最も近い5軒のレストランを要求し、空間索引が4つのパーティションを持つ場合、この演算子によって最大20 (5×4)のジオメトリが戻されます。この場合、ROWNUM疑似列(この場合はWHERE ROWNUM <=5
)を使用して、5軒の最も近いレストランを戻す必要があります。
geometry1
およびgeometry2
が異なる座標系に基づいている場合、geometry2
は、「演算子およびファンクションでの座標系が異なるジオメトリの使用」で説明するとおり、操作を実行するため一時的に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, ...;
(ただし、「空間データの挿入、索引付けおよび問合せの例」の例にはCOLA_NAME_IDXという名前の索引は含まれていないことに注意してください。)
SDO_NN演算子とsdo_num_res
キーワードを使用して2つ以上の表を結合する場合、外部表にはLEADINGヒントを、ネステッド・ループ・ジョインを使用するためにUSE_NLヒントを、内部表(空間索引を持つ表)にはINDEXヒントを指定します。次に例を示します。
SELECT /*+ LEADING(b) USE_NL(b a) INDEX(a cola_spatial_idx) */ a.gid FROM cola_qry b, cola_markets a WHERE SDO_NN(a.shape, b.shape, 'sdo_num_res=1')='TRUE';
ただし、SDO_NN演算子、sdo_batch_size
キーワードおよびROWNUM句を使用して2つ以上の表を結合する場合、最適なロジックの実装方法は、PL/SQLブロックを使用することになります。次に例を示します。
BEGIN FOR item IN ( SELECT b.shape FROM cola_qry b) LOOP SELECT /*+ INDEX(a cola_spatial_idx) */ a.gid INTO local_gid FROM cola_markets a WHERE SDO_NN(a.shape, item.shape, 'sdo_batch_size=10')='TRUE' and a.name like 'cola%' and ROWNUM <2; END LOOP; END;
オプティマイザ・ヒントの使用方法については、『Oracle Database SQLチューニング・ガイド』を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、「3次元の空間オブジェクト」を参照してください。
例
次の例では、COLA_MARKETS表のSHAPE列から、指定した点(10,7)に最も近い2つのオブジェクトを検索します。(例では、「空間データの挿入、索引付けおよび問合せの例」に示し、説明している定義およびデータを使用しています。)
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句の条件を満たすかどうかを判断する前に評価する必要がある、最も近いジオメトリの数の最適な推測値を表します。(例では、「空間データの挿入、索引付けおよび問合せの例」の定義およびデータを使用しています。)
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のより複雑な例については、「SDO_NNの例」を参照してください。
関連トピック
親トピック: 空間演算子
20.10 SDO_NN_DISTANCE
構文
SDO_NN_DISTANCE(number);
キーワードおよびパラメータ
値 | 説明 |
---|---|
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つのオブジェクトを検索し、各オブジェクトと点の間の距離を戻します。(例では、「空間データの挿入、索引付けおよび問合せの例」に示し、説明している定義およびデータを使用しています。)
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_NN_DISTANCEの
number
パラメータに1が使用されます。また、SDO_NNの最後のパラメータ('sdo_num_res=2'
の後)に1が指定されます。 -
列の別名
dist
には、オブジェクトと点の間の距離が含まれます。(測地データの場合、距離の単位はmです。非測地データの場合、距離の単位はデータに関連付けられた単位です。)
次の例では、sdo_batch_size
キーワードを使用して、様々な業種を含むYELLOW_PAGES表からホテルに最も近い2軒のイタリアン・レストランを選択します。
SELECT * FROM (SELECT /*+ FIRST_ROWS */ y.name FROM YELLOW_PAGES y WHERE SDO_NN(y.geometry, :my_hotel, 'sdo_batch_size=100', 1) = 'TRUE' AND y.business = 'Italian Restaurant' ORDER BY SDO_NN_DISTANCE(1)) WHERE ROWNUM <=10;
前述の問合せでは、FIRST_ROWSヒントにより、空間索引にORDER BY操作をプッシュして、オプティマイザのパフォーマンスを向上できます。 :my_hotel
は、バインド変数またはリテラル値のいずれかです。
FIRST_ROWSヒントは、ローカル・パーティション空間索引でも使用できます。前述の例では、YELLOW_PAGES表が名前でパーティション化されている場合、問合せは次のように実行されます。
-
パーティションごとに、10行が検出されるまで、空間索引を使用してORDER BY操作が処理されます。
-
すべてのパーティションが完了すると、前述のステップで検出されたすべての行がソートされ、上位10行が戻されます。
関連トピック
親トピック: 空間演算子
20.11 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 and Graphで使用される9交差モデルについては、「空間関係およびフィルタ処理」を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、「3次元の空間オブジェクト」を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)とON関係を持つジオメトリを検索します。(例では、「空間データの挿入、索引付けおよび問合せの例」に示し、説明している定義およびデータを使用しています。)この例では、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
親トピック: 空間演算子
20.12 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 and Graphで使用される9交差モデルについては、「空間関係およびフィルタ処理」を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、「3次元の空間オブジェクト」を参照してください。
例
次の例では、線ストリング・ジオメトリ(ここでは、(0,6)から(2,6)の水平な線)とOVERLAPBDYDISJOINT関係があるジオメトリを検索します。(例では、「空間データの挿入、索引付けおよび問合せの例」に示し、説明している定義およびデータを使用しています。)この例では、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
親トピック: 空間演算子
20.13 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 and Graphで使用される9交差モデルについては、「空間関係およびフィルタ処理」を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、「3次元の空間オブジェクト」を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)とOVERLAPBDYINTERSECT関係を持つジオメトリを検索します。(例では、「空間データの挿入、索引付けおよび問合せの例」に示し、説明している定義およびデータを使用しています。)この例では、cola_a
、cola_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
親トピック: 空間演算子
20.14 SDO_OVERLAPS
構文
SDO_OVERLAPS(geometry1, geometry2);
説明
表内のジオメトリが特定のジオメトリと重なっているかどうか(OVERLAPBDYDISJOINTまたはOVERLAPBDYINTERSECT位相関係があるかどうか)を確認します。SDO_RELATE演算子に'mask=OVERLAPBDYDISJOINT+OVERLAPBDYINTERSECT'
を含めて指定する場合と同じです。
この演算子で実行される操作および使用要件については、この章に示すSDO_RELATE演算子の項を参照してください。
Spatial and Graph演算子での3Dサポート(計算時に3次元すべてを考慮する演算子または考慮しない演算子)については、「3次元の空間オブジェクト」を参照してください。
キーワードおよびパラメータ
値 | 説明 |
---|---|
geometry1 |
表のジオメトリ列を指定します。この列の空間索引をお薦めします。データ型はSDO_GEOMETRYです。 |
geometry2 |
表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。 |
戻り値
式SDO_OVERLAPS(geometry1,geometry2) = 'TRUE'は、OVERLAPBDYDISJOINTまたはOVERLAPBDYINTERSECT位相関係を持つオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。
使用上のノート
演算子がTRUEと評価されるには、ジオメトリが2つのポリゴン、2つの線または2つの複数点である必要があります。たとえば、1つのジオメトリが線で、もう1つがポリゴンの場合、重なることはできません。
この章のSDO_RELATE演算子の「使用上のノート」を参照してください。
位相関係およびSpatial and Graphで使用される9交差モデルについては、「空間関係およびフィルタ処理」を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)と重なるジオメトリを検索します。(例では、「空間データの挿入、索引付けおよび問合せの例」に示し、説明している定義およびデータを使用しています。)この例では、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
親トピック: 空間演算子
20.15 SDO_POINTINPOLYGON
構文
SDO_POINTINPOLYGON(cur, geom_obj, tol, params) RETURN ANYDATASET;
説明
一連の行をとり、指定されたポリゴン・ジオメトリ内のこれらの行を戻します。
キーワードおよびパラメータ
値 | 説明 |
---|---|
cur |
次のうちの1つ。
|
geom_obj |
空間ジオメトリ・オブジェクト: 表のジオメトリか、ジオメトリの一時的なインスタンスのどちらかで、 |
tol |
許容差(「許容差」を参照)。0.0より大きい値を指定する必要があります。データ型はNUMBERです。 |
params |
キーワードと値を指定する、オプションのパラメータ文字列です。演算子の処理を指定します。使用可能なキーワードについては、「使用上のノート」の表20-5を参照してください。データ型はVARCHAR2です。デフォルトはNULLです。 |
戻り値
SDO_POINTINPOLYGONは、ANYDATASET TYPEのオブジェクトを戻します(Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照)。ANYDATASETの出力列は、cur
パラメータで指定されたものになります。
使用上のノート
厳密には、SDO_POINTINPOLYGONは演算子ではなくテーブル・ファンクションです。(テーブル・ファンクションについては、『Oracle Database PL/SQL言語リファレンス』を参照してください。)ただし、使用方法が演算子に類似し、他のファンクションおよびプロシージャと同じパッケージに同梱されていないため、空間演算子の章で説明しています。
cur
パラメータで使用されるSQL文では、WHERE句に任意の数の条件を指定できます。結果の行をSDO_POINTINPOLYGON演算子に渡す前に、この機能を使用して他の属性でデータをフィルタできます。
出力列は入力列と同一ですが、戻された行のみが選択基準に一致したものになります。
表20-5に、params
パラメータのキーワードを示します。
20-5 SDO_POINTINPOLYGON演算子のparamsキーワード
キーワード | 説明 |
---|---|
mask |
対象の位相関係。有効な値は、'mask=<value>'です(<value>は、
このパラメータがNULLであるか、または空の文字列を含む場合、 |
sdo_batch_size |
バッチで処理される最大行数を指定します。デフォルト値は4000で、最大値は32768です。データ型はNUMBERです。 例: 'sdo_batch_size=5000' |
パラレル問合せサーバーを使用するには、次のいずれかを実行します。
-
/*+ PARALLEL(
<table alias>, <n>
) */
オプティマイザ・ヒントを指定します。<table_alias>は、指定された表の別名で、<n>は並列度です。 -
適切な権限のアカウントで次のコマンドを入力し、パラレル問合せの実行を有効にします。
ALTER SESSION FORCE PARALLEL QUERY;
例
次の例では、COLA_MARKETS表のデータに基づいて、COLA_MARKET_POINTSという新しい表を作成します(「空間データの挿入、索引付けおよび問合せの例」を参照)。次に、MKT_ID列の値が1より大きい各ジオメトリ内の点を選択します。(SDO_UTIL.INTERIOR_POINTファンクションを使用して、問合せ条件に一致する各ジオメトリ内に存在する点を取得します。)
-- Create a new table with a different name based on the data from the -- COLA_MARKETS table. This table has four columns: X, Y, MKT_ID, and NAME. CREATE TABLE cola_market_points AS SELECT a.point.sdo_point.x X, a.point.sdo_point.y Y, MKT_ID, NAME FROM ( SELECT mkt_id, name, sdo_util.interior_point(shape) point FROM cola_markets) a; -- Limit to MKT_ID > 1. Also, use the PARALLEL hint. SELECT /*+ PARALLEL(a, 4) */ * FROM TABLE(sdo_PointInPolygon( CURSOR(select * from cola_market_points where mkt_id > 1), SDO_GEOMETRY( 2003, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1, 1003, 1), MDSYS.SDO_ORDINATE_ARRAY(1, 1, 8, 1, 8, 6, 5, 7, 1, 1)), 0.05)) a; X Y MKT_ID NAME ---------- ---------- ---------- -------------------------------- 6.3125 2.875 2 cola_b 4.6875 3.875 3 cola_c
次の例では、前の例と同じSDO_POINTINPOLYGON問合せを実行しますが、COLA_MARKET_POINTS表を作成する必要はなく、MKT_ID列値が1より大きい行ごとに、X座標とY座標のペアではなく、点ジオメトリが戻されます。(出力は、簡単に読むことができるように、再フォーマットされています。)
-- Limit to MKT_ID > 1. Also, use the PARALLEL hint. SELECT /*+ PARALLEL(a, 4) */ name, mkt_id, point FROM TABLE(sdo_PointInPolygon( CURSOR(select sdo_util.interior_point(shape) point, mkt_id, name from cola_markets where mkt_id > 1), SDO_GEOMETRY 2003, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1, 1003, 1), MDSYS.SDO_ORDINATE_ARRAY(1, 1, 8, 1, 8, 6, 5, 7, 1, 1)), 0.05)) a; NAME MKT_ID POINT(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES) ------ ------- ---------------------------------------------------------------------------- cola_b 2 SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(6.3125, 2.875, NULL), NULL, NULL) cola_c 3 SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(4.6875, 3.875, NULL), NULL, NULL)
次の例はWHERE句でバインド変数を使用して、params
文字列を指定します。PIP_DATAという名前の表が存在すると想定しています。
DECLARE my_cursor SYS_REFCURSOR; my_pip_cursor SYS_REFCURSOR; stmt varchar2(2000); cnt number; BEGIN stmt := 'SELECT count(*) FROM ' || ' TABLE (Sdo_PointInPolygon(' || 'CURSOR(select * from pip_data where x < :x1),' || ' :g1, :tol, ''mask=DISJOINT sdo_batch_size=6000'')) '; open my_cursor for stmt using 100, -- :x1 SDO_GEOMETRY( 2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARRAY(10, 10, 70,10, 70, 70, 50,70, 40,50, 20,70, 10,70, 10,10)), -- :g1 0.05; -- :tol FETCH my_cursor into cnt; dbms_output.put_line(to_char(cnt)); END; /
関連トピック
親トピック: 空間演算子
20.16 SDO_RELATE
構文
SDO_RELATE(geometry1, geometry2, param);
説明
特定のオブジェクト(対象領域など)と空間的に特定の相互作用がある空間オブジェクト、または空間的に特定の相互作用がある空間オブジェクトのペアを識別します。
この演算子は、1次フィルタおよび2次フィルタ処理を実行します。
キーワードおよびパラメータ
値 | 説明 |
---|---|
geometry1 |
表のジオメトリ列を指定します。この列の空間索引をお薦めします。データ型はSDO_GEOMETRYです。 |
geometry2 |
表のジオメトリまたはジオメトリの一時的なインスタンスを指定します。(バインド変数またはSDO_GEOMETRYコンストラクタを使用して指定します。)データ型はSDO_GEOMETRYです。 |
param |
下位互換性のために、リリース1 (10.1)より前のリリースでサポートされていた、 |
戻り値
式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
が表またはビューからのものである場合、LEADINGオプティマイザ・ヒントは不要ですが、問合せの駆動表またはビューがgeometry2
を含むものであることをオプティマイザに通知するのに役立つ場合があります。LEADINGヒントで指定される表またはビューは、geometry2
を含んでいる表名またはビュー名に対応している必要があります。表またはビューがFROM句で別名指定されている場合は、LEADINGヒントに別名を指定する必要があります。
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)の矩形)と相互作用するジオメトリを選択します。(例では、「空間データの挿入、索引付けおよび問合せの例」に示し、説明している定義およびデータを使用しています。)
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の値を検索します。この例では、LEADINGオプティマイザ・ヒントを使用し、FROM句の最初にQUERY_POLYS (geometry2
)表を指定します。これは、geometry2
の複数のジオメトリが含まれるためです(「使用上のノート」を参照)。
SELECT /*+ LEADING(B) */ A.gid FROM query_polys B, polygons A WHERE SDO_RELATE(A.Geometry, B.Geometry, 'mask=ANYINTERACT') = 'TRUE';
関連トピック
親トピック: 空間演算子
20.17 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 and Graphで使用される9交差モデルについては、「空間関係およびフィルタ処理」を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、「3次元の空間オブジェクト」を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(1,1)、右上の座標が(5,7)の矩形)とTOUCH関係を持つジオメトリを検索します。(例では、「空間データの挿入、索引付けおよび問合せの例」の定義およびデータを使用しています。)この例では、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
親トピック: 空間演算子
20.18 SDO_WITHIN_DISTANCE
構文
SDO_WITHIN_DISTANCE(geometry1, aGeom, params);
説明
指定されたオブジェクト(対象領域または対象となる点など)の、指定された距離内にある空間オブジェクトのセットを識別します。
キーワードおよびパラメータ
値 | 説明 |
---|---|
geometry1 |
表のジオメトリ列を指定します。この列には、オブジェクト( |
aGeom |
|
params |
1つ以上のキーワード(値を含む)を引用符で囲んで、演算子の動作を判断する文字列を指定します。後続の項目( |
距離 |
距離値を指定します。座標系がジオメトリに関連付けられている場合、距離の単位は座標系に関連付けられた単位であると想定されます。これは必須キーワードです。データ型はNUMBERです。 |
ellipsoidal |
測地データに楕円体距離を常に使用するか( 例: 'ellipsoidal=true' |
max_resolution |
ジオメトリのMBRのうち少なくとも1つの辺が指定値以下のジオメトリのみを含みます。たとえば、 |
min_resolution |
ジオメトリのMBRのうち少なくとも1つの辺が指定値以上のジオメトリのみを含みます。たとえば、 |
querytype |
|
unit |
測定単位( |
戻り値
式SDO_WITHIN_DISTANCE(arg1, arg2, arg3) = 'TRUE'は、指定した距離内にあるオブジェクトの組合せに対してTRUEを戻し、そうでない場合はFALSEを戻します。
使用上のノート
ノート:
SDO_WITHIN_DISTANCE演算子は、共有デプロイメントのOracle Autonomous DatabaseインスタンスでOracle JVMが有効になっている場合にのみサポートされます。Oracle JVMを有効にするには、共有ExadataインフラストラクチャでのOracle Autonomous Databaseの使用のOracle Javaの使用を参照してください。2つの拡張オブジェクト(たとえば、線やポリゴンなど、点のないオブジェクト)の距離は、それら2つのオブジェクト間の最短距離です。そのため、2つの隣接したポリゴン間の距離は0(ゼロ)です。
問合せウィンドウの次元数が、空間索引(使用している場合)の作成時に指定された次元数と一致しない場合、演算子は無効になります。
この演算子は、常にWHERE句で使用される必要があり、この演算子を含む条件は、次の形式である必要があります。
SDO_WITHIN_DISTANCE(arg1, arg2, 'distance = <some_dist_val>') = 'TRUE'
(式は'TRUE'以外のどの値とも等しくない必要があります。)
ジオメトリ列には、空間索引が作成されている必要があります。測地データの場合、空間索引がRツリー索引である必要があります。
SDO_WITHIN_DISTANCEは、空間結合でサポートされていません。within-distance演算子で空間結合を実行する方法については、「Within-Distance演算子」を参照してください。
空間演算子での3Dサポート(計算時にすべての3次元を考慮する演算子または考慮しない演算子)については、「3次元の空間オブジェクト」を参照してください。
例
次の例では、問合せウィンドウ(ここでは、左下の座標が(4,6)、右上の座標が(8,8)の矩形)から10距離以内のジオメトリを選択します。(例では、「空間データの挿入、索引付けおよび問合せの例」に示し、説明している定義およびデータを使用しています。この場合、図中のすべてのジオメトリが戻されます。)
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のより複雑な例については、「SDO_WITHIN_DISTANCEの例」を参照してください。
関連トピック
親トピック: 空間演算子