名稱

ST_ClusterDBSCAN — 使用 DBSCAN 演算法,為每個輸入幾何物件回傳一個群聚 ID 的視窗函式。

概要

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

描述

一個視窗函式,使用 2D 基於密度的雜訊應用空間群聚 (DBSCAN) 演算法,為每個輸入幾何物件回傳一個群聚編號。 與 ST_ClusterKMeans 不同,它不需要指定群聚的數量,而是使用所需的距離eps)和密度(minpoints)參數來決定每個群聚。

如果輸入幾何物件符合以下任一條件,則會被加入到群集中:

  • 「核心」幾何物件,即在 eps 距離內,至少有 minpoints 個輸入幾何物件(包括自身);或

  • 「邊界」幾何物件,即在 eps 距離內,與核心幾何物件相鄰。

請注意,邊界幾何物件可能在多個群集中與核心幾何物件的 eps 距離內。 任何一種分配都是正確的,因此邊界幾何物件會被任意分配到可用的群集之一。 在這種情況下,可能會產生一個具有少於 minpoints 個幾何物件的正確群集。 為了確保邊界幾何物件的確定性分配(以便重複呼叫 ST_ClusterDBSCAN 會產生相同的結果),請在視窗定義中使用 ORDER BY 子句。 模糊的群集分配可能與其他 DBSCAN 實作有所不同。

[Note]

不符合加入任何群集條件的幾何物件,會被分配為 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;