
一、函数概述
ST_ClusterDBSCAN 是 PostGIS 中用于空间数据聚类的强大工具,使用 DBSCAN 算法返回每个输入几何图形的簇 id 的窗口函数 ,基于 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)算法实现。与 K-means 等算法不同,该算法无需事先知道聚类簇的数量,能根据数据分布自动确定。同时,它可以发现任意形状的聚类簇,并且对远离密度核心的噪声点具有鲁棒性,适合处理复杂的地理空间数据,如城市热点区域识别、交通流量聚类等, 具体可以研究相关论文。
二、核心参数与语法结构
sql
integer ST_ClusterDBSCAN(
geometry geom, -- 输入几何对象
float8 eps, -- 邻域半径(距离阈值)
integer minpoints -- 形成核心点所需的最小点数
) OVER ();
三、算法基本原理
1. 核心概念
DBSCAN 算法将 "簇" 定义为密度相连的点的最大集合。它依据密度对样本点进行划分,可将点分为核心点、边界点和噪声点三类。在半径eps区域内,含有超过minPts数目(最小数目)的点,称为核心点;在半径eps区域内,点的数量小于minPts数目,但是是核心点的直接邻居,称为边界点;既不是核心点也不是边界点的点为噪声点。
(1)核心点(Core Point):
- 在eps范围内至少包含minpoints个点(包括自身)
- 示例:若eps=50,minpoints=3,则某点周围 50 米内至少有 3 个点时为核心点
(2)边界点(Border Point):
- 在eps范围内包含的点数少于minpoints,但与某个核心点相邻
- 边界点会被分配到相邻核心点所在的簇
(3)噪声点(Noise Point):
- 既不是核心点也不是边界点的点,聚类结果为NULL
2. 密度关系
若点p在核心点q的eps邻域内,则称对象p从对象q出发时是直接密度可达的。若存在一个对象链,任意相邻两个对象间都是直接密度可达的,则称链条两端对象是密度可达的。如果存在对象O,使得对象p和q都是从O密度可达的,则称p和q是密度相连的。密度相连的点构成一个聚类簇。
3. 执行流程
DBSCAN 通过检查数据集中每个点的eps邻域来搜索簇。如果点p的eps邻域包含多于minPts个点,则创建一个以p为核心对象的簇,然后迭代聚集从这些核心对象直接密度可达的对象,此过程可能涉及一些密度可达簇的合并,当没有新的点添加到任何簇时,迭代过程结束。
四、参数调优策略
1. eps 参数选择:
- 过小:可能导致聚类过于分散,许多本应属于同一簇的点会被分开
- 过大:可能将不同簇的点错误地聚合在一起
- 建议通过ST_Distance统计数据点间的距离分布来确定
2. minpoints 参数选择:
- 其选择与数据的维度、密度和噪声水平密切相关
- 较大值:可能会漏掉一些规模较小但紧密的真实簇
- 较小值:可能会识别出一些由偶然因素形成的小 "簇"
- 通常取值为数据维度 + 1(如二维空间取 3)
3. 空间索引优化:
sql
-- 为提高性能,建议在聚类字段上创建GIST索引
CREATE INDEX idx_geom ON your_table USING GIST (geom);
五、典型用法示例
示例 1:城市建筑物聚类分析
sql
-- 找出距离在50米内且至少3个建筑物的聚类
SELECT
building_id,
name,
ST_ClusterDBSCAN(geom, eps := 50, minpoints := 3) OVER () AS cluster_id
FROM urban_buildings
WHERE building_type = '商业';
示例 2:交通流量热点区域识别
sql
-- 基于交通传感器数据识别高密度区域
WITH traffic_clusters AS (
SELECT
sensor_id,
location,
traffic_volume,
ST_ClusterDBSCAN(location, eps := 100, minpoints := 5) OVER () AS hotzone_id
FROM traffic_sensors
WHERE measurement_time = '2023-07-08 08:00:00'
)
SELECT
hotzone_id,
COUNT(*) AS sensor_count,
AVG(traffic_volume) AS avg_volume
FROM traffic_clusters
WHERE hotzone_id IS NOT NULL -- 排除噪声点
GROUP BY hotzone_id
ORDER BY avg_volume DESC;
示例 3:聚类结果可视化准备
sql
-- 将聚类结果转换为几何集合
WITH clusters AS (
SELECT
ST_ClusterDBSCAN(geom, eps := 0.001, minpoints := 10) OVER () AS cluster_id,
geom
FROM crime_incidents
WHERE incident_date >= '2023-01-01'
)
SELECT
cluster_id,
ST_Collect(geom) AS cluster_geom, -- 聚合为几何集合
COUNT(*) AS incident_count
FROM clusters
WHERE cluster_id IS NOT NULL
GROUP BY cluster_id;
六、应用场景
1. 城市规划:
- 识别商业区、住宅区等功能区域
- 分析公共设施的服务覆盖范围
2. 环境监测:
- 聚类污染监测点,识别高污染区域
- 分析野生动物栖息地分布
3. 交通分析:
- 识别交通拥堵热点区域
- 分析公共交通站点的服务范围
4. 犯罪分析:
- 聚类犯罪发生地点,识别高危区域
- 分析犯罪模式的时空分布
七、注意事项
1. 边界点分配的不确定性:
- 当边界点与多个核心点相邻时,分配结果可能不确定
- 可通过ORDER BY子句确保结果确定性:
sql
ST_ClusterDBSCAN(geom, eps := 50, minpoints := 3)
OVER (ORDER BY unique_id)
2. 坐标系单位一致性:
- eps的单位与几何对象的坐标系单位一致(如 WGS 84 为度,UTM 为米)
- 建议先将几何转换为投影坐标系(如 UTM)再进行聚类
3. 处理大规模数据:
- 对超大数据集,可先进行空间分块处理:
sql
WITH partitions AS (
SELECT (ST_SquareGrid(1000, ST_Extent(geom))).* FROM your_table
)
SELECT
partition_id,
ST_ClusterDBSCAN(geom, eps := 50, minpoints := 5) OVER () AS cluster_id
FROM your_table
JOIN partitions ON ST_Intersects(geom, geom)
八、扩展应用:时空聚类分析
sql
-- 结合时间维度进行时空聚类(假设time字段为时间戳)
WITH time_filtered AS (
SELECT
geom,
time
FROM sensor_data
WHERE time BETWEEN '2023-01-01' AND '2023-01-31'
),
spatiotemporal_clusters AS (
SELECT
geom,
time,
ST_ClusterDBSCAN(
geom,
eps := 100, -- 空间阈值(米)
minpoints := 3
) OVER (ORDER BY time) AS cluster_id
FROM time_filtered
)
SELECT
cluster_id,
MIN(time) AS start_time,
MAX(time) AS end_time,
ST_ConvexHull(ST_Collect(geom)) AS cluster_boundary
FROM spatiotemporal_clusters
WHERE cluster_id IS NOT NULL
GROUP BY cluster_id;
通过ST_ClusterDBSCAN函数,可有效挖掘空间数据中的聚类模式,为地理信息分析提供决策支持。合理调整参数并结合空间索引优化,能显著提升聚类效果和性能,满足从城市规划到环境监测等多种领域的空间分析需求。