Name

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

Synopsis

integer ST_ClusterKMeans(geometry winset geom, integer number_of_clusters, float max_radius);

Beschreibung

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

Beispiele

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.