名称

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 米以内的多边形进行聚类,并且每个聚类至少需要 2 个多边形。

每个聚类至少有 2 个项目的 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_ClusterIntersectingWin, ST_ClusterWithin, ST_ClusterWithinWin