PostGIS计算聚类,通常有种两种方法。一个是使用kmeans方法;另一种是使用阈值计算相对空间关系,实现聚类。
ST_ClusterKMeans则是基于K均值算法,需要指定簇的数量(k值),根据点的位置进行划分。
ST_ClusterWithin是基于距离的聚类,它把互相在指定距离内的点归为一类,适合根据实际地理距离来分组。
本次分享的是第一种方法:基于ST_ClusterKMeans方法,计算点之间的相对空间关系,实现聚类。
请根据不同的聚类需求来选择方法。
示例语法
SELECT
row_number() OVER () AS id,
ST_NumGeometries(geom_collection) AS num_points,
geom_collection,
ST_Centroid(geom_collection) AS centroid,
ST_MinimumBoundingCircle(geom_collection) AS circle,
sqrt(ST_Area(ST_MinimumBoundingCircle(geom_collection)) / pi()) AS radius
FROM (
SELECT
ST_ClusterKMeans(geom, 5) OVER () AS cluster_id,
ST_Collect(geom) AS geom_collection
FROM points_table
GROUP BY cluster_id
) clustered_data;
用法说明
子查询部分
SELECT
ST_ClusterKMeans(geom, 5) OVER () AS cluster_id,
ST_Collect(geom) AS geom_collection
FROM points_table
GROUP BY cluster_id;
ST_ClusterKMeans(geom, 5)
对 rand_point 表中的点进行 K-Means 聚类,指定聚类数量为 5(可根据需求调整)。
返回每个点所属的簇编号 cluster_id(从 0 开始递增)。
ST_Collect(geom)
将同一簇(cluster_id)的所有点合并为一个几何集合(如 MULTIPOINT)。
GROUP BY cluster_id
按簇分组,确保每个簇生成一行数据。
外层查询
SELECT
row_number() OVER () AS id,
ST_NumGeometries(geom_collection) AS num_points,
geom_collection,
ST_Centroid(geom_collection) AS centroid,
ST_MinimumBoundingCircle(geom_collection) AS circle,
sqrt(ST_Area(...) / pi()) AS radius
FROM (...) clustered_data;
row_number() over ()
生成递增的id。
ST_NumGeometries(gc)
统计几何集合中的对象数量(如点的个数)。
ST_Centroid(gc)
计算几何集合的质心。
ST_MinimumBoundingCircle(gc)
生成包含几何集合的最小外接圆(返回POLYGON)。
sqrt(ST_Area(...) / pi())
通过圆面积公式反推半径。
结果如图
