21 空間集計ファンクション

この章では、空間集計ファンクションのリファレンスおよび使用方法を示します。

空間集計ファンクションの使用方法については、「空間集計ファンクション」を参照してください。

これらのほとんどの集計ファンクションには、SDOAGGRTYPE型のパラメータ(「SDOAGGRTYPEオブジェクト型」を参照)を指定できます。

ノート:

2次元と3次元の両方のジオメトリでサポートされているSDO_AGGR_MBR以外の空間集計ファンクションは、2次元ジオメトリでのみサポートされています。

21.1 SDO_AGGR_CENTROID

構文

SDO_AGGR_CENTROID(
     AggregateGeometry  SDOAGGRTYPE 
     ) RETURN SDO_GEOMETRY;

説明

指定されたジオメトリ・オブジェクトの中心(重心)にあるジオメトリ・オブジェクトを戻します。

パラメータ

AggregateGeometry

ジオメトリ列および次元配列を指定するSDOAGGRTYPE型のオブジェクト(「SDOAGGRTYPEオブジェクト型」を参照)を指定します。

使用上のノート

このファンクションの動作は、ジオメトリ・オブジェクトがポリゴンのみで構成されるか、点のみで構成されるか、またはポリゴンと点が混在するかによって異なります。

  • ジオメトリ・オブジェクトがポリゴンのみで構成される場合、すべてのオブジェクトの中心が戻されます。

  • ジオメトリ・オブジェクトが点のみで構成される場合、すべてのオブジェクトの中心が戻されます。

  • ジオメトリ・オブジェクトにポリゴンと点が混在する(1つ以上のポリゴンと1つ以上の点が含まれる)場合、点は無視され、すべてのポリゴンの中心が戻されます。

結果は、ジオメトリ・オブジェクトの各ポリゴンの面積によって重み付けされます。ジオメトリ・オブジェクトにポリゴンおよび点が混在する場合、中心の計算では点が使用されません。ジオメトリ・オブジェクトがすべて点で構成される場合、それらの点は均等に重み付けされます。

SDO_GEOM.SDO_CENTROIDファンクションの詳細は、「SDO_GEOMパッケージ(ジオメトリ)」を参照してください。

次の例では、COLA_MARKETS表のジオメトリ・オブジェクトの中心を戻します。(例では、「空間データの挿入、索引付けおよび問合せの例」の定義およびデータを使用しています。)

SELECT SDO_AGGR_CENTROID(SDOAGGRTYPE(shape, 0.005))
  FROM cola_markets;

SDO_AGGR_CENTROID(SDOAGGRTYPE(SHAPE,0.005))(SDO_GTYPE, SDO_SRID, SDO_POINT
--------------------------------------------------------------------------------
SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(5.21295938, 5.00744233, NULL), NULL, NUL
L)

21.2 SDO_AGGR_CONCAT_LINES

構文

SDO_AGGR_CONCAT_LINES(
     geom  SDO_GEOMETRY 
     ) RETURN SDO_GEOMETRY;

説明

指定された単一線または複数線のジオメトリを連結するジオメトリを戻します。

パラメータ

geom

ジオメトリ・オブジェクトを指定します。

使用上のノート

各入力ジオメトリは、単一線または複数線の2次元ジオメトリ(SDO_GTYPE値が2002または2006)である必要があります。このファンクションは、LRSジオメトリではサポートされません。LRSジオメトリ・セグメントの集計連結を実行するには、SDO_AGGR_LRS_CONCAT空間集計ファンクションを使用します。

入力ジオメトリは、頂点が直線セグメントに連結している線ストリングである必要があります。円弧および複合線ストリングはサポートされていません。

いずれかの入力ジオメトリが複数線のジオメトリである場合は、ジオメトリの各要素は非接続である必要があります。非接続でない場合、このファンクションは不適切な結果を戻すことがあります。

連結される各ペアのジオメトリ間の位相関係は、DISJOINTまたはTOUCHである必要があります。位相関係がTOUCHの場合、ジオメトリは2つの終了点でのみ交差する必要があります。

