首頁>技術>
01 引言

如何對時空資料庫中的億級向量空間資料進行線上視覺化一直是業界難題。因資料體量大,傳統方法需要將資料庫中資料進行基於快取切片的服務釋出才能視覺化,操作流程冗長,且有一大堆需要考慮的問題:

如果對向量資料進行預切片,資料要切多久?切多少級合適?儲存瓦片的硬碟空間夠用嗎?如果使用實時瓦片,實時渲染瓦片的響應時間能保證嗎?如果使用向量瓦片,小比例尺的瓦片可能會有多大體積?傳輸會不會成為瓶頸?前端渲染能承受多大的資料量?

如果是要快速瀏覽資料庫中的大規模線上資料,傳統用於“底圖服務”的離線切片生產流程幾乎無解,不但費時費力,又無法線上聯機處理。黑科技來了,本文介紹如何使用RDS PG或PolarDB(相容PG版或Oracle版)的Ganos時空引擎提供的資料庫快顯技術,僅用百行程式碼實現億級海量幾何空間資料的線上快速顯示和流暢地圖互動,且無需關注切片儲存和效率問題。

02 技術特性解讀

Ganos的線上快顯處理的核心是將資料庫和視覺化進行了關聯,提供了一種新的視覺化索引技術——稀疏向量金字塔(Sparse Vector Pyramid,SVP)索引。SVP具備兩個關鍵特性:快與省

其中,快指兩個階段的快:

金字塔建立快:Ganos利用空間索引對資料在空間上進行密集度劃分,根據密集度建立一種稀疏向量金字塔索引,相比傳統切圖流程減少了90%的資料計算量。同時,建立金字塔採用了完全並行處理模式,即使1億條地類圖斑資料生成金字塔也僅需耗費約10分鐘時間。資料展現快:Ganos採用了視覺可見性剔除演算法,根據Z-order排序,過濾掉大量不影響顯示效果的資料,從而加快實時顯示的效率。Ganos支援直接輸出PNG格式的柵格瓦片和MVT格式的向量瓦片,1億地類圖斑資料實時渲染顯示的響應時間都達到秒級。

省也具有兩個維度:

節省磁碟空間:1億條地類圖斑資料生成金字塔索引僅僅佔據原表5%大小的額外空間。節省開發時間:僅使用簡單的SQL語句,透過調整語句引數即可靈活控制顯示效果。03 使用步驟

Ganos的快顯引擎使用上非常簡潔,已高度封裝了SQL函式。需要注意的是,第一次使用快顯引擎之前,需要顯式建立對應的擴充套件模組,執行的語句如下:

CREATE EXTENSION ganos_geometry_pyramid CASCADE;

注:*左右滑動閱覽

透過執行以上語句,快顯引擎的計算元件將會被載入起來。

3.1 建立稀疏向量金字塔

假設您已建立了某個向量大表並匯入了資料,接著就可以使用Ganos的st_buildpyramid方法建立向量金字塔。

boolean ST_BuildPyramid(cstring table, cstring geom, cstring fid, cstring config)

注:*左右滑動閱覽

其中

table:向量資料所在的表名。geom:向量欄位名。fid:向量要素記錄的唯一標識,支援Int4/Int8型別。config:json格式的配置引數字串。在本例中,我們指定向量金字塔的名稱和使用的邏輯瓦片大小(這個瓦片大小並非真實存在的瓦片,僅表示一種空間上的邏輯劃分)

實際呼叫如下:

ST_BuildPyramid('points', 'geom', 'gid', '{"name":"points_geom","tileSize":512}')

注:*左右滑動閱覽

我們為表points的geom欄位建立了一個向量金字塔,金字塔名我們指定為points_geom,同時設定金字塔的邏輯瓦片大小為512。

3. 2 獲取柵格瓦片

柵格瓦片是圖片形式的瓦片(Tile),是使用最廣泛的一種地圖瓦片形式。Ganos的ST_AsPng方法提供了在資料庫端將向量資料按需動態渲染為柵格瓦片的功能。該功能提供了最基礎的柵格符號化能力,更多面向一些不需要複雜符號化的輕量級場景,如數管系統中。

bytes ST_AsPng( cstring name, cstring tile, cstring style)

注:*左右滑動閱覽

其中

name:金字塔表名。tile:瓦片索引行列號,Z_X_Y的形式。style:渲染樣式。我們可以透過如下引數調節渲染效果:point_size:點大小,單位為畫素。line_width:線寬,對線要素和麵要素的外邊框起作用,單位為畫素。line_color:線渲染顏色,對線要素和麵要素的外邊框起作用。前6位為16進位制顏色,後2位為16進位制透明度。fill_color:填充顏色,對面要素起作用。background:背景色。一般設定為FFFFFF00,即純透明。

實際呼叫如下:

ST_AsPng('points_geom', '1_2_1','{"point_size": 5,"line_width": 2,"line_color": "#003399FF","fill_color": "#6699CCCC","background": "#FFFFFF00"}')

注:*左右滑動閱覽

我們從向量金字塔中獲取到索引行列號為x=2,y=1,z=1的向量瓦片,並將該向量瓦片按照我們配置的樣式渲染為柵格瓦片,返回PNG格式的圖片。

