Cesium切换视图模式时保持视图范围不变Keep view boundingbox when change scenemode in cesium.

本文介绍了一个Cesium应用技巧,通过自定义类KeepView,在2D与3D场景模式间切换时,保持当前视图的框选范围不变。此方法适用于需要连续观察特定地理区域的应用场景。

Keep view boundingbox when change scenemode in cesium.在cesium中通过按钮切换视图的时候,保证视图范围不变。

Only keep when 2D to 3D or 3D to 2D.

var KeepView = Class.extend({
    init: function (viewer) {
        this._viewer = gviewer;
        this._2dPC = {time:Date.parse(new Date())};
        this._3dPC = {time:Date.parse(new Date())};
        this._t = undefined;

        let _nodes = this._viewer.sceneModePicker._wrapper.children;
        let _btn2D,_btn3D;
        if(_nodes[1].attributes["data-bind"].value.indexOf("SCENE2D") > -1){
            _btn2D = _nodes[1];
            _btn3D = _nodes[2];
        }
        else{
            _btn2D = _nodes[2];
            _btn3D = _nodes[1];
        }
        (function(obj,btnArr){
            for (let index = 0; index < btnArr.length; index++) {
                let _btn = btnArr[index];
                _btn.onmouseenter=function(){
                    obj.update();
                };
                _btn.onclick=function(){
                    obj.keep();
                };
            }
        })(this,[_btn2D,_btn3D]);
    },
    update:function(){
        let _pc = this._viewer.camera.positionCartographic.clone();
        let _curSceneMode = this._viewer.scene.mode;
        if(_curSceneMode == Cesium.SceneMode.SCENE2D ){
            this._2dPC = {
                pc:_pc,
                time:Date.parse(new Date())
            }
        }else if(_curSceneMode == Cesium.SceneMode.SCENE3D ){
            this._3dPC = {
                pc:_pc,
                time:Date.parse(new Date())
            }
        }
    },
    keep:function(){
        let _correctPC = this._3dPC;
        let _waitMode = undefined;
        if(this._2dPC.time > this._3dPC.time){
            _waitMode = Cesium.SceneMode.SCENE3D;
            _correctPC = this._2dPC.pc;
            this._3dPC = this._2dPC;
        }else if(this._2dPC.time < this._3dPC.time){
            _waitMode = Cesium.SceneMode.SCENE2D;
            _correctPC = this._3dPC.pc;
            this._2dPC = this._3dPC;
        }
        else{
            return;
        }
        this._waitMode = _waitMode;
        (function(obj,correctPC){
            if(obj._t != undefined) clearInterval(obj._t)
            obj._t = setInterval(function(){
                if(_waitMode === obj._viewer.scene.mode){
                    var c3 = new Cesium.Cartesian3.fromRadians(correctPC.longitude,correctPC.latitude,correctPC.height);
                    obj._viewer.camera.setView({destination: c3});
                    clearInterval(obj._t);
                }
            }, 100);})(this,_correctPC);
    }
});

调用,how to use:

var viewer = new Cesium.Viewer('cesiumContainer');
var _keepView = new KeepView(viewer);

一点说明note:

Class详见https://johnresig.com/blog/simple-javascript-inheritance/

Cesium 中,`SceneMode.SCENE2D` 和 `SceneMode.SCENE3D` 下的经纬度坐标本质上是相同的,都是用于表示地球上特定位置的地理坐标系统。然而,由于这两种模式显示方式同,经纬度坐标在实际使用和表现上存在一些区别: #### 视觉表现 - **SceneMode.SCENE2D**:该模式呈现的是平面地球,经纬度坐标被映射到一个二维平面上。在这个平面上,地图通常采用某种投影方式(如 Web Mercator 投影)将地球的球面坐标转换为平面坐标。因此,在 2D 模式下,地图可能会出现一定程度的变形,尤其是在高纬度地区。例如,两极地区在 Web Mercator 投影中会被拉伸得非常大。 - **SceneMode.SCENE3D**:此模式展示的是球形的 3D 地球,经纬度坐标直接对应到地球球面上的位置。这种模式下没有投影变形的问题,因为它是直接在三维空间中表示地球,能够更真实地反映地球的形状和地理位置。 #### 坐标转换和计算 - **SceneMode.SCENE2D**:在 2D 模式下,由于使用了投影,经纬度坐标与屏幕坐标之间的转换相对简单,通常只需要根据投影算法进行计算。例如,在 Web Mercator 投影中,可以通过简单的数学公式将经纬度转换为平面坐标。此外,一些地理计算(如距离计算、面积计算等)也可以基于平面几何进行简化处理。 - **SceneMode.SCENE3D**:在 3D 模式下,坐标转换和计算需要考虑地球的球面性质。经纬度坐标与屏幕坐标之间的转换涉及到更复杂的三维几何计算,包括透视投影、相机位置和方向等因素。地理计算也需要使用球面几何公式,以确保计算结果的准确性。 #### 交互体验 - **SceneMode.SCENE2D**:在 2D 模式下,用户的交互主要是在平面地图上进行,如平移、缩放等操作。经纬度坐标的变化直观地反映在平面地图的移动和缩放过程中。 - **SceneMode.SCENE3D**:在 3D 模式下,用户可以进行更丰富的交互,如旋转地球、倾斜视角等。经纬度坐标的变化与三维空间中的相机运动相关,用户可以从同的角度观察地球表面的位置。 以下是一个简单的代码示例,展示如何在 Cesium切换同的场景模式: ```javascript // 创建 Cesium 查看器 const viewer = new Cesium.Viewer('cesiumContainer'); // 切换到 2D 模式 viewer.scene.mode = Cesium.SceneMode.SCENE2D; // 切换到 3D 模式 viewer.scene.mode = Cesium.SceneMode.SCENE3D; ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丷丩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值