Cesium 中实现影像贴 3Dtiles
Cesium
中我们经常使用的图层服务除了常见的遥感影像,还会包括一些矢量数据(如宗地范围、规划用地、道路信息等),这些图层服务通常经过 ArcGIS Server
/ GeoServer
之类的服务器渲染、切片供 Cesium
展示。
但在实际应用中会发现,这些图层服务的内容会被 3DTiles
遮盖(特别是渲染大片倾斜数据时),这个时候,如果我们想获取这些图层上面的信息,就必须将上层的 3DTiles
隐藏。如下图所示(没有合适的矢量图层,用 TileCoordinatesImageryProvider
代替)
影像有贴 3DTiles
选项吗?
在原生的 Cesium 中影像是无法设置贴 3DTiles 的。
Cesium 的影像为什么没有贴 3DTiles 选项
如果稍微翻一下源码,可以很容易的发现,影像和地形是交给 Globe
对象去管理的,而 3DTiles
、primitive
、entity
这类物体则是由 Scene
管理。
在 Viewer
对象中,Globe
和 Scene
是同级别的存在,所以影像和 3DTiles
根本不属于同一套管理体系,Cesium
自然无法提供影像贴 3DTiles
选项。
实现影像贴 3Dtiles
了解了为什么原生 Cesium
无法实现影像贴 3DTiles
的原因,那么解决的方向就明确了。
做法是在 Scene
中创建一个对象管理影像,使得影像可以和 3DTiles 由同一个对象管理。那么怎么做呢?
翻看源码,可以发现在 Globe
中影像和地形实际上是由 QuadtreePrimitive
对象来进行统一管理的。这是一个复杂的渲染四叉树的 Primitive
。详细渲染过程参考文章 最复杂的地球皮肤 影像与地形的渲染与下载过程
因此我们只需要将 QuadtreePrimitive
改写成普通 Primitive
的形式,保留影像操作的部分,并且将地形的部分删除,转而将影像的载体修改为 GroundPrimitive
即可。
简单的效果展示(没有合适的矢量图层,用 TileCoordinatesImageryProvider
代替)
实际效果展示
Cesium中实现影像贴3Dtiles