Name

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

Synopsis

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.

[Note]

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

Clustering von Polygonen in einem Umkreis von 50 Metern, wobei mindestens 2 Polygone pro Cluster erforderlich sind.

Cluster innerhalb von 50 Metern mit mindestens 2 Gegenständen pro Cluster. Singletons haben NULL für 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)

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

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;