背景
????之前做的海量數(shù)據(jù)數(shù)據(jù)展示,在預(yù)處理速度和渲染上還有有所欠缺,比如單個切片文件還是太大,本文中進(jìn)行一些優(yōu)化工作,使得一分鐘處理完一千多萬點(diǎn)數(shù)據(jù)的1-11級矢量切片,在線瀏覽數(shù)據(jù)請求時間控制在1s左右。
準(zhǔn)備
????軟件環(huán)境:PostGIS,數(shù)據(jù)是微軟開源的部分房屋數(shù)據(jù)public.california20191107(10988317條)取中心點(diǎn)。
原理
????我們之前都聽過像素聚合,把坐標(biāo)點(diǎn)轉(zhuǎn)成像素,這樣能大大降低顯示壓力。而在矢量切片中也有類似的東西,就是ST_AsMVTGeom,他會把幾何數(shù)據(jù)轉(zhuǎn)成切片的坐標(biāo)。所以我們可以在單個切片處理中進(jìn)行進(jìn)行坐標(biāo)轉(zhuǎn)換,然后把坐標(biāo)聚合。同時我們可以調(diào)整切片的格網(wǎng)大小,默認(rèn)會用4096,但是在小比例尺可以用小網(wǎng)格把這個值調(diào)整小些,能更好的聚合(TileBBox參考之前前的文章)。第二種方式是使用數(shù)據(jù)庫自帶width_bucket進(jìn)行聚合。
--示例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
image
image
參考資料:
https://blog.csdn.net/qq_35241223/article/details/106439268
http://m.itdecent.cn/p/60bab5196063