Name

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

Regroupement des polygones à moins de 50 mètres les uns des autres, et nécessité d'avoir au moins 2 polygones par cluster.

Clusters dans un rayon de 50 mètres avec au moins 2 éléments par cluster. Les singletons ont NULL pour cid

SELECT name, ST_ClusterDBSCAN(geom, eps =
> 50, minpoints =
> 2) over () AS cid
FROM boston_polys
WHERE name 
> '' AND building 
> ''
        AND ST_DWithin(geom,
        ST_Transform(
            ST_GeomFromText('POINT(-71.04054 42.35141)', 4326), 26986),
           500);

                name                 | bucket
-------------------------------------+--------
 Manulife Tower                      |      0
 Park Lane Seaport I                 |      0
 Park Lane Seaport II                |      0
 Renaissance Boston Waterfront Hotel |      0
 Seaport Boston Hotel                |      0
 Seaport Hotel & World Trade Center  |      0
 Waterside Place                     |      0
 World Trade Center East             |      0
 100 Northern Avenue                 |      1
 100 Pier 4                          |      1
 The Institute of Contemporary Art   |      1
 101 Seaport                         |      2
 District Hall                       |      2
 One Marina Park Drive               |      2
 Twenty Two Liberty                  |      2
 Vertex                              |      2
 Vertex                              |      2
 Watermark Seaport                   |      2
 Blue Hills Bank Pavilion            |   NULL
 World Trade Center West             |   NULL
(20 rows)

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

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;