SDO_UTIL.CONCAT_LINESファンクション(「SDO_UTILパッケージ(ユーティリティ)」を参照)を使用すると、2つの単一線または複数線のジオメトリを連結できます。

いずれかの入力ジオメトリが単一線または複数線のジオメトリではない場合、またはすべての入力ジオメトリが同じ座標系に基づいていない場合、例外が発生します。

次の例では、2つの線ジオメトリをCOLA_MARKETS表に挿入し、これらのジオメトリの集計連結を戻します。(例では、「空間データの挿入、索引付けおよび問合せの例」のデータ定義を使用しています。)

-- First, insert two line geometries.
INSERT INTO cola_markets VALUES(1001, 'line_1', SDO_GEOMETRY(2002, NULL, NULL, 
  SDO_ELEM_INFO_ARRAY(1,2,1), SDO_ORDINATE_ARRAY(1,1, 5,1)));
INSERT INTO cola_markets VALUES(1002, 'line_2', SDO_GEOMETRY(2002, NULL, NULL, 
  SDO_ELEM_INFO_ARRAY(1,2,1), SDO_ORDINATE_ARRAY(5,1, 8,1)));
-- Perform aggregate concatenation of all line geometries in layer.
SELECT SDO_AGGR_CONCAT_LINES(c.shape) FROM cola_markets c
   WHERE c.mkt_id > 1000;

SDO_AGGR_CONCAT_LINES(C.SHAPE)(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM
--------------------------------------------------------------------------------
SDO_GEOMETRY(2002, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1), SDO_ORDINATE_ARRAY(
1, 1, 5, 1, 8, 1)) 

21.3 SDO_AGGR_CONCAVEHULL

構文

SDO_AGGR_CONCAVEHULL(
     AggregateGeometry  SDOAGGRTYPE 
     ) RETURN SDO_GEOMETRY;

説明

指定されたジオメトリ・オブジェクトの凹型部分であるジオメトリ・オブジェクトを戻します。

パラメータ

AggregateGeometry

ジオメトリ列および次元配列を指定するSDOAGGRTYPE型のオブジェクト(「SDOAGGRTYPEオブジェクト型」を参照)を指定します。

使用上のノート

SDO_GEOM.SDO_CONCAVEHULLファンクションの詳細は、「SDO_GEOMパッケージ(ジオメトリ)」を参照してください。

次の例では、COLA_MARKETS表のジオメトリ・オブジェクトの凹型部分を戻します。(例では、「空間データの挿入、索引付けおよび問合せの例」の定義およびデータを使用しています。)

SELECT SDO_AGGR_CONCAVEHULL(SDOAGGRTYPE(shape, 0.005))
  FROM cola_markets;

