35.62 SDO_UTIL.LINEAR_KEY

書式

SDO_UTIL.LINEAR_KEY(
     geometry  IN SDO_GEOMETRY, 
     min_x     IN NUMBER DEFAULT 0.0, 
     min_y     IN NUMBER DEFAULT 0.0, 
     max_x     IN NUMBER DEFAULT 0.0, 
     max_y     IN VARCHAR2 DEFAULT 'FALSE', 
     lvl       IN NUMBER DEFAULT 8 
     ) RETURN RAW;

説明

指定されたレベルでのジオメトリの線形(Hilbert)キーを戻します。(ジオメトリが点でない場合は、ジオメトリ上のいくつかの点を使用してキーが生成されます。)

パラメータ

geometry

線形(Hilbert)キーを生成する入力ジオメトリ。

min_x

キーの生成で考慮するX軸上の最小値。(詳細は、「使用上のノート」を参照してください。)

min_y

キーの生成で考慮するY軸上の最小値。(詳細は、「使用上のノート」を参照してください。)

max_x

キーの生成で考慮するX軸上の最大値。(詳細は、「使用上のノート」を参照してください。)

max_y

キーの生成で考慮するY軸上の最大値。(詳細は、「使用上のノート」を参照してください。)

lvl

1以上の値。ここでの1は座標系の境界の1/4のサイズです。デフォルト値は8です。(詳細は、「使用上のノート」を参照してください。)

使用上のノート

このファンクションは、主に、この線形キーによってデータをクラスタリングして、近接するジオメトリ同士がディスク上でも近接するようにするために使用されます。他には、この線形キーによってデータのクラスタを生成するために使用されます。

線形キーによるクラスタリングは、点データ・セットが大きい場合にパフォーマンスを高めるための効率的な手法です。このファンクションはパラレルで有効になり、何百万もの行を数秒でクラスタリングできます。各セルに一意のIDがある一枚のグラフ用紙に覆われた世界を想像してください。Oracle Spatialでは、実際にはそのようなセルは作成されませんが、SDO_UTIL.LINEAR_KEYファンクションに点を渡すとセルIDが返されます。多数の点を同じセルIDにマップできます(したがって、クラスタリングできる)。lvlパラメータを使用するとセル・サイズを変更できます。セル・サイズ(lvl値)を大きくすると、同じセルにマップされる点がより多くなり、それによって、クラスタ・グループが少なくなります。

経度/緯度データ(測地SRS)を示すmin_xmin_ymax_xmax_yの値は、正方形のセルの場合は-180、-180、180、180ですが、長方形のセルが必要な場合には-180、-90、180、90を指定できます。投影座標系では、境界の値は様々です。たとえば、World Mercatorの場合は推奨値は-20037508、-20037508、20037508、20037508となります。

クラスタリングの結果は、表に永続的に格納することや、オンザフライで生成することができます。各手法の例については、「例」を参照してください。

このファンクションを使用する前に、SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXTファンクションを使用して入力ジオメトリを検証する必要があります。

次の例では、その結果は表に永続的に格納されますこの手法は、大きいデータ・セットをクラスタリングする場合に特にお薦めします。この例では、lvl値として17を使用しており、オプティマイザ・ヒント(/*+ append parallel(16) */)によって、パラレル実行の度合いとしてかなり高い値を指定しています。

ALTER SESSION ENABLE PARALLEL DML;
DROP TABLE results;
CREATE TABLE results (cnt NUMBER, cell_center SDO_GEOMETRY);
INSERT /*+ append parallel(16) */ INTO results NOLOGGING 
SELECT  count(*) cnt
              ,sdo_geom.sdo_centroid(sdo_util.hhcell_boundary (cell_id,-180,-180,180,180), .05) cell_center
FROM (SELECT sdo_util.linear_key (geom, -180,-180,180,180,17) as cell_id
             FROM lon_lat_geoms)
GROUP BY cell_id;

次の文は、オンザフライでの点データのクラスタリングを実行します。この例では、lvl値として13を使用します。より高い値を指定することもできますが、この手法では、多くの場合、パラレル実行の度合いは低くても十分です。

SELECT /*+ parallel(2) */  count(*) cnt
         ,sdo_geom.sdo_centroid(set_srid (sdo_util.hhcell_boundary (cell_id,-180,-180,180,180), 4326), .05) cell_center
FROM (SELECT sdo_util.linear_key (geom, -180,-180,180,180,13) as cell_id
         FROM lon_lat_geoms
         WHERE sdo_filter(geom,sdo_geometry(2003,4326,null,sdo_elem_info_array(1,1003,3),
                                       sdo_ordinate_array(-72,41,-71,42))))
GROUP BY cell_id;

関連トピック