ST_ClusterDBSCAN — 入力ジオメトリごとにDBSCANアルゴリズムを使ってクラスタ番号を返すウィンドウ関数です。
integer ST_ClusterDBSCAN(geometry winset geom, float8 eps, integer minpoints);
2次元Density-based spatial clustering of applications with noise (DBSCAN)アルゴリズムを使って、入力ジオメトリ毎にクラスタ番号を返すウィンドウ関数です。ST_ClusterKMeansと違い、クラスタ数の指定は不要ですが、代わりに、クラスタを決定するために、期待する距離(eps)と密度(minpoints)のパラメータを使います。
入力ジオメトリは、次のいずれかの場合にはクラスタに追加されます:
境界ジオメトリは、複数のクラスタの核ジオメトリのeps距離内に存在する場合があることに注意して下さい。どちらに割り当てても正しいので、境界ジオメトリは有効なクラスタの一つに任意に割り当てられます。この状況では、正しいクラスタがminpointsジオメトリより少ないジオメトリで生成される可能性があります。境界ジオメトリの割当の決定性を確実にする (その結果、ST_ClusterDBSCANの呼び出しで同じ結果が生成される)には、ウィンドウ定義内でORDER BY節を使います。あいまいなクラスタ割当は他のDBSCAN実装とは異なるかも知れません。
|
|
|
どのクラスタとの結合の基準に合わないジオメトリは、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;