ST_ClusterKMeans — Fensterfunktion, die eine Cluster-ID für jede Eingabegeometrie unter Verwendung des K-Means-Algorithmus zurückgibt.
integer ST_ClusterKMeans( geometry winset geom , integer k , float8 max_radius );
Gibt K-means Clusternummer für jede Eingabegeometrie zurück. Der für das Clustering verwendete Abstand ist der Abstand zwischen den Zentren für 2D-Geometrien und der Abstand zwischen den Bounding-Box-Zentren für 3D-Geometrien. Bei POINT-Eingaben wird die Koordinate M als Gewicht der Eingabe behandelt und muss größer als 0 sein.
max_radius, falls gesetzt, veranlasst ST_ClusterKMeans, mehr Cluster als k zu erzeugen, um sicherzustellen, dass kein Cluster in der Ausgabe einen größeren Radius als max_radius hat. Dies ist bei der Erreichbarkeitsanalyse nützlich.
Verbessert: 3.2.0 Unterstützung für max_radius
Verbessert: 3.1.0 Unterstützung für 3D-Geometrien und Gewichte
Verfügbarkeit: 2.3.0
Erzeugen Sie eine Dummy-Parzellengruppe für Beispiele:
CREATE TABLE parcels AS
SELECT lpad((row_number() over())::text,3,'0') As parcel_id, geom,
('{residential, commercial}'::text[])[1 + mod(row_number()OVER(),2)] As type
FROM
ST_Subdivide(ST_Buffer('SRID=3857;LINESTRING(40 100, 98 100, 100 150, 60 90)'::geometry,
40, 'endcap=square'),12) As geom;
Parzellen farbcodiert nach Clusternummer (cid)
SELECT ST_ClusterKMeans(geom, 3) OVER() AS cid, parcel_id, geom
FROM parcels;
cid | parcel_id | geom -----+-----------+--------------- 0 | 001 | 0103000000... 0 | 002 | 0103000000... 1 | 003 | 0103000000... 0 | 004 | 0103000000... 1 | 005 | 0103000000... 2 | 006 | 0103000000... 2 | 007 | 0103000000...
Unterteilung von Parzellenclustern nach Typ:
SELECT ST_ClusterKMeans(geom, 3) over (PARTITION BY type) AS cid, parcel_id, type
FROM parcels;
cid | parcel_id | type -----+-----------+------------- 1 | 005 | commercial 1 | 003 | commercial 2 | 007 | commercial 0 | 001 | commercial 1 | 004 | residential 0 | 002 | residential 2 | 006 | residential
Beispiel: Clustering eines voraggregierten Bevölkerungsdatensatzes auf planetarischer Ebene unter Verwendung von 3D-Clustering und Gewichtung. Identifizierung von mindestens 20 Regionen auf der Grundlage von Kontur-Bevölkerungsdaten, die nicht mehr als 3000 km von ihrem Zentrum entfernt sind:
create table kontur_population_3000km_clusters as
select
geom,
ST_ClusterKMeans(
ST_Force4D(
ST_Transform(ST_Force3D(geom), 4978), -- cluster in 3D XYZ CRS
mvalue => population -- set clustering to be weighed by population
),
20, -- aim to generate at least 20 clusters
max_radius => 3000000 -- but generate more to make each under 3000 km radius
) over () as cid
from
kontur_population;
Die Weltbevölkerung, geclustert nach den obigen Angaben, ergibt 46 Cluster. Die Cluster konzentrieren sich auf gut bevölkerte Regionen (New York, Moskau). Grönland ist ein Cluster. Es gibt Insel-Cluster, die sich über den Antimeridian erstrecken. Die Ränder der Cluster folgen der Erdkrümmung.