SDO_AGGR_CONCAVEHULL(SDOAGGRTYPE(SHAPE,0.005))(SDO_GTYPE, SDO_SRID, SDO_POINT(X,
--------------------------------------------------------------------------------
SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARR
AY(3, 3, 5, 1, 8, 1, 10, 1, 12, 1, 14, 1, 14, 5, 13, 9, 14, 10, 14, 13, 12, 15,
10, 14, 10, 13, 8, 11, 6, 12, 5, 13, 2, 11, 6, 10, 6, 9, 5, 7, 4, 5, 2, 4, 3, 3)
)

21.4 SDO_AGGR_CONVEXHULL

構文

SDO_AGGR_CONVEXHULL(
     AggregateGeometry  SDOAGGRTYPE 
     ) RETURN SDO_GEOMETRY;

説明

指定されたジオメトリ・オブジェクトの凸型部分であるジオメトリ・オブジェクトを戻します。

パラメータ

AggregateGeometry

ジオメトリ列および次元配列を指定するSDOAGGRTYPE型のオブジェクト(「SDOAGGRTYPEオブジェクト型」を参照)を指定します。

使用上のノート

SDO_GEOM.SDO_CONVEXHULLファンクションの詳細は、「SDO_GEOMパッケージ(ジオメトリ)」を参照してください。

次の例では、COLA_MARKETS表のジオメトリ・オブジェクトの凸型部分を戻します。(例では、「空間データの挿入、索引付けおよび問合せの例」の定義およびデータを使用しています。)

SELECT SDO_AGGR_CONVEXHULL(SDOAGGRTYPE(shape, 0.005))
  FROM cola_markets;

SDO_AGGR_CONVEXHULL(SDOAGGRTYPE(SHAPE,0.005))(SDO_GTYPE, SDO_SRID, SDO_POI
--------------------------------------------------------------------------------
SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARR
AY(8, 1, 10, 7, 10, 11, 8, 11, 6, 11, 1, 7, 1, 1, 8, 1))

21.5 SDO_AGGR_LRS_CONCAT

構文

SDO_AGGR_LRS_CONCAT(
     AggregateGeometry  SDOAGGRTYPE 
     ) RETURN SDO_GEOMETRY;

説明

指定されたLRSジオメトリを連結するLRSジオメトリを戻します。

パラメータ

AggregateGeometry

ジオメトリ列および次元配列を指定するSDOAGGRTYPE型のオブジェクト(「SDOAGGRTYPEオブジェクト型」を参照)を指定します。

使用上のノート

このファンクションは、任意の数のLRSジオメトリの集計連結を実行します。ジオメトリを連結する順序を制御する必要がある場合、NO_MERGEオプティマイザ・ヒントおよびORDER BY句を指定した副問合せを使用する必要があります。(例を参照)

結果のセグメントの方向は、連結内の最初のジオメトリの方向と同じになります。

このファンクションは3D形式(SDO_AGGR_LRS_CONCAT_3D)が使用可能です。LRSファンクションの3D形式については、「LRSファンクションの3D形式」を参照してください。)

Spatial and Graphの線形参照システムについては、「線形参照システム」を参照してください。

次の例では、LRS_ROUTES表にLRSジオメトリを追加し、次に、表に含まれるLRSジオメトリを連結する2つの問合せを実行します。最初の問合せでは、連結の順序は制御されません。2番目の問合せで制御されます。2つのセグメントの方向が異なることに注意してください。連結(Route0)の最初のセグメントのメジャー値が降順であるため、2番目の問合せ結果のセグメントのメジャー値は降順です。(この例では、「LRSファンクションの例」の例の定義を使用します。)

-- Add a segment with route_id less than 1 (here, zero).
INSERT INTO lrs_routes VALUES(
  0,
  'Route0',
  SDO_GEOMETRY(
    3302,  -- Line string; 3 dimensions (X,Y,M); 3rd is measure dimension.
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,2,1), -- One line string, straight segments
    SDO_ORDINATE_ARRAY(
      5,14,5,   -- Starting point - 5 is measure from start.
      10,14,0)  -- Ending point - 0 measure (decreasing measure)
  )
);

1 row created.

-- Concatenate all routes (no ordering specified).
SELECT SDO_AGGR_LRS_CONCAT(SDOAGGRTYPE(route_geometry, 0.005))
    FROM lrs_routes;

SDO_AGGR_LRS_CONCAT(SDOAGGRTYPE(ROUTE_GEOMETRY,0.005))(SDO_GTYPE, SDO_SRID
--------------------------------------------------------------------------------
SDO_GEOMETRY(3302, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1), SDO_ORDINATE_ARRAY(
2, 2, 0, 2, 4, 2, 8, 4, 8, 12, 4, 12, 12, 10, 18, 8, 10, 22, 5, 14, 27, 10, 14, 
32))

-- Aggregate concatenation using subquery for ordering.
SELECT 
SDO_AGGR_LRS_CONCAT(SDOAGGRTYPE(route_geometry, 0.005)) 
FROM ( 
             SELECT /*+ NO_MERGE */ route_geometry 
             FROM lrs_routes 
             ORDER BY route_id); 

