背景
现在我们的数据量越来越来越⼤,往往会有短时间渲染⼤量数据的要求,但是往往这些数据过⼤难以实时处理,整体切⽚花费时间⼜过长。在这⾥提出⼀种缓存加实时处理的⽅案。 准备
软件环境,PostGIS(3.0.0rc2 r17909)和 PostgreSQL( 12.0, compiled by Visual C++ build 1914, 64-bit),数据是微软开源的房屋数据。PostGIS3.0相对与PostGIS 2.5⼤幅度提升⽮量切⽚性能,并⾏环境表现更好。风动旗杆
预处理就是将3级到12级的⽮量切⽚事先切好。⾸先获取数据12级的最⼤最⼩xyz,通过这个范围⽣成⽹格,然后和数据相交得到⼀⼀对应的关系表a。 接下来就是使⽤四叉树键(quadkey),四叉树有⼀些有意思的特性。第⼀,四叉树键的长度等于该⽡⽚所对应的图像级别;第⼆,每个⽡⽚的四叉树键的前⼏位和其⽗⽡⽚(上⼀图像级别所对应的⽡⽚)的
四叉树键相同,下图中,第1级的 '⽡⽚2' 是第2级的 '⽡⽚20' ⾄ '⽡⽚23' 的⽗⽡⽚,第2级的 '⽡⽚13' 是 第3级的 '⽡⽚130' ⾄ '⽡⽚133' 的⽗⽡⽚。通过四叉树的这个特性把3到11级的xyz和11级的xyz 建⽴对应关系表b,最终a和b关联可以得到三到⼗⼀级和数据的对应关系。
根据上述内容,我们就可以⽣成⾏⽮量切⽚了,借助golang并发,千万级⾯数据预处理(加上gzip压缩)⼤概需要16分钟。
后台服务
金银花绿原酸
冰鲜台 预处理⽮量切⽚⽣成完以后,使⽤golang把⽮量切⽚全部加载进程序中,并且建⽴键值对,能够快速的判断请求的xyz在3-11级是否有数据并且存在数据时能快速获取。当数据请求⼤于⼗⼀级时候,我们使⽤数据库查询⽅式获取⽮量切⽚。后台编写时候遇到问题,后端向前端传输⼤的⽮量切⽚速度过慢。我通过数据切割⽅式解决这个问题。打个⽐⽅,吃⼀个西⽠,你⼀⼝吃不下。那我们是不是切成块吃就可以?切块就是数据分割这样能较快的传输⼜不影响数据完整性。
渲染
耐高温润滑油 前台渲染使⽤mapbox gl加载⾃定义⽮量切⽚
总结
本⽂⽅案中使⽤缓存少量层级提升整体渲染速度,实际前端浏览中能较为流畅。由于数据限制,⽅案的测试数据较为单⼀,可能不具有代表性。本⽅案预处理切⽚层级不宜过⼤,超过12级预处理性能会急剧降低。侧安全气囊
>地下室排水沟