内容概览
1.计算当前地图范围extent
2.计算近似当前层级zoom
效果图如下:
实现思路如下:
-
监听地图变化事件
//监听地图移动完成事件 this.viewer.camera.moveEnd.addEventListener(this.onMoveendMap); //监听地图移动完成事件 onMoveendMap = () => { const me = this; //获取当前相机高度 let height = Math.ceil(me.viewer.camera.positionCartographic.height); let zoom = me.heightToZoom(height); let bounds = me.getCurrentExtent(); console.log('地图变化监听事件',zoom,bounds); };
-
获取当前地图范围
/* *获取当前三维范围 *extent,返回当前模式下地图范围[xmin,ymin,xmax,ymax] *extent,返回当前模式下地图范围{xmin,ymin,xmax,ymax} */ getCurrentExtent = () => { //获取当前三维地图范围 var Rectangle = this.viewer.camera.computeViewRectangle(); //地理坐标(弧度)转经纬度坐标 var extent=[ Rectangle.west / Math.PI * 180, Rectangle.south / Math.PI * 180, Rectangle.east / Math.PI * 180, Rectangle.north / Math.PI * 180]; return extent; }
-
根据camera高度近似计算当前层级,首先说明一个问题,就是cesium加载切片图层的时候,它会混合层级加载,不像二维地图,当前层级都一致,通过拉伸镜头对地球的距离,发现拉伸远近与与二维地图有以下的关系,根据这个关系,近似计算当前层级
/根据camera高度近似计算当前层级/
heightToZoom = (height) => { var A = 40487.57; var B = 0.00007096758; var C = 91610.74; var D = -40467.74; return Math.round(D+(A-D)/(1+Math.pow(height/C, B))); }
近似计算当前层级参考资料: