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

前
次

18.15 SDO_POINTINPOLYGON

書式

SDO_POINTINPOLYGON(cur, geom_obj, tol, params) RETURN ANYDATASET;

説明

1番目の列が点のx座標の値で、2番目の列が点のy座標の値である一連の行を使用して、指定したポリゴン・ジオメトリ内のこれらの行を戻します。

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

説明

cur

REFカーソル: ref_cursorのSQLのSELECTにある最初の2列は、ユーザー表のX点座標とY点座標である必要があります。その2列はNUMBER型である必要があります。(その他の列は、数値型、文字型および日付型の場合があります)。データ型はSYS_REFCURSORです。

geom_obj

空間ポリゴンのジオメトリ・オブジェクト: 表のポリゴン・ジオメトリか、ポリゴン・ジオメトリの一時的なインスタンスのどちらかで、curから選択されたすべての点に対してチェックされます。データ型はSDO_GEOMETRYです。

tol

許容差(「許容差」を参照)。0.0より大きい値を指定する必要があります。データ型はNUMBERです。

params

キーワードと値を指定する、オプションのパラメータ文字列です。演算子の処理を指定します。使用可能なキーワードについては、「使用上の注意」の表18-5を参照してください。データ型はVARCHAR2です。デフォルトはNULLです。

戻り値

SDO_POINTINPOLYGONは、ANYDATASET TYPEのオブジェクトを戻します(Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照)。ANYDATASETの出力列は、curパラメータで指定されたものになります。

使用上の注意

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

curパラメータで使用されるSQL文では、WHERE句に任意の数の条件を指定できます。結果の行をSDO_POINTINPOLYGON演算子に渡す前に、この機能を使用して他の属性でデータをフィルタできます。

出力列は入力列と同一ですが、戻された行のみが選択基準に一致したものになります。

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

18-5 SDO_POINTINPOLYGON演算子のparamsキーワード

キーワード 説明

mask

位相関係を指定します。有効な値は'mask=<value>'です。<value>は、ANYINTERACTTOUCHONINSIDEおよびDISJOINTの1つ以上の組合せです。(TOUCHおよびONは、このコンテキストのシノニムです。)

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

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という新しい表を作成します(「空間データの挿入、索引付けおよび問合せの例」 および図2-1を参照)。次に、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

次の例は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;
/