本文使用 zhihu on vscode 創作並發布這篇文章主要對前段時間的兩千萬個點資料視覺化展示問題進行乙個總結,經過兩個周左右的努力,在當前階段,採用快取加多執行緒的方式很好的解決了千萬級poi點在單機環境下高效的視覺化的問題。
專案的總體要求就是,兩千萬左右的資料量下,不使用集群技術,減少硬體成本,找到合理的高效的資料展示方案,前端瀏覽不能卡頓。我們的資料在地理空間分布上集中於廣東、深圳區域,也就是大約覆蓋乙個省的空間範圍,資料點分布較為集中。
在面臨千萬級資料量下,如果以柵格瓦片的方式將資料發布為服務,這也是沒問題的,但是柵格瓦片不能進行互動。既然柵格瓦片不行,那就試試向量瓦片吧。
於是,筆者一開始是打算用向量瓦片去解決這個問題的。個人理解,向量瓦片的特點主要集中於兩點,一是在柵格瓦片的基礎上,將柵格瓦片中金字塔分級組織資料的方式應用到向量資料中,以分級金字塔的方式組織向量資料;二是在前後端資料傳輸中採用的資料壓縮方案,比如mapbox 提出的mapbox vector tiles格式的瓦片方案。那麼,接下來,就是如何利用生成向量瓦片了。
個人對向量瓦片的生成技術總結如下圖所示,總體可以分為預切片與實時切片兩種。預切片的含義時,借助切片工具來,提前生成、組織好瓦片,提供瓦片服務給前端。實時切片的含義是在前端發起瓦片請求後,後端服務去動態的生成瓦片資料,返回給前端渲染。實時切片技術所帶來的好處就是,資料可以實時更新,對原始資料進行修改後,無需再重新進行切片工作,可以直接在瓦片中看見變化了的資料。而如果採用預切片技術,就必須重新進行切片,發布切片服務後才能檢視資料的最新變化。
圖1 向量瓦片生成方案
在預切片中,我們有兩種技術方案。第一是採用geoserver(arcgis server等商業軟體也具備這樣的能力)進行資料切片,服務發布工作,然後前端通過leaflet、openlayers 等gis框架就可直接載入向量瓦片服務。第二種方案分為兩步,首先採用tippecanoe(mapbox 開源的向量切片工具,支援geojson、csv等多種資料格式) 等切片工具,將原始資料轉換為切片檔案,其中切片檔案可以以瓦片檔案目錄的方式進行組織,或者以mbtiles(mapbox 開源的,以sqlite資料庫方式儲存瓦片的方案) 格式進行組織。然後使用node、go 等搭建靜態瓦片伺服器,處理前端瓦片請求,其整個過程如下圖所示。
預切片方案
在第二種方案中,其優勢就是借助node、go 的高併發能力,提供高併發的瓦片請求處理能力,具體實踐方案和效果可以參加這篇文章
在實時瓦片生成方案下,在不採用大資料元件的方案下,我們可以借助postgis 去動態的生成mvt格式的向量瓦片,詳細的過程可以參見另一篇文章。
在對千萬級poi點的前端展示方案上,我們採取的總的思路是進行分級別顯示,在高層(也就是縮放層級較高,zoom=0為最高)時使用熱力圖、聚集圖等資料概覽、統計的方式進行資料展示。當使用者縮放到低層後,此時給使用者展示真實的點資料。
熱力圖帶來的好處是,你可以通過顏色的深淺來判斷資料的分布趨勢,但是效果的好壞其實是和你後端統計的資料息息相關的。
熱力圖 聚集圖是我認為另一種比較好的展示方式,如下圖所示,聚集圖帶來的好處是,你可以通過數字直觀的看見區域內的資料分布。但是,就我近期查閱的資料來看,聚集圖都是在前端進行資料聚集後產生的效果,在一兩萬的資料量下,產生聚集圖應該是沒什麼問題的,但是不適用於大規模的資料展示。
聚集圖
最終,我們選用的是通過格網劃分的方式進行資料展示。在高層,通過格網的顏色深淺和格網內數量來進行資料展示。當使用者縮放到低層後,我們直接載入點資料。
格網展示效果圖
在這個方案中,後端服務主要有兩個功能,第一是在高層縮放級別時,處理前端的格網請求,返回格網的空間範圍和要素數量。第二是在低層縮放級別時,處理前端的要素請求,返回當前視野內所有的poi點要素。如下圖所示,在資料處理的過程中,我們的格網是需要根據前端的縮放級別和視野範圍進行動態變化的。
格網動態變化
為了支撐前端的資料展示,我們後端需要解決兩個問題。
格網和要素統計
高併發請求處理
格網要素統計主要是為我們的格網展示服務,我們必須獲生成格網和相應的要素數量。同時,在使用者進行縮放和移動過程中,前端會發起大量的資料請求。而且,即使只展示格網,我們需要傳遞的格網資料依舊很大。在動態的生成格網的過程中,我們有大量的空間查詢操作。在千萬級別的資料下進行空間查詢是很耗時的操作。只有減少後端的請求處理時間,我們才能保證請求不超時,瀏覽不卡頓。
解決這個問題的辦法是使用geohash演算法,geohash演算法是空間填充曲線的一種,其特徵是能夠對資料進行降維處理,將二維的空間資料轉換為hash字串,將負載的空間查詢計算轉換為字串的比較。在我們的專案中,我們再資料入庫過程中,使用postgis 的函式,為每個座標點生成geohash串,同時進行也基於geohash演算法進行格網劃分,資料統計,最終生成格網資料。
在構建高併發服務方面,主要的解決思路在兩點。第一是使用redis快取機制,提高快取命中率,減少資料的查詢時間。第二是利用執行緒池和非同步處理技術,對前端的資料請求進行非同步處理,使用執行緒池進行資料查詢,查詢完成後再將資料返回給前端。具體的技術方案是使用spingboot 的事件機制和deferredresult進行非同步處理。
flask資料庫視覺化SQLite
在 flask sqlalchemy 中,資料庫使用 url 指定。最流行的資料庫引擎採用的資料庫 url格式如下表所示。flask sqlalchemy資料庫url sqlite 資料庫不需要使用伺服器,因此不用指定 hostname username 和password。url 中的 datab...
Ubuntu上面安裝sqlite3視覺化資料庫軟體
3是linux上的小巧的資料庫,乙個檔案就是乙個資料庫。2.安裝 要安裝sqlite 3,可以在終端提示符後執行下列命令 sudo apt get install sqlite3 檢查版本sqlite 3 version 3.測試 當前目錄 下建立test.db測試資料庫檔案 sqlite 3 te...
資料視覺化 什麼是資料視覺化
資料對應的英文單詞是data,從資訊獲取的角度看,資料是對目標觀察和記錄的結果,是現實世界中的時間 地點 事件 其他物件或概念的描述。不同學者對資料的作用也給出不同的定義,大致分為以下3類 視覺化對應的兩個英文單詞 visualize和visualization。visualize是動詞,描述 生成...