(2) 解析 mvt 数据
解析mvt数据,主要是通过 ol/format/MVT 这个解析库实现的。根据获取到 arrayBuffer 数据,可以通过 ol/format/MVT 的 readFeatures 从一个 arrayBuffer 中获取到所有的 feature 信息。
(3) 解析 mapbox 的样式信息
如何解析 mapbox 的样式信息,将其应用到主要是通过 ol-mapbox-style 这个库来实现。但是这个库也有些问题:
字体的渲染
在官方的库文件中,并不能支持 mapbox 的 style 的 glyphs 配置为 pbf 格式。
精灵图的绘制
在库中,精灵图的加载通过 image 进行控制,异步获取图片数据之后,通过调用图层的 change 方法,触发图层数据的更新,但是这步操作,在 Cesium 里面是没有的。
各个图层样式分离
mapbox的样式文件中 layers 是一个数组,多个图层可以共用一个 source。这点在Cesium中不好实现,因为一个Cesium图层,对应的应该是一个source数据源,一个数据源的mvt切片包中,包含了多个feature,每一个feature分属不同的层。也就是说在创建Cesium时,一个图层对应一个 provider。
(4) 在 Cesium 上绘制整个图层
在Cesium绘制图层也同样通过 requestImage 函数,这个函数在获取数据后,可以通过返回一个 canvas 进行图层的绘制。也就是说可以讲获取到的 mvt 解析数据后,绘制到一个 canvas 上,这样就可以在 requestImage 进行返回,供 Cesium 进行渲染了。
总结:
Cesium渲染mvt数据,用的工具主要是 openlayer的 mvt 解析库 和 ol-mapbox-style 样式解析库, 需要自定义的就是 Cesium 中的 ImageryProvider 这个类,通过这个类来渲染自己的图层。
这里我贴出来自己的代码,因为我使用的是 4490 的坐标系,所以这里的 tillingScheme 以及分辨率都是在 4490 的基础上实现的。
1 |
import MVT from 'ol/format/MVT.js'; |
因为我才用的是mars3d的库,所以做了一些封装,主要就是处理获取到的 mapbox style 的 json 文件。
1 |
import * as mars3d from "mars3d"; |
1 |
/** |
在使用openlayer进行数据解析的时候,进行读取的时候实际上转换成的 feature,不是。
3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。
4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。
5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。
6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。