SDO_AGGR_LRS_CONCAT(SDOAGGRTYPE(ROUTE_GEOMETRY,0.005))(SDO_GTYPE, SDO_SRID
--------------------------------------------------------------------------------
SDO_GEOMETRY(3302, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 2, 1), SDO_ORDINATE_ARRAY(
2, 2, 32, 2, 4, 30, 8, 4, 24, 12, 4, 20, 12, 10, 14, 8, 10, 10, 5, 14, 5, 10, 14
, 0))

21.6 SDO_AGGR_MBR

構文

SDO_AGGR_MBR(
     geom  SDO_GEOMETRY 
     ) RETURN SDO_GEOMETRY;

説明

指定されたジオメトリの最小境界矩形(MBR)(ジオメトリを囲む最小の矩形)を戻します。

パラメータ

geom

ジオメトリ・オブジェクト。

使用上のノート

ノート:

SDO_AGGR_MBRファンクションは、Oracle Autonomous Databaseサーバーレス・デプロイメントでOracle JVMが有効になっている場合にのみサポートされます。Oracle JVMを有効にするには、Oracle Autonomous Databaseサーバーレスの使用Oracle Javaの使用で詳細を参照してください。

このファンクションは、適切なMBRを作成できない場合はMBRジオメトリを戻しません。具体的には、次のとおりです。

  • 入力ジオメトリがすべてNULLである場合、ファンクションはNULLのジオメトリを戻します。

  • 入力ジオメトリ内のすべてのデータが1つの点上にある場合、ファンクションは点を戻します。

  • 入力ジオメトリ内のすべてのデータが直線上に存在する複数の点である場合、ファンクションは2点線を戻します。

SDO_TUNE.EXTENT_OFファンクション(「SDO_TUNEパッケージ(チューニング)」を参照)も、ジオメトリのMBRを戻します。空間索引がジオメトリ列上に定義されている場合、SDO_TUNE.EXTENT_OFファンクションは、SDO_AGGR_MBRファンクションよりも高いパフォーマンスを示します。ただし、SDO_TUNE.EXTENT_OFは2次元ジオメトリに制限されるのに対し、SDO_AGGR_MBRファンクションにはその制限がありません。また、SDO_TUNE.EXTENT_OFファンクションは表内のすべてのジオメトリに対するエクステントを計算しますが、SDO_AGGR_MBRファンクションは、行のサブセット上での操作が可能です。

次の例では、COLA_MARKETS表のジオメトリ・オブジェクトの最小境界矩形を戻します。(例では、「空間データの挿入、索引付けおよび問合せの例」の定義およびデータを使用しています。)

SELECT SDO_AGGR_MBR(shape) FROM cola_markets;

SDO_AGGR_MBR(C.SHAPE)(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SD
--------------------------------------------------------------------------------
SDO_GEOMETRY(2003, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 3), SDO_ORDINATE_ARR
AY(1, 1, 10, 11)) 

21.7 SDO_AGGR_SET_UNION

構文(SDO_AGGRパッケージのファンクションとして)

SDO_AGGR.SDO_AGGR_SET_UNION(
     geometry SDO_GEOMETRY_ARRAY, 
     tol      NUMBER 
     ) RETURN SDO_GEOMETRY;

または

SDO_AGGR.SDO_AGGR_SET_UNION(
     cur  SYS_REFCURSOR,
     tol  NUMBER      
     ) RETURN SDO_GEOMETRY;

構文(空間集計ファンクションとして[非推奨])

SDO_AGGR_SET_UNION(
     geometry  SDO_GEOMETRY_ARRAY, 
     tol       NUMBER 
     ) RETURN SDO_GEOMETRY;

説明

SDO_GEOMETRYオブジェクトの入力VARRAYまたはREFカーソルからすべてのジオメトリ・オブジェクトの集計和集合を戻します。

パラメータ

geometry

SDO_GEOMETRY_ARRAYオブジェクト型のジオメトリ・オブジェクトの配列で、VARRAY OF SDO_GEOMETRYとして定義されます。

