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

方案背景

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

前期準備

    軟件是用的是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,根據奇偶性給字段賦值。

後臺梳理

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

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

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

<code>

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

/<code>

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

前臺展示

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

<code>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, ' [1, ' ] },

'circle-opacity': 1

} }); /<code>

顯示效果如下

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

性能對比

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

附代碼地址:

https://github.com/tpolong/postgisvectortile


分享到:


相關文章: