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
此方法支持圆形字符串和曲线。
Cluster polygons within 50 units of each other, requiring at least two polygons per cluster. The isolated polygon is reported as noise.
WITH input(name, geom) AS (
VALUES
('A1', ST_MakeEnvelope(0, 0, 10, 10)),
('A2', ST_MakeEnvelope(30, 0, 40, 10)),
('B1', ST_MakeEnvelope(100, 0, 110, 10)),
('B2', ST_MakeEnvelope(130, 0, 140, 10)),
('noise', ST_MakeEnvelope(250, 0, 260, 10))
), clustered AS (
SELECT name,
geom,
ST_ClusterDBSCAN(geom, eps => 50, minpoints => 2)
OVER (ORDER BY name) AS cid
FROM input
)
SELECT COALESCE(cid::text, 'noise') AS cluster,
string_agg(name, ',' ORDER BY name) AS members,
ST_Collect(geom ORDER BY name) AS cluster_geom
FROM clustered
GROUP BY cid
ORDER BY cid NULLS LAST;
0 | A1,A2 | MULTIPOLYGON(((0 0,0 10,10 10,10 0,0 0)),((30 0,30 10,40 10,40 0,30 0))) 1 | B1,B2 | MULTIPOLYGON(((100 0,100 10,110 10,110 0,100 0)),((130 0,130 10,140 10,140 0,130 0))) noise | noise | MULTIPOLYGON(((250 0,250 10,260 10,260 0,250 0)))
显示将具有相同簇编号的地块组合成几何集合的示例。
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;