cur

ジオメトリ・オブジェクトを戻すREFカーソルは、すべてのジオメトリ・オブジェクトの集計和集合を戻します。

tol

許容差(「許容差」を参照)。

使用上のノート

ノート:

Oracle Database Release 12c (12.1)では、空間集計ファンクションとしての形式は非推奨となり、次回のメジャー・リリースで削除されます。

かわりに、SDO_AGGR.SDO_AGGR_SET_UNIONファンクションの形式のいずれかを使用できます。

SDO_AGGR_SET_UNIONは、SDO_AGGR_UNIONよりパフォーマンスは高速になりますが柔軟性は低下するので、SDO_AGGR_SET_UNIONは、パフォーマンスが特に重要で、必要な機能を満たす場合にのみ使用を考えてください。

SDO_AGGR_UNIONは、SQLの集計ファンクションなので非常に柔軟であり、複雑なSQL GROUP BY句と使用できます。ただし、SDO_AGGR_SET_UNIONはSDO_AGGR_UNIONより格段に高速です。SDO_AGGR_SET_UNIONは、グループ化されるジオメトリがコレクションに容易に集合できる場合に有効です(SDO_GEOMETRYオブジェクトのVARRAYなど)。

SDO_AGGR_SET_UNION:

  • 重なっているポリゴンのセットは集計できません。重なっているポリゴンの場合は、SDO_AGGR_UNIONを使用します。

  • 接しているポリゴンも含めて重なっていないポリゴンのセットは効率的に集計できます

  • 重なっている場合でも線と点のセットを集計できます。

次の例では、ジオメトリ・セットを作成してSDO_AGGR_SET_UNIONに渡す汎用ルーチンが作成されます。このルーチンは入力として表名、列名および適用する条件(オプション)を受け取り、SDO_AGGR_SET_UNIONで使用可能なSDO_GEOMETRY_ARRAYを戻します。get_geom_setファンクション作成の後の1つ目のSELECT文は、SDO_AGGR.SDO_AGGR_UNION PL/SQLファンクションをコールします。2つ目のSELECT文は、非推奨の空間集計ファンクションをコールし、3つ目のSELECT文は、カーソルを指定する形式を使用してSDO_AGGR.SDO_AGGR_UNION PL/SQLファンクションをコールします。すべてのSELECT文は、同じ結果を戻します。(例では、「空間データの挿入、索引付けおよび問合せの例」の定義およびデータを使用しています。)

CREATE OR REPLACE FUNCTION get_geom_set (table_name  VARCHAR2,
                                         column_name VARCHAR2,
                                         predicate   VARCHAR2 := NULL)
  RETURN SDO_GEOMETRY_ARRAY DETERMINISTIC AS
 
  type            cursor_type is REF CURSOR;
  query_crs       cursor_type ;
  g               SDO_GEOMETRY;
  GeometryArr     SDO_GEOMETRY_ARRAY;
  where_clause    VARCHAR2(2000);
BEGIN
  IF predicate IS NULL
  THEN
    where_clause := NULL;
  ELSE
    where_clause := ' WHERE ';
  END IF;
 
  GeometryArr := SDO_GEOMETRY_ARRAY();
  OPEN query_crs FOR ' SELECT ' || column_name ||
                     ' FROM ' || table_name ||
                       where_clause || predicate;
   LOOP
    FETCH query_crs into g;
     EXIT when query_crs%NOTFOUND ;
     GeometryArr.extend;
     GeometryArr(GeometryArr.count) := g;
   END LOOP;
   RETURN GeometryArr;
END;
/
 
-- Call SDO_AGGR_SET_UNION function in SDO_AGGR PL/SQL package.
SELECT sdo_aggr.sdo_aggr_set_union (get_geom_set ('COLA_MARKETS', 'SHAPE',
  'name <> ''cola_c'''), .0005 ) FROM dual;

