以PostGIS2.4版本說明,當(dāng)前PostGIS已經(jīng)提供了4種空間聚類的方法砸狞,列表如下:
- ST_ClusterDBSCAN
- ST_ClusterIntersecting
- ST_ClusterKMeans
- ST_ClusterWithin
本文簡單用圖形化的方式簡述一下這幾種方法如何使用。
一 ST_ClusterDBSCAN
ST_ClusterDBSCAN是一個窗口函數(shù)抗俄,基于DBSCAN算法霞赫,返回每一個輸入的2D圖形所在“簇”的id。
定義:integer ST_ClusterDBSCAN(geometry winset geom, float8 eps, integer minpoints);
參數(shù)說明:
geom:輸入的2d圖形對象靠闭。
eps:輸入圖形之間的距離如果小于eps規(guī)定的距離,他們就被化為同一“簇”坎炼。
minpoints:每個“簇”中圖形最小數(shù)量愧膀。
使用說明:
# 查詢buildings的面圖層中,建筑之間距離小于20米(0.0002是度谣光,約20米)分類檩淋,且每一類中數(shù)量不少于2。
gis_cluster=# SELECT gid,name, ST_ClusterDBSCAN(geom, eps:= 0.0002, minpoints := 2)
over () AS cid FROM buildings;
gid | name | cid
-----+--------------+-----
1 | |
2 | | 2
3 | | 2
4 | | 2
5 | 大洋百貨 |
6 | 商茂世紀(jì)廣場 | 0
7 | 華威大廈 | 2
8 | 天安保險大廈 | 2
9 | | 2
10 | |
11 | 江蘇交通大廈 | 2
12 | 陽光大廈 |
13 | | 0
14 | | 2
15 | | 2
16 | | 2
17 | | 2
18 | | 1
19 | | 1
20 | | 2
21 | | 2
22 | | 2
23 | | 2
24 | | 2
25 | | 2
26 | | 2
27 | | 2
-- More --
可視化效果如下:
-1的是不屬于任何“cluster”的圖形萄金,也就是查詢中cid是null的數(shù)據(jù)蟀悦,其他的數(shù)據(jù)都有自己的所屬“cluster”的id值,即cid值氧敢。
二 ST_ClusterIntersecting
ST_ClusterIntersecting是一個聚合函數(shù)日戈,返回一個GeometryCollections數(shù)組,每個數(shù)組中的geom都是直接或間接能相交的圖形孙乖。
定義:geometry[] ST_ClusterIntersecting(geometry set g);
參數(shù)說明:
g:一組幾何圖形浙炼。
使用說明:
測試表中數(shù)據(jù)可視化如下:
gis_cluster=# select st_astext(unnest(ST_ClusterIntersecting(geom))) from buildings2;
st_astext
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
GEOMETRYCOLLECTION(POLYGON((118.77376608689 32.0424742122357,118.774542742962 32.0416518705121,118.773994515147 32.0411036426964,118.773172173423 32.0418802987687,118.77376608689 32.0424742122357)),POLYGON((118.774222943403 32.0429310687489,118.775898083951 32.0413320709528,118.775456455989 32.0407838431371,118.774542742962 32.0416518705121,118.77376608689 32.0424742122357,118.774222943403 32.0429310687489)),POLYGON((118.775898083951 32.0413320709528,118.777055453785 32.0402813009728,118.776629054372 32.0397635302578,118.775456455989 32.0407838431371,118.775898083951 32.0413320709528)))
GEOMETRYCOLLECTION(POLYGON((118.771192461866 32.0393066737446,118.772684859809 32.0389259599839,118.772258460397 32.0379208756551,118.770705148252 32.0383320465169,118.771192461866 32.0393066737446)),POLYGON((118.772258460397 32.0379208756551,118.772684859809 32.0389259599839,118.774375228908 32.0384234178194,118.773964058046 32.0375097047933,118.772258460397 32.0379208756551)))
GEOMETRYCOLLECTION(POLYGON((118.776766111326 32.0381188468106,118.778045309563 32.0377076759488,118.778167137966 32.0373117336375,118.777695052903 32.0366721345192,118.776080826556 32.0371746766835,118.776766111326 32.0381188468106)),POLYGON((118.778700137232 32.0380274755081,118.779857507065 32.0373878763897,118.779461564754 32.0368853342252,118.778730594333 32.0369614769774,118.778167137966 32.0373117336375,118.778045309563 32.0377076759488,118.778700137232 32.0380274755081)))
(3 行記錄)
已有數(shù)據(jù)被劃分成了三類如下:
聚合函數(shù)只返回了圖形的集合出來,沒帶上記錄的標(biāo)記的圆,該方法最好也能將記錄的id返回比較好用鼓拧。
三 ST_ClusterKMeans
ST_ClusterKMeans:均值中心聚類,窗口函數(shù)越妈,對每個輸入的圖形季俩,根據(jù)圖形之間的二維distance進行均值中心聚類,返回聚類的id梅掠。distance指的是圖形之間的centroids酌住。
定義:integer ST_ClusterKMeans(geometry winset geom, integer number_of_clusters);
參數(shù)說明:
geom:輸入的二維圖形。
number_of_clusters:聚類的數(shù)量阎抒。
使用示例:
#均值中心聚類酪我,聚成3類
gis_cluster=# SELECT gid,ST_ClusterKMeans(geom,3) over () AS cid,geom FROM buildings;
同理,聚合成4類效果圖如下:
使用也比較簡單且叁,也好理解都哭。
四 ST_ClusterWithin
ST_ClusterWithin:聚合函數(shù),對輸入的圖形,指定一個笛卡爾距離(距離單位是圖形srid對應(yīng)的單位)欺矫,圖形之間的距離在指定的距離內(nèi)纱新,則歸并為一類。最后返回聚類后的圖形數(shù)組穆趴。
定義:geometry[] ST_ClusterWithin(geometry set g, float8 distance);
使用簡介:
create table buildings6(
id serial primary key,
cid int,
geom geometry(Polygon,4326)
);
do language plpgsql $$
DECLARE
rec record;
num int;
i int;
BEGIN
truncate table buildings6;
--距離設(shè)置為約50米脸爱,改成0.0003就是約30米
for rec in with a as (select unnest(ST_ClusterWithin(geom, 0.0005)) geom from buildings) select row_number() over() as id,a.geom from a loop
num:=ST_NumGeometries(rec.geom);
for i in 1..num loop
insert into buildings6(cid,geom) select rec.id,ST_GeometryN(rec.geom, i);
end loop;
end loop;
end;
聚類效果還是比較明顯的。幾個聚類函數(shù)比較常用未妹,尤其在選址等應(yīng)用上簿废,不過具體的業(yè)務(wù)比簡單的應(yīng)用復(fù)雜多,筆者拋磚引玉络它,希望讀者能有好的案例出現(xiàn)族檬。