方案背景
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計算矢量切片(二)--按值渲染](http://p2.ttnews.xyz/loading.gif)
只要通過上圖的方式就能查詢到我想要的帶屬性值的矢量切片,代碼如下。只要先輸入需要查找的範圍,用STAsMVTGeom查詢出範圍內矢量並轉換成屏幕座標,最後用STAsMVT壓縮數據成mvt格式,和之前文章有所不同的是,查詢過程中加入了屬性的查詢,壓縮之後矢量切片就會帶上我們想要的屬性值(w.v就是我們想要的屬性值)
<code>SELECT
ST_AsMVT(tile,'points'
,4096
,'geom'
) tileFROM
(SELECT
w.v,ST_AsMVTGeom(w.the_geom,Box2D(ST_MakeEnvelope(119.531250
,30.751278
,120.937500
,31.952162
,4326
)),4096
,0
,true
)AS
geomFROM
pnt w)AS
tilewhere
tile.geomis
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計算矢量切片(二)--按值渲染](http://p2.ttnews.xyz/loading.gif)
性能對比
一百萬數據,頁面加載結束5s;十萬數據,頁面加載結束1.86s.同樣數據,百萬數據,geoserver的(openlayer)頁面加載結束20.20s;十萬數據時,geoserver的的(openlayer)頁面加載結束4.32s
附代碼地址:
https://github.com/tpolong/postgisvectortile