可视化40M信号塔

2021-02-18 03:07:22

OpenCelliD是世界上最大的 使用许可证打开手机发射塔数据库 CC BY-SA 4.0

该表格数据[1]包含约4000万行和6列,但只有3个 在此可视化中使用列(纬度,经度和类型)。

[1]输入数据的结构。上表数据逐行读取,并按其位置信息分组。 就像它们是XYZ Tiles一样完成分组。

首先,为每个图块创建空的2d整数数组,其元素为 用值= 0初始化。 这些值包含一个计数器,该计数器显示的行数 在地理上包含在该像素中。 每行将相关计数器增加一个[2]。 使用此方法迭代所有行之后,我们最终得到了一堆 整数值(在不同的2d数组中),它们表示每个区域的行数。

[2]每行增加相关的计数器。为了达到城市级别的可视化分辨率, 应生成缩放级别9。 对于XYZ拼贴,每个缩放级别的拼贴数为4 ^ zoom。 因此,对于介于0到9之间的缩放级别,应生成的图块数量 变为4 ^ 0 + 4 ^ 1 + 4 ^ 2 + .. + 4 ^ 9,等于349525。 每个图块都有256x256整数值。 即使使用32位大小的整数值, 一个图块占用256 * 256 * 32位= 256 KB的存储空间, 349525磁贴占用87 GB的存储空间, 绝对不能接受。

为了解决此大小问题,每个图块Blob均独立压缩 采用现代压缩算法 布罗特利。 尽管brotli编码速度较慢,但​​其解码速度快且压缩率高 与较旧的压缩方法(例如gzip)相比。此外, brotli-compressed-data是 所有现代浏览器均可本地解码。 由于在海洋或不宜居住的地区没有手机信号塔,因此这些地区的瓷砖 充满零值或非常稀疏。由于这种高冗余度, 这些区域的压缩效果非常好(256kb压缩到20〜100bytes)。

为了简化算法,它被描述为好像只有一个 每个像素中的计数器值,但每个像素中有4个计数器值 持有不同蜂窝塔类型的行数[3]

[3]每个像素都存储一个以上的通道(计数器),即使这些图块像XYZ图块一样存储,但并非 有效的XYZ区块。由于这些Blob只是brotli-compressed-integer-arrays。 可视化要求从blob到图像的转换。此转换是 由客户端javascript和HTML5 Canvas API完成。

此可视化中的基础地图显示库为 传单。 传单作者对编写如此有据可查且可扩展的文档表示敬意 地图库,我能够为传单编写一个自定义的图块层 拦截传单发出的图像平铺请求并将其重定向 图像图块向图像生成(客户端)网络工作者发出的请求 像磁贴服务器一样工作。网络工作者遵循一种简单的算法来生成图像。 它逐像素读取行计数值,并为此生成颜色 像素(行计数越高,像素颜色越不透明)。

总而言之,这对我来说是一个有趣的项目,我学到了很多东西 有关数据压缩和多线程处理的信息。 通过将计算密集型任务卸载到Web工作者,非常令人印象深刻的可视化 即使不牺牲UI线程上的单个FPS也可以实现。