ST_ClusterDBSCAN — 使用 DBSCAN 演算法,為每個輸入幾何物件回傳一個群聚 ID 的視窗函式。
integer ST_ClusterDBSCAN(
geometry winset geom, float8 eps, integer minpoints)
;
一個視窗函式,使用 2D 基於密度的雜訊應用空間群聚 (DBSCAN) 演算法,為每個輸入幾何物件回傳一個群聚編號。 與 ST_ClusterKMeans 不同,它不需要指定群聚的數量,而是使用所需的距離(eps
)和密度(minpoints
)參數來決定每個群聚。
如果輸入幾何物件符合以下任一條件,則會被加入到群集中:
請注意,邊界幾何物件可能在多個群集中與核心幾何物件的 eps
距離內。 任何一種分配都是正確的,因此邊界幾何物件會被任意分配到可用的群集之一。 在這種情況下,可能會產生一個具有少於 minpoints
個幾何物件的正確群集。 為了確保邊界幾何物件的確定性分配(以便重複呼叫 ST_ClusterDBSCAN 會產生相同的結果),請在視窗定義中使用 ORDER BY
子句。 模糊的群集分配可能與其他 DBSCAN 實作有所不同。
![]() |
|
不符合加入任何群集條件的幾何物件,會被分配為 NULL 的群集編號。 |
可用性:2.3.0
此方法支援環形字串和曲線。
將彼此之間 50 公尺內的 polygon 群聚,且每個群集至少需要 2 個 polygon。
![]() 群聚在 50 公尺內,且每個群集至少有 2 個項目。 單例的 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) |
範例展示如何將具有相同群集編號的 parcel 合併成幾何集合。
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;