名前

ST_ClusterDBSCAN — 入力ジオメトリごとにDBSCANアルゴリズムを使ってクラスタ番号を返すウィンドウ関数です。

概要

integer ST_ClusterDBSCAN(geometry winset geom, float8 eps, integer minpoints);

説明

DBSCAN (ノイズ適用可能な密度に基づいた空間クラスタリング)アルゴリズムの2次元実装に基づいて、それぞれの入力ジオメトリが入るクラスタの整数識別子を返します。ST_ClusterKMeansと違って、クラスタ数の指定は求められず、所望する距離 (eps)と密度(minpoints)をクラスタを構築するためのパラメータとして使います。

入力ジオメトリは次の場合にクラスタに追加されます。

  • 「核」ジオメトリは、入力ジオメトリ (自分を含む)のうち少なくともminpoints個がepsで指定した距離の範囲内にあるものです。

  • 「境界」ジオメトリは、核ジオメトリからepsで指定した距離の範囲内にあるものです。

境界ジオメトリがeps以内に複数の核ジオメトリがあるかも知れないことに注意して下さい。この場合には、どちらに割り当てられても正しく、境界ジオメトリは、対象クラスタのうちの一つに任意に割り当てられます。これらの場合には、minpointsより少ないジオメトリで正しいクラスタを生成できます。境界ジオメトリの割り当てが曖昧な時、ウィンドウの定義にORDER BY句が含まれている場合には、ST_ClusterDBSCANは同じ結果を返しますが、クラスタの割り当ては同じアルゴリズムの他の実装と異なる可能性があります。

[注記]

どのクラスタの参加基準にも合わない入力ジオメトリは、番号をNULLとします。

Availability: 2.3.0

50メートル以内にある個々のポリゴンへのクラスタ番号の割り当て。少なくともクラスタには二つのポリゴンが求められます。

少なくともクラスタごとに二つ以上のポリゴンがある50メートル以内のクラスタ。一つだけならcidはNULL。

SELECT name, ST_ClusterDBSCAN(geom, eps := 50, minpoints := 2) over () AS cid
FROM boston_polys
WHERE name 
> '' AND building 
> ''
        AND ST_DWithin(geom,
        ST_Transform(
            ST_GeomFromText('POINT(-71.04054 42.35141)', 4326), 26986),
           500);

                name                 | bucket
-------------------------------------+--------
 Manulife Tower                      |      0
 Park Lane Seaport I                 |      0
 Park Lane Seaport II                |      0
 Renaissance Boston Waterfront Hotel |      0
 Seaport Boston Hotel                |      0
 Seaport Hotel & World Trade Center  |      0
 Waterside Place                     |      0
 World Trade Center East             |      0
 100 Northern Avenue                 |      1
 100 Pier 4                          |      1
 The Institute of Contemporary Art   |      1
 101 Seaport                         |      2
 District Hall                       |      2
 One Marina Park Drive               |      2
 Twenty Two Liberty                  |      2
 Vertex                              |      2
 Vertex                              |      2
 Watermark Seaport                   |      2
 Blue Hills Bank Pavilion            |   NULL
 World Trade Center West             |   NULL
(20 rows)

同じクラスタ番号の群を一つのジオメトリに統合します。名前付き引数を使用しています。

SELECT cid, ST_Collect(geom) AS cluster_geom, array_agg(parcel_id) AS ids_in_cluster FROM (
    SELECT parcel_id, ST_ClusterDBSCAN(geom, eps := 0.5, minpoints := 5) over () AS cid, geom
    FROM parcels) sq
GROUP BY cid;
    

関連情報

ST_DWithin, ST_ClusterKMeans, ST_ClusterIntersecting, ST_ClusterWithin