3. 3 獲取向量瓦片

向量瓦片是新興的地圖瓦片技術,具有在前端配置樣式的靈活特性,使用WebGL渲染,效果也更加美觀,Mapbox等地圖框架可以方便的支援這一格式。使用Ganos的ST_Tile方法可以將向量金字塔中的資料以向量瓦片的形式提供。

bytea ST_Tile(cstring name, cstring key);

其中

name:金字塔名。在本例中為表名_向量欄位名。key:瓦片索引行列號,Z_X_Y的形式。

我們只需要提供標準的TMS行列號和金字塔表的名稱即可呼叫。

實際呼叫如下:

 ST_Tile('points_geom', '1_2_1');

我們從向量金字塔中獲取到索引行列號為x=2,y=1,z=1的向量瓦片,返回資料為標準的MVT格式。

04 實戰案例

4.1 測試資料

我們準備兩份向量資料作為測試樣例。

buildings表為面數據,資料總計1.25億條,展現使用柵格瓦片的線上視覺化效果。

gid|geom                                                                                                                                                                                                                                                           |---|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|  1|MULTIPOLYGON(((-88.066953 34.916114 0,-88.066704 34.916114 0,-88.066704 34.91602 0,-88.066953 34.91602 0,-88.066953 34.916114 0)))                   2|MULTIPOLYGON(((-87.924658 34.994797 0,-87.924791 34.99476 0,-87.924817 34.994824 0,-87.924685 34.994861 0,-87.924658 34.994797 0)))

注:*左右滑動閱覽

points表為點資料,資料總計10.7萬條,展現使用向量瓦片的線上視覺化效果。

id|geom                          |--|------------------------------| 1|POINT (113.5350205 22.1851929)| 2|POINT (113.5334245 22.1829781)|

4.2 全棧架構

資料庫-快顯全棧架構包含資料庫伺服器、python服務端和使用者端三個部分。

4.3 服務端程式碼

為了程式碼簡潔,更側重於邏輯的描述,我們選擇了Python(相容Python3.6及以上版本)作為後端語言,Web框架使用了基於Python的Flask(使用pip install flask進行安裝)框架,資料庫連線框架使用了基於Python的Psycopg2(使用pip install psycopg2進行安裝)。

值得一提的是,我們實現了最基礎的功能,當Web服務自身的效能出現瓶頸時,可按不同的平臺與框架進行最佳化,獲得更好的響應效能。

我們在後端首先建立了向量金字塔,其後分別實現了兩個介面,向量瓦片介面使用points表中的資料,柵格瓦片介面使用buildings表中的資料,並定義好樣式,供前端直接呼叫。為了方便說明,後端程式碼同時提供了向量柵格兩個介面,實際使用時可以按需選擇。

{  "circle-radius": 4,  "circle-color": "#000000",  "circle-stroke-width": 2,  "circle-opacity": 0.3,  "circle-stroke-color": "#003399",  "circle-stroke-opacity": 0.9,}

注:*左右滑動閱覽

將以上程式碼儲存為Vector.py檔案,執行python Vector.py命令即可啟動服務。

從程式碼不難推斷,無論我們使用何種語言、何種框架,我們只需將向量或柵格瓦片的SQL語句封裝為介面即可實現完全相同的功能。相比釋出傳統的地圖服務,藉助Ganos的向量金字塔功能實現線上視覺化是更加輕量好用的選擇:

針對柵格瓦片,可以在透過改變程式碼進行樣式控制,靈活性大大增強。無需引入第三方的其他元件,也不需要進行針對性最佳化,就有令人滿意的響應效能。可以任意選擇使用者熟悉的程式語言與框架,也無需複雜專業的引數配置,對非地理從業者更加的友好。

4.4 使用者端程式碼

我們選用Mapbox作為前端地圖框架,展示後端提供的向量瓦片層和柵格瓦片層,併為向量瓦片層配置了渲染引數。

為了方便說明,前端程式碼同時添加了向量、柵格兩個圖層,實際使用時可以按需選擇。

我們在後端程式碼的同一檔案目錄下新建名為Vector.html的檔案,寫入下列程式碼,在後端服務啟動後,就可以透過http://localhost:5000/vector訪問了。

可以在前端調節不同效果。調整為新的圖層引數後效果如下:

{  "circle-radius": 4,  "circle-color": "#000000",  "circle-stroke-width": 2,  "circle-opacity": 0.3,  "circle-stroke-color": "#003399",  "circle-stroke-opacity": 0.9,}
05 與PGADmin整合

PG資料庫管理工具PGAdmin原生支援向量資料的視覺化,但因缺乏快顯技術,僅能單物件顯示或有限結果集顯示,無法對大規模向量資料進行暢快淋漓的全域性瀏覽。我們將Ganos的向量快顯功能與PGAdmin整合,資料入庫即可線上瀏覽全域性,快速評估資料概況,大大增強了資料管理的使用體驗。

06 總結

#阿里雲# #資料庫# #空間# #地圖#

9
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 經過多方調研,最終還是決定禁用FastJson