今年三月份寫了一篇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