Name

ST_ClusterKMeans — Fönsterfunktion som returnerar ett kluster-ID för varje indatageometri med hjälp av K-means-algoritmen.

Synopsis

integer ST_ClusterKMeans( geometry winset geom , integer k , float8 max_radius );

Beskrivning

Returnerar K-means klusternummer för varje indatageometri. Avståndet som används för klustring är avståndet mellan centroiderna för 2D-geometrier och avståndet mellan bounding box-centren för 3D-geometrier. För POINT-indata kommer M-koordinaten att behandlas som indataens vikt och måste vara större än 0.

max_radius, om den är inställd, gör att ST_ClusterKMeans genererar fler kluster än k och säkerställer att inget kluster i utdata har en radie som är större än max_radius. Detta är användbart vid räckviddsanalys.

Förbättrad: 3.2.0 Stöd för max_radius

Förbättrad: 3.1.0 Stöd för 3D-geometrier och vikter

Tillgänglighet: 2.3.0

Exempel

Generera en dummyuppsättning av paket för exempel:

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;

Fastigheterna färgkodade efter klusternummer (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...

Uppdelning av paketkluster efter 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

Exempel: Klustring av en föraggregerad befolkningsdatauppsättning på planetnivå med hjälp av 3D-klustring och viktning. Identifiera minst 20 regioner baserade på Konturs befolkningsdata som inte sträcker sig mer än 3000 km från sitt centrum:

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;
    

Världens befolkning klustrad enligt ovanstående specifikationer ger 46 kluster. Klustren är centrerade till välbefolkade regioner (New York, Moskva). Grönland är ett kluster. Det finns ökluster som sträcker sig över antimeridianen. Klustrets kanter följer jordens krökning.