ST_ClusterDBSCAN — Fensterfunktion, die eine Cluster-ID für jede Eingabegeometrie unter Verwendung des DBSCAN-Algorithmus zurückgibt.
integer ST_ClusterDBSCAN(
geometry winset geom, float8 eps, integer minpoints)
;
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.
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.
Clustering von Polygonen in einem Umkreis von 50 Metern, wobei mindestens 2 Polygone pro Cluster erforderlich sind.
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;