ST_ClusterKMeans — Fönsterfunktion som returnerar ett kluster-ID för varje indatageometri med hjälp av K-means-algoritmen.
integer ST_ClusterKMeans(
geometry winset geom , integer k , float8 max_radius )
;
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
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.