PostGIS--空間聚合的使用案例

以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  --

可視化效果如下:


ST_ClusterDBSCAN.png

-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ù)可視化如下:


測試數(shù)據(jù)buildings3.png
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ù)被劃分成了三類如下:


分類結(jié)果.png

聚合函數(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;
均值中心為3類.png

同理,聚合成4類效果圖如下:


均值中心為4類.png

使用也比較簡單且叁,也好理解都哭。

四 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;  
50米.png
30米.png

聚類效果還是比較明顯的。幾個聚類函數(shù)比較常用未妹,尤其在選址等應(yīng)用上簿废,不過具體的業(yè)務(wù)比簡單的應(yīng)用復(fù)雜多,筆者拋磚引玉络它,希望讀者能有好的案例出現(xiàn)族檬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市酪耕,隨后出現(xiàn)的幾起案子导梆,更是在濱河造成了極大的恐慌轨淌,老刑警劉巖迂烁,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異递鹉,居然都是意外死亡盟步,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門躏结,熙熙樓的掌柜王于貴愁眉苦臉地迎上來却盘,“玉大人,你說我怎么就攤上這事媳拴』崎伲” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵屈溉,是天一觀的道長塞关。 經(jīng)常有香客問我,道長子巾,這世上最難降的妖魔是什么帆赢? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮线梗,結(jié)果婚禮上椰于,老公的妹妹穿的比我還像新娘。我一直安慰自己仪搔,他們只是感情好瘾婿,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般偏陪。 火紅的嫁衣襯著肌膚如雪孩饼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天竹挡,我揣著相機與錄音镀娶,去河邊找鬼。 笑死揪罕,一個胖子當(dāng)著我的面吹牛梯码,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播好啰,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼轩娶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了框往?” 一聲冷哼從身側(cè)響起鳄抒,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎椰弊,沒想到半個月后许溅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡秉版,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年贤重,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片清焕。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡并蝗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出秸妥,到底是詐尸還是另有隱情滚停,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布粥惧,位于F島的核電站键畴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏影晓。R本人自食惡果不足惜镰吵,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挂签。 院中可真熱鬧疤祭,春花似錦、人聲如沸饵婆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至草穆,卻和暖如春灌灾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悲柱。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工锋喜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人豌鸡。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓嘿般,卻偏偏與公主長得像,于是被迫代替她去往敵國和親涯冠。 傳聞我的和親對象是個殘疾皇子炉奴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容