背景
之前做的海量數據數據展示,在預處理速度和渲染上還有有所欠缺,比如單個切片文件還是太大,本文中進行一些優化工作,使得一分鍾處理完一千多萬點數據的1-11級矢量切片,在線瀏覽數據請求時間控制在1s左右。
准備
軟件環境:PostGIS,數據是微軟開源的部分房屋數據public.california20191107(10988317條)取中心點。
原理
我們之前都聽過像素聚合,把坐標點轉成像素,這樣能大大降低顯示壓力。而在矢量切片中也有類似的東西,就是ST_AsMVTGeom,他會把幾何數據轉成切片的坐標。所以我們可以在單個切片處理中進行進行坐標轉換,然后把坐標聚合。同時我們可以調整切片的格網大小,默認會用4096,但是在小比例尺可以用小網格把這個值調整小些,能更好的聚合(TileBBox參考之前前的文章)。第二種方式是使用數據庫自帶width_bucket進行聚合。
--示例1
SELECT ST_AsMVT(vt,'points',256,'geo') tile
FROM (select ST_SetSRID( ST_Point( ST_X(a.geo),ST_Y(a.geo)), 4326) geo from (
SELECT ST_AsMVTGeom(w.geom,Box2D(TileBBox(10,176,409,4326)),256,0,true) AS geo
FROM public.capnt w where TileBBox(10,176,409,4326)&&geom) a
group by ST_X(a.geo),ST_Y(a.geo) ) AS vt
--示例2
SELECT ST_AsMVT(vt,'points',128,'geo') tile
FROM ( SELECT ST_AsMVTGeom(a.geom,Box2D(TileBBox(8,206,113,4326)),128,0,true) AS geo FROM (select
width_bucket(st_x(a.geom),ST_XMin(TileBBox(8,206,113,4326)), ST_XMax(TileBBox(8,206,113,4326)),200) grid_x,
width_bucket(st_y(a.geom), ST_YMin(TileBBox(8,206,113,4326)), ST_YMax(TileBBox(8,206,113,4326)), 200) grid_y,
st_centroid(st_collect(a.geom)) geom
from public."point_grid" a where TileBBox(8,206,113,4326)&&a.geom group by 1,2) a ) AS vt
參考資料:
https://blog.csdn.net/qq_35241223/article/details/106439268
https://www.jianshu.com/p/60bab5196063