cesium加载超图iserver发布的map对其中子layer实现单独控制显隐的实现

  使用超图的iserver发布了多个map图层,每个map中包括多个layer子图层,然后我们尝试使用iClient For WebGL去加载这些图层,于是使用SuperMapImageryProvider去加载单独的map,需求是既能够单独控制map的显隐,也能够单独控制layer的显隐。

  单独控制map显隐的方法是加载完成后设置图层的show属性即可,立即生效。
  然而单独控制其中layer的显隐,试了试其中的setLayerStatusParameters方法,发现虽然能够实现,然而却不能立即生效,需要多次刷新地图才行,咨询了超图的技术支持,回复:在三维中,做不到单独控制layer显隐,只能控制map的显隐。

  纳尼,我这边都能实现显隐控制了,只是刷新显示不正常,你告诉我说显隐控制做不到?我心里实在难以接受,确实有点不甘心的感觉,看来不能过于相信超图的官方回复,我只相信心中的大神Patrick。

  经过一阵调试器和源码切换阅读分析操作,终于搞明白大致的原理,原来在调用setLayerStatusParameters方法时,超图的服务器做了一件事情:也就是生成临时图层:tempLayersSet,调用上面的方法会返回一串码,这就是唯一编码,也是超图给你的layerid,如果在二维中,使用iclient是有方法用这个layerid生成一个tile图层并动态加载的,但是三维中,没有,不好意思,我只能认为做三维的人偷懒了,没做这个功能,反正我看到的结果是可以做到的事情没有去做,造成用户体验相当不好(如果有谁发现存在这个方法希望能告诉我一下,这样就不用后面复杂的操作了,谢谢)。不过没关系,因为服务是开源的,可以直接用Cesium原生加载(还是Patrick大法好用啊)。

  大致方法是这样的:new一个SuperMapImageryProvider,再new一个UrlTemplateImageryProvider,添加后一个new出来的图层,前一个的图层作用就是调用setLayerStatusParameters控制子图层的显隐,而后一个图层的作用是请求png切片,经过setLayerStatusParameters控制子图层的显隐以后,后一个图层请求到的切片就是经过对应修改过的了。为什么不直接用SuperMapImageryProvider呢?原因有如下两点:
1.对于已经请求过的区域的瓦片,这个类是不会再次请求了,于是我们看不到修改后的情况;
2.这个类没有刷新图层的方法,也许内部有,但是在原型prototype中并没有,导致用户代码没法调用方法直接刷新一遍地图。

  而用UrlTemplateImageryProvider可以很好地解决这两个问题,对于第一个问题,这个类是无差别地无缓存地公平地粗暴地全部请求一遍,这点非常友好,给人一个公开透明的感觉,可以观察,也可以设置参数,非常方便灵活,对于第二个问题,虽然cesium原生没有公开,但是有方法叫做:_reload,没有参数,调用它直接就强行地让它刷新了一遍当前图层,不管有没有缓存。

  最后还有一点需要说明的就是,由于每次单独控制layer的显隐(也就是调用setLayerStatusParameters方法),超图都会生成一个新的临时图层,为了防止生成太多临时图层造成不好的影响,最好每次生成完以后都调用delete方法去删除对应map的旧的临时图层。这是有必要且安全的做法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在Cesium加载天地图的离线切片,你需要执行以下步骤: 1. 下载离线切片数据:首先,你需要从天地图官网或其他渠道下载离线切片数据。确保下载的数据是符合天地图切片规范的。 2. 将切片数据转换为Cesium可用的格式:Cesium使用的切片数据格式是TMS(Tiled Map Service)或WMTS(Web Map Tile Service)。如果你下载的切片数据不是这两种格式,你需要将其转换为相应格式。你可以使用GDAL或其他切片转换工具来完成这个步骤。 3. 创建Cesium Viewer对象:在Cesium中,你需要创建一个Viewer对象来显示地图。你可以使用以下代码创建一个基本的Viewer对象: ```javascript var viewer = new Cesium.Viewer('cesiumContainer'); ``` 这里的 'cesiumContainer' 是一个HTML元素的ID,它将用于显示Cesium地图。 4. 添加离线切片图层:接下来,你需要将离线切片图层添加到Cesium Viewer中。你可以使用以下代码将切片图层添加到Viewer中: ```javascript var offlineLayer = new Cesium.UrlTemplateImageryProvider({ url: 'path/to/your/tiles/{z}/{x}/{y}.png', }); viewer.imageryLayers.addImageryProvider(offlineLayer); ``` 这里的 'path/to/your/tiles/{z}/{x}/{y}.png' 是你离线切片数据的路径。确保将路径正确指向离线切片数据的存储位置。 5. 设置初始视图:最后,你可以使用以下代码设置地图的初始视图: ```javascript viewer.camera.setView({ destination : Cesium.Cartesian3.fromDegrees(lon, lat, height), orientation : { heading : Cesium.Math.toRadians(heading), pitch : Cesium.Math.toRadians(pitch), roll : Cesium.Math.toRadians(roll), } }); ``` 在上面的代码中,lon、lat和height是地图的经度、纬度和高度,heading、pitch和roll是地图的视角。 完成这些步骤后,你应该能够在Cesium加载并显示天地图的离线切片数据了。记得根据你的实际情况调整代码中的路径和初始视图参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值