Name

ST_ClusterDBSCAN — Fensterfunktion, die eine Cluster-ID für jede Eingabegeometrie unter Verwendung des DBSCAN-Algorithmus zurückgibt.

Übersicht

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

Beschreibung

Eine Fensterfunktion, die eine Clusternummer für jede Eingabegeometrie zurückgibt, unter Verwendung des 2D Dichte-basierten räumlichen Clustering von Anwendungen mit Rauschen (DBSCAN) Algorithmus. Im Gegensatz zu ST_ClusterKMeans muss die Anzahl der Cluster nicht angegeben werden, sondern es wird der gewünschte Distanz (eps) und Dichte (minpoints) zur Bestimmung der einzelnen Cluster.

Eine Eingangsgeometrie wird zu einem Cluster hinzugefügt, wenn sie entweder:

  • Eine "Kern"-Geometrie, die innerhalb eps Abstand von mindestens minpoints Eingabegeometrien (einschließlich sich selbst) liegt; oder

  • Eine "Rand"-Geometrie, die sich in eps Entfernung einer Kerngeometrie befindet.

Beachten Sie, dass Randgeometrien in eps Entfernung von Kerngeometrien in mehr als einem Cluster liegen können. Jede der beiden Zuordnungen wäre korrekt, so dass die Randgeometrie willkürlich einem der verfügbaren Cluster zugeordnet wird. In dieser Situation ist es möglich, dass ein korrekter Cluster mit weniger als minpoints Geometrien erzeugt wird. Um eine deterministische Zuordnung der Randgeometrien zu gewährleisten (so dass wiederholte Aufrufe von ST_ClusterDBSCAN identische Ergebnisse liefern), verwenden Sie eine ORDER BY Klausel in der Fensterdefinition. Mehrdeutige Clusterzuweisungen können sich von anderen DBSCAN-Implementierungen unterscheiden.

[Anmerkung]

Geometrien, die die Kriterien für die Zugehörigkeit zu einem Cluster nicht erfüllen, erhalten eine Clusternummer von NULL.

Verfügbarkeit: 2.3.0

Diese Methode unterstützt kreisförmige Strings und Kurven.

Beispiele

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;
Ausgabe von Rastern
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

Ein Beispiel für die Zusammenfassung von Flurstücken mit derselben Clusternummer zu geometrischen Sammlungen.

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;