hongfaqiu / MVTImageryProvider

Mapbox vector tiles(pbf) visulization on cesium
https://mvt-provider.opendde.com/
MIT License
58 stars 19 forks source link

MVTImagerProvider的显示表达式更改后如何刷新 #8

Closed Wanghongrong closed 1 year ago

Wanghongrong commented 1 year ago

你好!我看你在 @kikitte 的问题回复中,写道,采用了全局的canvas,并在requestImage(),pickFeatures(),destroy()时,清理了未使用的缓存;但是,我在实际使用中,重复性的new MVTImagerProvider()时,当次数超过15次后,仍出现WARNING: Too many active WebGL contexts. Oldest context will be lost 的警告,并导致报错。 这里,我需要控制不同的图层的显隐,在同一个MVTImagerProvider中设置图层显隐以及选中高亮并不能实时进行更新(目前,在该版本的mapbox-gl分支中,未发现公布的刷新函数),因此,我是直接使用新建MVTImagerProvider来进行控制。

对于实现表达式更改或者选中高亮的实时渲染,你有更好的建议么?或者我应该如何规避WARNING: Too many active WebGL contexts. Oldest context will be lost 问题。

hongfaqiu commented 1 year ago

控制图层显隐、更改透明度等直接使用创建的ImageryLayer.show = bool即可,参考https://cesium.com/learn/cesiumjs/ref-doc/ImageryLayer.html?classFilter=ImageryLayer#show 另外15次的限制我这里并未遇到,我在自己的项目中重新渲染mvt也是通过移除->创建的形式实现,你可以看看demo,重载15次以上并不会报错

Wanghongrong commented 1 year ago

@hongfaqiu 我是将所有的MVT图层作为一个MVTImagerProvider,向Cesium中添加,如果采用ImageryLayer.show = bool的方式是整体的统一控制显隐。我不知道应该如何对其中的适用于Mapbox的某个layer图层进行单独控制。使用setLayoutProperty,及setPaintProperty均需要缩放图层,出发其更新。 15次限制,我根据你的代码,定义一个全局的canvas,传递进new BasicRenderer(canvas:args.......)时,传入。其余地方并未发现需要使用到canvas,不知道我的理解是否正确。我是直接 for(let i = 0 ; i < 20; i ++){ let provider= new MVTImagerProvider({.........}); cesiumViewer.imageryLayers.addImageryProvider(provider); } 的方式创建及测试的。

hongfaqiu commented 1 year ago

噢,你说的是mapbox中单个layer图层的概念,那只能通过改变style样式,移除ceisum的imageryLayer,重新添加新样式的图层来实现layer显隐了。 至于15次的限制,确实如你所说,但如果用我的这个npm包应该不需要自己构造canvas,不过我没有试过一次性添加这么多图层,这可能会在之前图层还没渲染完成,上下文还未销毁的时候就执行了后面图层的渲染,所以会导致这个报错的出现。