閱讀447 返回首頁    go 阿裏雲 go 技術社區[雲棲]


數據尋龍點穴(空間聚集分析) - 阿裏雲RDS PostgreSQL最佳實踐

標簽

PostgreSQL , Greenplum , PostGIS , K-Mean , 熱力圖


背景

最近鬼吹燈熱播,胡八一的《十六字陰陽風水秘術》到底是什麼武功秘籍?尋龍點穴又是什麼?別問我,不知道。

pic

PS:截取自互聯網。- 尋龍點穴是風水學術語。古人說:三年尋龍,十年點穴。意思就是說,學會尋龍脈要很長的時間,但要懂得點穴,並且點得準則難上加難,甚至須要用“十年”時間。 但是,若沒正確方法,就是用百年時間,也不能夠點中風水穴心聚氣的真點,這樣一來,尋龍的功夫也白費了。 準確地點正穴心,並不是一件容易的事,對初學者來說如此,就是久年經驗老手,也常常點錯點偏。

pic

但是,我們要相信科學的力量,如今大數據、AI這麼發達,實際上我們可以在海量數據的情況下總結經驗,和前人通過古老的夜觀星象總結的經驗可能會出現驚人的相似。

我們有海量的人物活動數據、汽車活動數據、傳感器數據等等。完全可以分析出來什麼樣的地方適合居住,什麼樣的地方適合做生意,等等。

扯遠了,我們回到主題 - 空間數據尋龍點穴。實際上就是PostGIS 2.3的兩個新特性,空間數據的聚集分析。

例如我們有人物活動的點數據組成的海量數據,通過空間聚集分析,可以匯聚出指定時間段,數據聚集的熱力圖。是不是和尋龍點穴有點相似呢?

pic

pic

pic

空間聚集窗口分析函數

鬼吹燈中有一段關於“龜眠之地”的描述:

我掏出《十六字陰陽風水秘術》翻了翻,找到一段“龜眠之地”的傳說,書中記載,當年有人在海邊,見到海中突然浮出一座黑山,再細觀之,原來是數十隻老龜,馱負著一頭死去的巨龜自海中而出,這些老龜把死龜馱至一處山崖下地洞穴裏藏好,這才陸續離去遊回大海,偷偷看到這一切的那個人,擅長相地擇穴之術,知道此穴乃是四靈所鍾。洞中“龍氣衝天”,其時正好他家中有先人故去,於是他探明洞中龜屍的特形後,把自己的先人不用棺槨裸身葬入其中。此後這個人飛黃騰達、平步青雲,成就了一方霸業。那處龜眠洞日後就成了他家宗室的專用慕穴,數百年後龍氣已盡,地崩,露出屍體無數,當地人爭相圍觀,所有屍身皆生鳥羽龍鱗,被海風吹了一天一夜之後,全部屍體同時化為烏有。

鬼吹燈和數據分析有什麼關聯呢?必須有啊,你想想,古人為了找到一塊“龜眠之地”得費勁多少心思了。而現在我們有了數據,是不是很好找了呢。

假設我們的數據包含這些維度:

1、時間

2、人物位置

3、人物屬性(收入、行業、年齡、等等)

好了,想象一下,你是不是可以按人物屬性、時間,對數據進行空間聚集分析。生成不同分析維度的人群熱力圖。頗有尋龍點穴範。

那麼怎麼做空間數據的聚集分析呢?

PostGIS 2.3 新增了兩個窗口函數,就是用於

1、基於Density-based spatial clustering of applications with noise (DBSCAN) 算法的空間數據聚集分析函數ST_ClusterDBSCAN

pic

2、基於 k-means 算法的空間數據聚集分析函數ST_ClusterKMeans

pic

有意思吧。

pic

例子

1、

 -- Partitioning parcel clusters by type  
SELECT ST_ClusterKMeans(geom,3) over (PARTITION BY type) AS cid, parcel_id, type  
FROM parcels;  
-- result  
 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  
(7 rows)  

2、

SELECT name, ST_ClusterDBSCAN(geom, eps := 50, minpoints := 2) over () AS cid  
FROM boston_polys  
WHERE name > '' AND building > ''  
	AND ST_DWithin(geom,  
        ST_Transform(  
            ST_GeomFromText('POINT(-71.04054 42.35141)', 4326), 26986),  
           500);  

st_union 空間對象聚合

前麵提到的兩個窗口函數隻是生產每條記錄所屬的聚集ID,按這個聚集ID在聚合,就可以聚合成一個個的幾何對象(例如點集),通過點集再可以生成sufface。

https://postgis.net/docs/manual-dev/ST_MemUnion.html

https://postgis.net/docs/manual-dev/ST_Union.html

空間聚集分析業務場景

空間聚集分析窗口函數,非常有助於基於人物、被檢測對象在時間、空間、對象屬性等多種維度層麵的空間聚集透視。

關於多維數據透視,也可以參考我以前寫的文章。

《時間、空間、對象多維屬性 海量數據任意多維 高效檢索 - 阿裏雲RDS PostgreSQL最佳實踐》

實際上除了這兩個窗口分析函數,PostgreSQL還提供了MADlib機器學習庫,通過SQL接口、R接口(pitovalR)、Python接口可以進行調用,利用數據庫的分析能力完成數據透視和編程的易用性(海量數據有MPP,中等體量有PG的多核並行計算、向量計算、JIT等大幅度提升計算能力的特性)。

阿裏雲相關數據庫產品

阿裏雲 RDS PostgreSQL

阿裏雲 HybridDB for PostgreSQL

參考

https://planet.postgis.net/index.html

https://postgis.net/docs/manual-dev/ST_ClusterKMeans.html

https://en.wikipedia.org/wiki/K-means_clustering

https://postgis.net/docs/manual-dev/ST_ClusterDBSCAN.html

https://planet.qgis.org/planet/tag/postgis/

https://2012.ogrs-community.org/2012_papers/d3_10_bonin_presentation.pdf

https://www.waurisa.org/conferences/2009/presentations/Tues/OpenSourceWebModelingAndVisualization_Tues_Vennemann_TerraGIS.pdf

最後更新:2017-08-20 17:06:43

  上一篇:go  數據庫和集合(MongoDB 文檔翻譯和解讀)
  下一篇:go  空間索引(GiST、BRIN、R-Tree)選擇、優化 - 阿裏雲RDS PostgreSQL最佳實踐