返回聚类结果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)