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 number_of_clusters, float 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;
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;