背景
之前做的海量数据数据展示,在预处理速度和渲染上还有有所欠缺,比如单个切片文件还是太大,本文中进行一些优化工作,使得一分钟处理完一千多万点数据的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