ST_ClusterDBSCAN — 窗口函数,使用 DBSCAN 算法为每个输入几何图形返回一个聚类 ID。
integer ST_ClusterDBSCAN(
geometry winset geom, float8 eps, integer minpoints)
;
一个窗口函数,使用二维基于密度的噪声应用空间聚类(DBSCAN)算法,为每个输入几何图形返回一个聚类编号。与ST_ClusterKMeans不同,它不需要指定聚类的数量,而是使用所需的距离(eps
)和密度(minpoints
)参数来确定每个聚类。
如果输入几何图形满足以下任一条件,则将其添加到聚类中:
请注意,边界几何图形可能在多个聚类中,处于核心几何图形的eps
距离内。任何分配都是正确的,因此边界几何图形将被任意分配到可用聚类之一。在这种情况下,可能会生成一个少于minpoints
个几何图形的正确聚类。为了确保边界几何图形的确定性分配(以便重复调用 ST_ClusterDBSCAN 将产生相同的结果),请在窗口定义中使用 ORDER BY
子句。模糊的聚类分配可能与其他 DBSCAN 实现不同。
不符合任何聚类加入条件的几何图形将被分配一个 NULL 的聚类编号。 |
可用性:2.3.0
此方法支持圆形字符串和曲线。
对彼此之间 50 米以内的多边形进行聚类,并且每个聚类至少需要 2 个多边形。
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;