返回聚类结果ID的窗口函数,此函数基于二维的DBSCAN算法(Density-based spatial clustering of applications with noise)计算聚类。
语法
- 语法一:
integer ST_ClusterDBSCAN(geometry winset geom , float8 eps , integer minpoints);
- 语法二:
integer ST_ClusterDBSCANSpheroid(geometry winset geom , float8 eps , integer minpoints);
参数
参数名称 | 描述 |
---|---|
geom | 目标geometry对象。 |
eps | 所需的最小距离。 |
minpoints | 成为核心对象所需的邻域内最小对象数。 |
描述
- 与ST_ClusterKMeans不同,它不需要指定簇的数量,而是使用所需的距离和密度参数来构造每个簇。
- 如果输入Geometry对象满足以下条件之一,则会将其添加到簇中:
- 一个核心对象:如果在一个对象的eps-邻域(即到此对象距离小于eps的范围)内存在至少minpoints个对象,则此对象是核心对象。
- 一个边界对象:一个对象如果到某个核心对象距离小于eps,且自身不是核心对象,则此对象是边界对象。
边界对象可能在多个核心对象的最小距离范围内。在此情况下,分配到任意核心对象都是正确的,这时,生成的最小簇中的对象数可能少于指定的最小对象数。
- 不符合加入任何其他簇标准的对象将被分配为名为NULL的簇。
- 该函数是窗口函数。
- 如果使用语法一ST_ClusterDBSCAN函数进行聚类,则会使用欧式距离进行聚类,eps以坐标间的欧式距离计算。
- 如果使用语法二ST_ClusterDBSCANSpheroid函数,则表示根据椭球上的距离进行聚类。
例如,当geometry有SRID并使用经纬度表示时,将会在相应SRID指定的坐标系中以米为单位进行聚类。
示例
SELECT ST_ClusterDBSCAN(geom,2,1) over() ,st_AsText(geom)
FROM (SELECT unnest(ARRAY['POINT (0 0)'::geometry,
'POINT(1 1)'::geometry,
'POINT (-1 -1)'::geometry,
'POINT (-3 -3)'::geometry]) AS geom) AS test;
st_clusterdbscan | st_astext
------------------+--------------
0 | POINT(0 0)
0 | POINT(1 1)
0 | POINT(-1 -1)
1 | POINT(-3 -3)
(4 rows)