ST_ClusterKMeans — 入力ジオメトリごとにk平均法アルゴリズムを使ってクラスタ番号を返すウィンドウ関数です。
integer ST_ClusterKMeans(
geometry winset geom, integer number_of_clusters, float max_radius)
;
入力ジオメトリごとのK平均法のクラスタ番号を返します。クラスタリングに使われる距離は、2次元ジオメトリでは重心間の距離、3次元ジオメトリではバウンディングボックスの中心点間の距離です。POINT入力では、M値は入力の重みとして扱われ、0より大きくなければなりません。
max_radius
が設定されている場合には、ST_ClusterKMeansは、出力クラスタがmax_radius
より半径が大きいクラスタを作らなくなるので、k
より多いクラスタを生成します。到達可能性分析に使います。
Enhanced: 3.2.0 max_radius
パラメータに対応しました
Enhanced: 3.1.0 3次元ジオメトリと重みに対応するようになりました
Availability: 2.3.0
例としてダミーの区画の集合を生成します:
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...
タイプ別による区画の分割:
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
例: 3次元クラスタリングと重み付けを使った、事前集計した地球規模の人口データセットのクラスタリング。Kontur Population Dataに基づいて、中心から3000km以下となる、少なくとも 20 の地域が識別されます:
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;