千万数据展示-矢量切片点聚合

背景

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

posted @   polong  阅读(1410)  评论(11编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示