postgis計算矢量切片(二)--按值渲染

方案背景

    今年三月份寫了一篇postgis計算矢量切片,參考了網上資料給出了一份很粗糙的相關方案(文章寫的更粗糙)。當時的方案中只能針對gis形狀進行渲染,而不能用屬性渲染.針對這個狀況,本文進行相對應的修改。git

前期準備

    軟件是用的是Qgis和Postgis(Postgis版本爲2.42 ,Postgresql版本爲10.0)。qgis使用Ramdom points in extent 用來生成測試數據,數據範圍參數使用 120.6327590942379970,120.8625335693359943,31.2309341430663991,31.4467678070068004(xmin,xmax,ymin,ymax),數據量設置爲十萬。生成好數據,再建好索引,添加字段v,根據奇偶性給字段賦值。github

後臺梳理

    先看了ST_AsMVT和ST_AsMVTGeom幫助文檔,一頭霧水.使用谷歌大法,發現了這個資料參考資料 sql

參考資料

只要經過上圖的方式就能查詢到我想要的帶屬性值的矢量切片,代碼以下。只要先輸入須要查找的範圍,用ST_AsMVTGeom查詢出範圍內矢量並轉換成屏幕座標,最後用ST_AsMVT壓縮數據成mvt格式,和以前文章有所不一樣的是,查詢過程當中加入了屬性的查詢,壓縮以後矢量切片就會帶上咱們想要的屬性值(w.v就是咱們想要的屬性值)bash

SELECT ST_AsMVT(tile,'points',4096,'geom') tile  FROM (SELECT w.v,ST_AsMVTGeom(w.the_geom,Box2D(ST_MakeEnvelope(119.531250,30.751278,120.937500,31.952162, 4326)),4096, 0, true)	 AS geom FROM pnt w) AS  tile where  tile.geom is not null
複製代碼

    作完這些咱們只要用後臺語言寫一個服務,將前臺請求的切片座標z/x/y這些轉換成經緯度獲得最大最小經緯度,放到前面提到的sql中去查詢就能夠。dom

前臺展現

    前臺展現仍是選用mapbox,添加自定義矢量切片數據源,修改下按值渲染顏色post

map.addLayer({
               "id": "custom-go-vector-tile-layer",
                "type": "circle",
                "source": "custom-go-vector-tile-source",
                "source-layer": "points",
                paint: {
                    'circle-radius': {
                        stops: [
                            [8, 0.1], [11, 0.5],[15, 3],[20, 60]
                        ]
                    },
                    'circle-color': {
                        property: 'v',
                        stops: [
                            [0, '#990055'],
                            [1, '#2a55b9']
                        ]
                    },
                    'circle-opacity': 1
                }
            });
複製代碼

顯示效果以下 性能

前臺展現

性能對比

    一百萬數據,頁面加載結束5s;十萬數據,頁面加載結束1.86s.一樣數據,百萬數據,geoserver的(openlayer)頁面加載結束20.20s;十萬數據時,geoserver的的(openlayer)頁面加載結束4.32s
測試

附代碼地址:

https://github.com/tpolong/postgisvectortileui

相關文章
相關標籤/搜索