この章では、表20-1に示す空間集計ファンクションのリファレンス情報および使用方法について説明します。
表20-1 空間集計ファンクション
メソッド | 説明 |
---|---|
|
指定されたジオメトリ・オブジェクトの中心(重心)にあるジオメトリ・オブジェクトを戻します。 |
|
指定された単一線または複数線のジオメトリを連結するジオメトリを戻します。 |
|
指定されたジオメトリ・オブジェクトの凸型部分であるジオメトリ・オブジェクトを戻します。 |
|
指定されたLRSジオメトリ・オブジェクトを連結するLRSジオメトリ・オブジェクトを戻します。 |
|
指定されたジオメトリの最小境界矩形を戻します。 |
|
SDO_GEOMETRYオブジェクトのVARRAYを入力として取り、配列のすべてのジオメトリ・オブジェクトの集計和集合を戻します。 |
|
指定されたジオメトリ・オブジェクトで位相的な和集合(OR演算)となるジオメトリ・オブジェクトを戻します。 |
空間集計ファンクションの使用方法については、1.10項を参照してください。
これらのほとんどの集計ファンクションには、SDOAGGRTYPE型のパラメータ(1.10.1項を参照)を指定できます。
使用上の注意
このファンクションの動作は、ジオメトリ・オブジェクトがポリゴンのみで構成されるか、点のみで構成されるか、またはポリゴンと点が混在するかによって異なります。
ジオメトリ・オブジェクトがポリゴンのみで構成される場合、すべてのオブジェクトの中心が戻されます。
ジオメトリ・オブジェクトが点のみで構成される場合、すべてのオブジェクトの中心が戻されます。
ジオメトリ・オブジェクトにポリゴンと点が混在する(1つ以上のポリゴンと1つ以上の点が含まれる)場合、点は無視され、すべてのポリゴンの中心が戻されます。
結果は、ジオメトリ・オブジェクトの各ポリゴンの面積によって重み付けされます。ジオメトリ・オブジェクトにポリゴンおよび点が混在する場合、中心の計算では点が使用されません。ジオメトリ・オブジェクトが点のみで構成される場合、それらの点は均等に重み付けされます。
SDO_GEOM.SDO_CENTROIDファンクションの詳細は、第24章を参照してください。
例
次の例では、COLA_MARKETS表のジオメトリ・オブジェクトの中心を戻します。(例では、2.1項の定義およびデータを使用しています。)
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)
使用上の注意
各入力ジオメトリは、単一線または複数線の2次元ジオメトリ(SDO_GTYPE値が2002または2006)である必要があります。このファンクションは、LRSジオメトリではサポートされません。LRSジオメトリ・セグメントの集計連結を実行するには、SDO_AGGR_LRS_CONCAT空間集計ファンクションを使用します。
入力ジオメトリは、頂点が直線セグメントに連結している線ストリングである必要があります。円弧および複合線ストリングはサポートされていません。
いずれかの入力ジオメトリが複数線のジオメトリである場合は、ジオメトリの各要素は非接続である必要があります。非接続でない場合、このファンクションは不適切な結果を戻すことがあります。
連結される各ペアのジオメトリ間の位相関係は、DISJOINTまたはTOUCHである必要があります。位相関係がTOUCHの場合、ジオメトリは2つの終了点でのみ交差する必要があります。
SDO_UTIL.CONCAT_LINESファンクション(第32章を参照)を使用すると、2つの単一線または複数線のジオメトリを連結できます。
いずれかの入力ジオメトリが単一線または複数線のジオメトリではない場合、またはすべての入力ジオメトリが同じ座標系に基づいていない場合、例外が発生します。
例
次の例では、2つの線ジオメトリをCOLA_MARKETS表に挿入し、これらのジオメトリの集計連結を戻します。(例では、2.1項の定義およびデータを使用しています。)
-- 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))
例
次の例では、COLA_MARKETS表のジオメトリ・オブジェクトの凸型部分を戻します。(例では、2.1項の定義およびデータを使用しています。)
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))
使用上の注意
このファンクションは、任意の数のLRSジオメトリの集計連結を実行します。ジオメトリを連結する順序を制御する必要がある場合、NO_MERGEオプティマイザ・ヒントおよびORDER BY句を指定した副問合せを使用する必要があります。(例を参照。)
結果のセグメントの方向は、連結内の最初のジオメトリの方向と同じになります。
このファンクションは3D形式(SDO_AGGR_LRS_CONCAT_3D)が使用可能です。LRSファンクションの3D形式については、7.4項を参照してください。
Spatialの線形参照システムについては、第7章を参照してください。
例
次の例では、LRS_ROUTES表にLRSジオメトリを追加し、次に、表に含まれるLRSジオメトリを連結する2つの問合せを実行します。最初の問合せでは、連結の順序は制御されません。2番目の問合せで制御されます。2つのセグメントの方向が異なることに注意してください。連結(Route0
)の最初のセグメントのメジャー値が降順であるため、2番目の問合せ結果のセグメントのメジャー値は降順です。(例では、7.7項の例の定義を使用しています。)
-- 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))
使用上の注意
このファンクションは、適切なMBRを作成できない場合はMBRジオメトリを戻しません。具体的には、次のとおりです。
入力ジオメトリがすべてNULLである場合、ファンクションはNULLのジオメトリを戻します。
入力ジオメトリ内のすべてのデータが1つの点上にある場合、ファンクションは点を戻します。
入力ジオメトリ内のすべてのデータが直線上に存在する複数の点である場合、ファンクションは2点線を戻します。
SDO_TUNE.EXTENT_OFファンクション(第31章を参照)も、ジオメトリの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表のジオメトリ・オブジェクトの最小境界矩形を戻します。(例では、2.1項の定義およびデータを使用しています。)
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))
パラメータ
SDO_GEOMETRY_ARRAYオブジェクト型のジオメトリ・オブジェクトの配列で、VARRAY OF SDO_GEOMETRY
として定義されます。
許容差を指定します(1.5.5項を参照)。
使用上の注意
SDO_AGGR_SET_UNIONは、SDO_AGG_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を戻します。(例では、2.1項の定義およびデータを使用しています。)
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; / SELECT sdo_aggr_set_union (get_geom_set ('COLA_MARKETS', 'SHAPE', 'name <> ''cola_c'''), .0005 ) FROM dual; SDO_AGGR_SET_UNION(GET_GEOM_SET('COLA_MARKETS','SHAPE','NAME<>''COLA_C'''),.0005 -------------------------------------------------------------------------------- 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))
使用上の注意
単一線ストリングまたは複数線ストリングのジオメトリをマージするには、SDO_AGGR_UNIONは使用せず、SDO_AGGR_CONCAT_LINES空間集計ファンクションを使用します。
SDO_GEOM.SDO_UNIONファンクションの詳細は、第24章を参照してください。
例
次の例では、cola_d
を除くすべてのジオメトリ(この例では、cola_a
、cola_b
およびcola_c
)の和集合が戻されます。(例では、2.1項の定義およびデータを使用しています。)
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))
SDO_AGGR_UNIONのより複雑な例については、C.4項を参照してください。