SDO_AGGR.SDO_AGGR_SET_UNION(GET_GEOM_SET('COLA_MARKETS','SHAPE','NAME<>''COLA_C'
--------------------------------------------------------------------------------
SDO_GEOMETRY(2007, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 2, 11, 1003, 1), SDO
_ORDINATE_ARRAY(8, 11, 6, 9, 8, 7, 10, 9, 8, 11, 1, 7, 1, 1, 5, 1, 8, 1, 8, 6, 5
, 7, 1, 7))

-- CALL SDO_AGGR_SET_UNION spatial aggregate function (deprecated format).
SELECT sdo_aggr_set_union (get_geom_set ('COLA_MARKETS', 'SHAPE',
  'name <> ''cola_c'''), .0005 ) FROM dual;

SDO_AGGR.SDO_AGGR_SET_UNION(GET_GEOM_SET('COLA_MARKETS','SHAPE','NAME<>''COLA_C'
--------------------------------------------------------------------------------
SDO_GEOMETRY(2007, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 2, 11, 1003, 1), SDO
_ORDINATE_ARRAY(8, 11, 6, 9, 8, 7, 10, 9, 8, 11, 1, 7, 1, 1, 5, 1, 8, 1, 8, 6, 5
, 7, 1, 7))

-- Call SDO_AGGR_SET_UNION function in SDO_AGGR PL/SQL package; specify
-- a cursor as input.
SELECT sdo_aggr.sdo_aggr_set_union 
  (CURSOR(SELECT shape FROM COLA_MARKETS WHERE name <> 'cola_c'), .0005 )
  FROM dual;

SDO_AGGR.SDO_AGGR_SET_UNION(CURSOR(SELECTSHAPEFROMCOLA_MARKETSWHERENAME<>'COLA_C
--------------------------------------------------------------------------------
SDO_GEOMETRY(2007, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 2, 11, 1003, 1), SDO
_ORDINATE_ARRAY(8, 11, 6, 9, 8, 7, 10, 9, 8, 11, 1, 7, 1, 1, 5, 1, 8, 1, 8, 6, 5
, 7, 1, 7))

21.8 SDO_AGGR_UNION

構文

SDO_AGGR_UNION(
     AggregateGeometry  SDOAGGRTYPE 
     ) RETURN SDO_GEOMETRY;

説明

指定されたジオメトリ・オブジェクトで位相的な和集合(OR演算)となるジオメトリ・オブジェクトを戻します。

パラメータ

AggregateGeometry

ジオメトリ列および次元配列を指定するSDOAGGRTYPE型のオブジェクト(「SDOAGGRTYPEオブジェクト型」を参照)を指定します。

使用上のノート

単一線ストリングまたは複数線ストリングのジオメトリをマージするには、SDO_AGGR_UNIONは使用せず、SDO_AGGR_CONCAT_LINES空間集計ファンクションを使用します。

SDO_GEOM.SDO_UNIONファンクションの詳細は、「SDO_GEOMパッケージ(ジオメトリ)」を参照してください。

次の例では、cola_dを除くすべてのジオメトリ(この例では、cola_acola_bおよびcola_c)の和集合が戻されます。(例では、「空間データの挿入、索引付けおよび問合せの例」の定義およびデータを使用しています。)

SELECT SDO_AGGR_UNION(
  SDOAGGRTYPE(c.shape, 0.005))
  FROM cola_markets c
  WHERE c.name <> 'cola_d';

SDO_AGGR_UNION(SDOAGGRTYPE(C.SHAPE,0.005))(SDO_GTYPE, SDO_SRID, SDO_POINT(
--------------------------------------------------------------------------------
SDO_GEOMETRY(2007, NULL, NULL, SDO_ELEM_INFO_ARRAY(1, 1003, 2, 11, 1003, 1), SDO
_ORDINATE_ARRAY(8, 11, 6, 9, 8, 7, 10, 9, 8, 11, 1, 7, 1, 1, 5, 1, 8, 1, 8, 6, 5
, 7, 1, 7))