Nom

ST_ClusterDBSCAN — Fonction Window qui renvoie un identifiant de cluster pour chaque géométrie d'entrée en utilisant l'algorithme DBSCAN.

Synopsis

integer ST_ClusterDBSCAN(geometry winset geom, float8 eps, integer minpoints);

Description

Une fonction window qui renvoie un numéro de cluster pour chaque géométrie d'entrée, en utilisant l'algorithme 2D Density-based spatial clustering of applications with noise (DBSCAN). Contrairement à ST_ClusterKMeans, elle ne nécessite pas la spécification du nombre de clusters, mais utilise les paramètres de distance (eps) et de densité (minpoints) pour déterminer chaque cluster.

Une géométrie d'entrée est ajoutée à un cluster si elle est l'une ou l'autre :

  • Une géométrie "core", qui se trouve à eps distance d'au moins minpoints géométries d'entrée (y compris la sienne) ; ou

  • Une géométrie "en bordure", qui se trouve dans eps distance d'une géométrie centrale.

Notez que les géométries situés en bordure peuvent se trouver à eps distance des géométries centrales dans plus d'un cluster. L'une ou l'autre assignation serait correcte, de sorte que la géométrie de bordure sera arbitrairement assignée à l'un des clusters disponibles. Dans cette situation, il est possible qu'un cluster correct soit généré avec moins de géométries minpoints. Pour garantir une affectation déterministe des géométries de bordure (de sorte que des appels répétés à ST_ClusterDBSCAN produisent des résultats identiques), utilisez une clause ORDER BY dans la définition de la fonction window. Les affectations de clusters ambigus peuvent différer d'autres implémentations DBSCAN.

[Note]

Les géométries qui ne répondent pas aux critères d'appartenance à un cluster se voient attribuer un numéro de cluster NULL.

Disponibilité : 2.3.0

Cette méthode prend en charge les types Circular String et Curve.

Exemples

Cluster polygons within 50 units of each other, requiring at least two polygons per cluster. The isolated polygon is reported as noise.

Code
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;
Export de raster
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)))
Figure
Geometry figure for visual-st-clusterdbscan-01

Un exemple montrant la combinaison de parcelles ayant le même numéro de cluster dans des collections géométriques.

Code
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;